PAN312x_Driver.c 209 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444
  1. /**
  2. ******************************************************************************
  3. * 文件名 : PAN312x_Driver.c
  4. * 作者 : PAN312x RF Team
  5. * 版本 : V0.4.0
  6. * 时间 :
  7. * 文件描述:
  8. *******************************************************************************/
  9. #include <stdint.h>
  10. #include "PAN312x_Driver.h"
  11. #include "PAN312x_Hal.h"
  12. /*
  13. 注意,本文件的函数实现了从RF的驱动与MCU的兼容
  14. */
  15. volatile uint8_t vcol_cal_code;
  16. volatile uint8_t tp_auto_code;
  17. volatile uint8_t rc_code;
  18. uint8_t TcxoControlByGpio = 0;
  19. //-------------------------------------------------//
  20. //PAN312x power
  21. //--------------------------------------------------------------//
  22. #define PAN31XX_LDO_POWER_GET_VDD_PA_TRIM(v) (((v) >> 11) & 0x1f)
  23. #define PAN31XX_LDO_POWER_GET_PA_2ND_RAMP(v) (((v) >> 5) & 0x3f)
  24. #define PAN31XX_LDO_POWER_GET_PA_BIAS_TRIM(v) (((v) >> 1) & 0xf)
  25. #define PAN31XX_LDO_POWER_GET_LP_EN(v) ((v) & 1)
  26. #define PAN31XX_LDO_POWER_MAKE(VDD_PA_TRIM, PA_2ND_RAMP, PA_BIAS_TRIM, lp_en) \
  27. (((VDD_PA_TRIM) << 11) | ((PA_2ND_RAMP) << 5) | ((PA_BIAS_TRIM) << 1) | (lp_en))
  28. const uint16_t pan31xx_ldo_power_0603_420_445mhz[41] = {
  29. PAN31XX_LDO_POWER_MAKE(0x00, 0x0e, 0x0, 1), //-20dBm
  30. PAN31XX_LDO_POWER_MAKE(0x00, 0x11, 0x0, 1), //-19dBm
  31. PAN31XX_LDO_POWER_MAKE(0x00, 0x05, 0x1, 1), //-18dBm
  32. PAN31XX_LDO_POWER_MAKE(0x00, 0x06, 0x1, 1), //-17dBm
  33. PAN31XX_LDO_POWER_MAKE(0x1f, 0x17, 0x0, 1), //-16dBm
  34. PAN31XX_LDO_POWER_MAKE(0x1f, 0x01, 0x3, 1), //-15dBm
  35. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0x5, 1), //-14dBm
  36. PAN31XX_LDO_POWER_MAKE(0x0e, 0x00, 0x5, 1), //-13dBm
  37. PAN31XX_LDO_POWER_MAKE(0x01, 0x00, 0x8, 1), //-12dBm
  38. PAN31XX_LDO_POWER_MAKE(0x03, 0x00, 0x9, 1), //-11dBm
  39. PAN31XX_LDO_POWER_MAKE(0x03, 0x00, 0xc, 1), //-10dBm
  40. PAN31XX_LDO_POWER_MAKE(0x08, 0x00, 0xc, 1), //-9dBm
  41. PAN31XX_LDO_POWER_MAKE(0x10, 0x00, 0xc, 1), //-8dBm
  42. PAN31XX_LDO_POWER_MAKE(0x19, 0x00, 0xc, 1), //-7dBm
  43. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xe, 1), //-6dBm
  44. PAN31XX_LDO_POWER_MAKE(0x02, 0x01, 0xc, 1), //-5dBm
  45. PAN31XX_LDO_POWER_MAKE(0x07, 0x01, 0xc, 1), //-4dBm
  46. PAN31XX_LDO_POWER_MAKE(0x0d, 0x01, 0xc, 1), //-3dBm
  47. PAN31XX_LDO_POWER_MAKE(0x04, 0x02, 0xc, 1), //-2dBm
  48. PAN31XX_LDO_POWER_MAKE(0x08, 0x02, 0xc, 1), //-1dBm
  49. PAN31XX_LDO_POWER_MAKE(0x0f, 0x02, 0xc, 1), //0dBm
  50. PAN31XX_LDO_POWER_MAKE(0x17, 0x02, 0xc, 1), //1dBm
  51. PAN31XX_LDO_POWER_MAKE(0x1f, 0x02, 0xc, 1), //2dBm
  52. PAN31XX_LDO_POWER_MAKE(0x18, 0x03, 0xc, 1), //3dBm
  53. PAN31XX_LDO_POWER_MAKE(0x15, 0x04, 0xc, 1), //4dBm
  54. PAN31XX_LDO_POWER_MAKE(0x15, 0x05, 0xc, 1), //5dBm
  55. PAN31XX_LDO_POWER_MAKE(0x17, 0x06, 0xc, 1), //6dBm
  56. PAN31XX_LDO_POWER_MAKE(0x19, 0x07, 0xc, 1), //7dBm
  57. PAN31XX_LDO_POWER_MAKE(0x17, 0x0a, 0xc, 1), //8dBm
  58. PAN31XX_LDO_POWER_MAKE(0x1f, 0x0a, 0xc, 1), //9dBm
  59. PAN31XX_LDO_POWER_MAKE(0x1f, 0x0d, 0xc, 1), //10dBm
  60. PAN31XX_LDO_POWER_MAKE(0x1f, 0x12, 0xc, 1), //11dBm
  61. PAN31XX_LDO_POWER_MAKE(0x1f, 0x1c, 0xc, 1), //12dBm
  62. PAN31XX_LDO_POWER_MAKE(0x1f, 0x3f, 0xc, 1), //13dBm
  63. PAN31XX_LDO_POWER_MAKE(0x02, 0x3c, 0xc, 0), //14dBm
  64. PAN31XX_LDO_POWER_MAKE(0x05, 0x3c, 0xc, 0), //15dBm
  65. PAN31XX_LDO_POWER_MAKE(0x09, 0x3c, 0xc, 0), //16dBm
  66. PAN31XX_LDO_POWER_MAKE(0x0d, 0x3c, 0xc, 0), //17dBm
  67. PAN31XX_LDO_POWER_MAKE(0x12, 0x3c, 0xc, 0), //18dBm
  68. PAN31XX_LDO_POWER_MAKE(0x18, 0x3c, 0xc, 0), //19dBm
  69. PAN31XX_LDO_POWER_MAKE(0x1f, 0x3c, 0xc, 0) //20dBm
  70. };
  71. const uint16_t pan31xx_ldo_power_0603_470_510mhz[41] = {
  72. PAN31XX_LDO_POWER_MAKE(0x00, 0x0e, 0x0, 1), //-20dBm
  73. PAN31XX_LDO_POWER_MAKE(0x00, 0x11, 0x0, 1), //-19dBm
  74. PAN31XX_LDO_POWER_MAKE(0x00, 0x05, 0x1, 1), //-18dBm
  75. PAN31XX_LDO_POWER_MAKE(0x00, 0x06, 0x1, 1), //-17dBm
  76. PAN31XX_LDO_POWER_MAKE(0x1f, 0x17, 0x0, 1), //-16dBm
  77. PAN31XX_LDO_POWER_MAKE(0x1f, 0x01, 0x3, 1), //-15dBm
  78. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0x5, 1), //-14dBm
  79. PAN31XX_LDO_POWER_MAKE(0x0e, 0x00, 0x5, 1), //-13dBm
  80. PAN31XX_LDO_POWER_MAKE(0x01, 0x00, 0x8, 1), //-12dBm
  81. PAN31XX_LDO_POWER_MAKE(0x03, 0x00, 0x9, 1), //-11dBm
  82. PAN31XX_LDO_POWER_MAKE(0x03, 0x00, 0xc, 1), //-10dBm
  83. PAN31XX_LDO_POWER_MAKE(0x08, 0x00, 0xc, 1), //-9dBm
  84. PAN31XX_LDO_POWER_MAKE(0x10, 0x00, 0xc, 1), //-8dBm
  85. PAN31XX_LDO_POWER_MAKE(0x19, 0x00, 0xc, 1), //-7dBm
  86. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xe, 1), //-6dBm
  87. PAN31XX_LDO_POWER_MAKE(0x02, 0x01, 0xc, 1), //-5dBm
  88. PAN31XX_LDO_POWER_MAKE(0x07, 0x01, 0xc, 1), //-4dBm
  89. PAN31XX_LDO_POWER_MAKE(0x0d, 0x01, 0xc, 1), //-3dBm
  90. PAN31XX_LDO_POWER_MAKE(0x04, 0x02, 0xc, 1), //-2dBm
  91. PAN31XX_LDO_POWER_MAKE(0x08, 0x02, 0xc, 1), //-1dBm
  92. PAN31XX_LDO_POWER_MAKE(0x0f, 0x02, 0xc, 1), //0dBm
  93. PAN31XX_LDO_POWER_MAKE(0x17, 0x02, 0xc, 1), //1dBm
  94. PAN31XX_LDO_POWER_MAKE(0x1f, 0x02, 0xc, 1), //2dBm
  95. PAN31XX_LDO_POWER_MAKE(0x18, 0x03, 0xc, 1), //3dBm
  96. PAN31XX_LDO_POWER_MAKE(0x15, 0x04, 0xc, 1), //4dBm
  97. PAN31XX_LDO_POWER_MAKE(0x15, 0x05, 0xc, 1), //5dBm
  98. PAN31XX_LDO_POWER_MAKE(0x17, 0x06, 0xc, 1), //6dBm
  99. PAN31XX_LDO_POWER_MAKE(0x19, 0x07, 0xc, 1), //7dBm
  100. PAN31XX_LDO_POWER_MAKE(0x17, 0x0a, 0xc, 1), //8dBm
  101. PAN31XX_LDO_POWER_MAKE(0x1f, 0x0a, 0xc, 1), //9dBm
  102. PAN31XX_LDO_POWER_MAKE(0x1f, 0x0d, 0xc, 1), //10dBm
  103. PAN31XX_LDO_POWER_MAKE(0x1f, 0x12, 0xc, 1), //11dBm
  104. PAN31XX_LDO_POWER_MAKE(0x1f, 0x1c, 0xc, 1), //12dBm
  105. PAN31XX_LDO_POWER_MAKE(0x1f, 0x3f, 0xc, 1), //13dBm
  106. PAN31XX_LDO_POWER_MAKE(0x02, 0x3c, 0xc, 0), //14dBm
  107. PAN31XX_LDO_POWER_MAKE(0x05, 0x3c, 0xc, 0), //15dBm
  108. PAN31XX_LDO_POWER_MAKE(0x09, 0x3c, 0xc, 0), //16dBm
  109. PAN31XX_LDO_POWER_MAKE(0x0d, 0x3c, 0xc, 0), //17dBm
  110. PAN31XX_LDO_POWER_MAKE(0x12, 0x3c, 0xc, 0), //18dBm
  111. PAN31XX_LDO_POWER_MAKE(0x18, 0x3c, 0xc, 0), //19dBm
  112. PAN31XX_LDO_POWER_MAKE(0x1f, 0x3c, 0xc, 0) //20dBm
  113. };
  114. const uint16_t pan31xx_ldo_power_0603_860_870mhz[41] = {
  115. PAN31XX_LDO_POWER_MAKE(0x00, 0x0e, 0x0, 1), //-20dBm
  116. PAN31XX_LDO_POWER_MAKE(0x00, 0x11, 0x0, 1), //-19dBm
  117. PAN31XX_LDO_POWER_MAKE(0x00, 0x05, 0x1, 1), //-18dBm
  118. PAN31XX_LDO_POWER_MAKE(0x00, 0x06, 0x1, 1), //-17dBm
  119. PAN31XX_LDO_POWER_MAKE(0x1f, 0x17, 0x0, 1), //-16dBm
  120. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0x5, 1), //-15dBm
  121. PAN31XX_LDO_POWER_MAKE(0x0e, 0x00, 0x5, 1), //-14dBm
  122. PAN31XX_LDO_POWER_MAKE(0x01, 0x00, 0x8, 1), //-13dBm
  123. PAN31XX_LDO_POWER_MAKE(0x05, 0x00, 0x9, 1), //-12dBm
  124. PAN31XX_LDO_POWER_MAKE(0x05, 0x00, 0xc, 1), //-11dBm
  125. PAN31XX_LDO_POWER_MAKE(0x0b, 0x00, 0xc, 1), //-10dBm
  126. PAN31XX_LDO_POWER_MAKE(0x13, 0x00, 0xc, 1), //-9dBm
  127. PAN31XX_LDO_POWER_MAKE(0x1c, 0x00, 0xc, 1), //-8dBm
  128. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xe, 1), //-7dBm
  129. PAN31XX_LDO_POWER_MAKE(0x06, 0x01, 0xc, 1), //-6dBm
  130. PAN31XX_LDO_POWER_MAKE(0x0b, 0x01, 0xc, 1), //-5dBm
  131. PAN31XX_LDO_POWER_MAKE(0x10, 0x01, 0xc, 1), //-4dBm
  132. PAN31XX_LDO_POWER_MAKE(0x06, 0x02, 0xc, 1), //-3dBm
  133. PAN31XX_LDO_POWER_MAKE(0x0b, 0x02, 0xc, 1), //-2dBm
  134. PAN31XX_LDO_POWER_MAKE(0x12, 0x02, 0xc, 1), //-1dBm
  135. PAN31XX_LDO_POWER_MAKE(0x19, 0x02, 0xc, 1), //0dBm
  136. PAN31XX_LDO_POWER_MAKE(0x1f, 0x02, 0xf, 1), //1dBm
  137. PAN31XX_LDO_POWER_MAKE(0x1b, 0x03, 0xc, 1), //2dBm
  138. PAN31XX_LDO_POWER_MAKE(0x18, 0x04, 0xc, 1), //3dBm
  139. PAN31XX_LDO_POWER_MAKE(0x18, 0x05, 0xc, 1), //4dBm
  140. PAN31XX_LDO_POWER_MAKE(0x1a, 0x06, 0xc, 1), //5dBm
  141. PAN31XX_LDO_POWER_MAKE(0x1c, 0x07, 0xc, 1), //6dBm
  142. PAN31XX_LDO_POWER_MAKE(0x1a, 0x0a, 0xc, 1), //7dBm
  143. PAN31XX_LDO_POWER_MAKE(0x0a, 0x2c, 0xc, 1), //8dBm
  144. PAN31XX_LDO_POWER_MAKE(0x0d, 0x2c, 0xc, 1), //9dBm
  145. PAN31XX_LDO_POWER_MAKE(0x13, 0x2c, 0xc, 1), //10dBm
  146. PAN31XX_LDO_POWER_MAKE(0x18, 0x2c, 0xc, 1), //11dBm
  147. PAN31XX_LDO_POWER_MAKE(0x1c, 0x2c, 0xc, 1), //12dBm
  148. PAN31XX_LDO_POWER_MAKE(0x1f, 0x3f, 0xc, 1), //13dBm
  149. PAN31XX_LDO_POWER_MAKE(0x02, 0x3c, 0xc, 0), //14dBm
  150. PAN31XX_LDO_POWER_MAKE(0x05, 0x3c, 0xc, 0), //15dBm
  151. PAN31XX_LDO_POWER_MAKE(0x09, 0x3c, 0xc, 0), //16dBm
  152. PAN31XX_LDO_POWER_MAKE(0x0d, 0x3c, 0xc, 0), //17dBm
  153. PAN31XX_LDO_POWER_MAKE(0x12, 0x3c, 0xc, 0), //18dBm
  154. PAN31XX_LDO_POWER_MAKE(0x18, 0x3c, 0xc, 0), //19dBm
  155. PAN31XX_LDO_POWER_MAKE(0x1f, 0x3c, 0xc, 0) //20dBm
  156. };
  157. const uint16_t pan31xx_ldo_power_0603_902_928mhz[41] = {
  158. PAN31XX_LDO_POWER_MAKE(0x00, 0x06, 0x1, 1), //-20dBm
  159. PAN31XX_LDO_POWER_MAKE(0x00, 0x07, 0x1, 1), //-19dBm
  160. PAN31XX_LDO_POWER_MAKE(0x00, 0x08, 0x1, 1), //-18dBm
  161. PAN31XX_LDO_POWER_MAKE(0x00, 0x09, 0x1, 1), //-17dBm
  162. PAN31XX_LDO_POWER_MAKE(0x00, 0x0a, 0x1, 1), //-16dBm
  163. PAN31XX_LDO_POWER_MAKE(0x03, 0x04, 0x2, 1), //-15dBm
  164. PAN31XX_LDO_POWER_MAKE(0x03, 0x05, 0x2, 1), //-14dBm
  165. PAN31XX_LDO_POWER_MAKE(0x04, 0x00, 0x8, 1), //-13dBm
  166. PAN31XX_LDO_POWER_MAKE(0x08, 0x00, 0x9, 1), //-12dBm
  167. PAN31XX_LDO_POWER_MAKE(0x05, 0x00, 0xc, 1), //-11dBm
  168. PAN31XX_LDO_POWER_MAKE(0x0b, 0x00, 0xc, 1), //-10dBm
  169. PAN31XX_LDO_POWER_MAKE(0x13, 0x00, 0xc, 1), //-9dBm
  170. PAN31XX_LDO_POWER_MAKE(0x1c, 0x00, 0xc, 1), //-8dBm
  171. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xe, 1), //-7dBm
  172. PAN31XX_LDO_POWER_MAKE(0x06, 0x01, 0xc, 1), //-6dBm
  173. PAN31XX_LDO_POWER_MAKE(0x0b, 0x01, 0xc, 1), //-5dBm
  174. PAN31XX_LDO_POWER_MAKE(0x10, 0x01, 0xc, 1), //-4dBm
  175. PAN31XX_LDO_POWER_MAKE(0x06, 0x02, 0xc, 1), //-3dBm
  176. PAN31XX_LDO_POWER_MAKE(0x0b, 0x02, 0xc, 1), //-2dBm
  177. PAN31XX_LDO_POWER_MAKE(0x12, 0x02, 0xc, 1), //-1dBm
  178. PAN31XX_LDO_POWER_MAKE(0x19, 0x02, 0xc, 1), //0dBm
  179. PAN31XX_LDO_POWER_MAKE(0x1f, 0x02, 0xf, 1), //1dBm
  180. PAN31XX_LDO_POWER_MAKE(0x1b, 0x03, 0xc, 1), //2dBm
  181. PAN31XX_LDO_POWER_MAKE(0x18, 0x04, 0xc, 1), //3dBm
  182. PAN31XX_LDO_POWER_MAKE(0x18, 0x05, 0xc, 1), //4dBm
  183. PAN31XX_LDO_POWER_MAKE(0x1a, 0x06, 0xc, 1), //5dBm
  184. PAN31XX_LDO_POWER_MAKE(0x1c, 0x07, 0xc, 1), //6dBm
  185. PAN31XX_LDO_POWER_MAKE(0x1a, 0x0a, 0xc, 1), //7dBm
  186. PAN31XX_LDO_POWER_MAKE(0x07, 0x2c, 0xc, 1), //8dBm
  187. PAN31XX_LDO_POWER_MAKE(0x0a, 0x2c, 0xc, 1), //9dBm
  188. PAN31XX_LDO_POWER_MAKE(0x10, 0x2c, 0xc, 1), //10dBm
  189. PAN31XX_LDO_POWER_MAKE(0x17, 0x2c, 0xc, 1), //11dBm
  190. PAN31XX_LDO_POWER_MAKE(0x1b, 0x2c, 0xc, 1), //12dBm
  191. PAN31XX_LDO_POWER_MAKE(0x1f, 0x3f, 0xc, 1), //13dBm
  192. PAN31XX_LDO_POWER_MAKE(0x02, 0x3c, 0xc, 0), //14dBm
  193. PAN31XX_LDO_POWER_MAKE(0x05, 0x3c, 0xc, 0), //15dBm
  194. PAN31XX_LDO_POWER_MAKE(0x09, 0x3c, 0xc, 0), //16dBm
  195. PAN31XX_LDO_POWER_MAKE(0x0d, 0x3c, 0xc, 0), //17dBm
  196. PAN31XX_LDO_POWER_MAKE(0x12, 0x3c, 0xc, 0), //18dBm
  197. PAN31XX_LDO_POWER_MAKE(0x18, 0x3c, 0xc, 0), //19dBm
  198. PAN31XX_LDO_POWER_MAKE(0x1f, 0x3c, 0xc, 0) //20dBm
  199. };
  200. const uint16_t pan31xx_ldo_power_0402_420_445mhz[41] = {
  201. PAN31XX_LDO_POWER_MAKE(0x00, 0x05, 0x1, 1), //-20dBm
  202. PAN31XX_LDO_POWER_MAKE(0x00, 0x13, 0x0, 1), //-19dBm
  203. PAN31XX_LDO_POWER_MAKE(0x18, 0x06, 0x1, 1), //-18dBm
  204. PAN31XX_LDO_POWER_MAKE(0x18, 0x07, 0x1, 1), //-17dBm
  205. PAN31XX_LDO_POWER_MAKE(0x18, 0x08, 0x1, 1), //-16dBm
  206. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0x8, 1), //-15dBm
  207. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0xb, 1), //-14dBm
  208. PAN31XX_LDO_POWER_MAKE(0x04, 0x00, 0xc, 1), //-13dBm
  209. PAN31XX_LDO_POWER_MAKE(0x0a, 0x00, 0xc, 1), //-12dBm
  210. PAN31XX_LDO_POWER_MAKE(0x12, 0x00, 0xc, 1), //-11dBm
  211. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xc, 1), //-10dBm
  212. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xf, 1), //-9dBm
  213. PAN31XX_LDO_POWER_MAKE(0x01, 0x01, 0xc, 1), //-8dBm
  214. PAN31XX_LDO_POWER_MAKE(0x07, 0x01, 0xc, 1), //-7dBm
  215. PAN31XX_LDO_POWER_MAKE(0x0e, 0x01, 0xc, 1), //-6dBm
  216. PAN31XX_LDO_POWER_MAKE(0x01, 0x02, 0xc, 1), //-5dBm
  217. PAN31XX_LDO_POWER_MAKE(0x07, 0x02, 0xc, 1), //-4dBm
  218. PAN31XX_LDO_POWER_MAKE(0x01, 0x03, 0xc, 1), //-3dBm
  219. PAN31XX_LDO_POWER_MAKE(0x06, 0x03, 0xc, 1), //-2dBm
  220. PAN31XX_LDO_POWER_MAKE(0x03, 0x04, 0xc, 1), //-1dBm
  221. PAN31XX_LDO_POWER_MAKE(0x03, 0x05, 0xc, 1), //0dBm
  222. PAN31XX_LDO_POWER_MAKE(0x00, 0x07, 0xc, 1), //1dBm
  223. PAN31XX_LDO_POWER_MAKE(0x06, 0x07, 0xc, 1), //2dBm
  224. PAN31XX_LDO_POWER_MAKE(0x0a, 0x07, 0xc, 1), //3dBm
  225. PAN31XX_LDO_POWER_MAKE(0x11, 0x07, 0xc, 1), //4dBm
  226. PAN31XX_LDO_POWER_MAKE(0x17, 0x07, 0xc, 1), //5dBm
  227. PAN31XX_LDO_POWER_MAKE(0x1f, 0x07, 0xc, 1), //6dBm
  228. PAN31XX_LDO_POWER_MAKE(0x1f, 0x09, 0xc, 1), //7dBm
  229. PAN31XX_LDO_POWER_MAKE(0x1f, 0x0b, 0xc, 1), //8dBm
  230. PAN31XX_LDO_POWER_MAKE(0x1f, 0x0d, 0xc, 1), //9dBm
  231. PAN31XX_LDO_POWER_MAKE(0x1f, 0x11, 0xc, 1), //10dBm
  232. PAN31XX_LDO_POWER_MAKE(0x1f, 0x16, 0xc, 1), //11dBm
  233. PAN31XX_LDO_POWER_MAKE(0x1f, 0x1f, 0xc, 1), //12dBm
  234. PAN31XX_LDO_POWER_MAKE(0x1f, 0x30, 0xc, 1), //13dBm
  235. PAN31XX_LDO_POWER_MAKE(0x1a, 0x0f, 0xc, 0), //14dBm
  236. PAN31XX_LDO_POWER_MAKE(0x1a, 0x12, 0xc, 0), //15dBm
  237. PAN31XX_LDO_POWER_MAKE(0x1a, 0x15, 0xc, 0), //16dBm
  238. PAN31XX_LDO_POWER_MAKE(0x1a, 0x1a, 0xc, 0), //17dBm
  239. PAN31XX_LDO_POWER_MAKE(0x1a, 0x20, 0xc, 0), //18dBm
  240. PAN31XX_LDO_POWER_MAKE(0x1a, 0x2b, 0xc, 0), //19dBm
  241. PAN31XX_LDO_POWER_MAKE(0x1a, 0x3f, 0xc, 0) //20dBm
  242. };
  243. const uint16_t pan31xx_ldo_power_0402_470_510mhz[41] = {
  244. PAN31XX_LDO_POWER_MAKE(0x00, 0x05, 0x1, 1), //-20dBm
  245. PAN31XX_LDO_POWER_MAKE(0x00, 0x13, 0x0, 1), //-19dBm
  246. PAN31XX_LDO_POWER_MAKE(0x18, 0x06, 0x1, 1), //-18dBm
  247. PAN31XX_LDO_POWER_MAKE(0x18, 0x07, 0x1, 1), //-17dBm
  248. PAN31XX_LDO_POWER_MAKE(0x18, 0x08, 0x1, 1), //-16dBm
  249. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0x8, 1), //-15dBm
  250. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0xb, 1), //-14dBm
  251. PAN31XX_LDO_POWER_MAKE(0x04, 0x00, 0xc, 1), //-13dBm
  252. PAN31XX_LDO_POWER_MAKE(0x0a, 0x00, 0xc, 1), //-12dBm
  253. PAN31XX_LDO_POWER_MAKE(0x12, 0x00, 0xc, 1), //-11dBm
  254. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xc, 1), //-10dBm
  255. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xf, 1), //-9dBm
  256. PAN31XX_LDO_POWER_MAKE(0x01, 0x01, 0xc, 1), //-8dBm
  257. PAN31XX_LDO_POWER_MAKE(0x07, 0x01, 0xc, 1), //-7dBm
  258. PAN31XX_LDO_POWER_MAKE(0x0e, 0x01, 0xc, 1), //-6dBm
  259. PAN31XX_LDO_POWER_MAKE(0x01, 0x02, 0xc, 1), //-5dBm
  260. PAN31XX_LDO_POWER_MAKE(0x07, 0x02, 0xc, 1), //-4dBm
  261. PAN31XX_LDO_POWER_MAKE(0x01, 0x03, 0xc, 1), //-3dBm
  262. PAN31XX_LDO_POWER_MAKE(0x06, 0x03, 0xc, 1), //-2dBm
  263. PAN31XX_LDO_POWER_MAKE(0x03, 0x04, 0xc, 1), //-1dBm
  264. PAN31XX_LDO_POWER_MAKE(0x03, 0x05, 0xc, 1), //0dBm
  265. PAN31XX_LDO_POWER_MAKE(0x00, 0x07, 0xc, 1), //1dBm
  266. PAN31XX_LDO_POWER_MAKE(0x06, 0x07, 0xc, 1), //2dBm
  267. PAN31XX_LDO_POWER_MAKE(0x0a, 0x07, 0xc, 1), //3dBm
  268. PAN31XX_LDO_POWER_MAKE(0x11, 0x07, 0xc, 1), //4dBm
  269. PAN31XX_LDO_POWER_MAKE(0x17, 0x07, 0xc, 1), //5dBm
  270. PAN31XX_LDO_POWER_MAKE(0x1f, 0x07, 0xc, 1), //6dBm
  271. PAN31XX_LDO_POWER_MAKE(0x1f, 0x09, 0xc, 1), //7dBm
  272. PAN31XX_LDO_POWER_MAKE(0x1f, 0x0b, 0xc, 1), //8dBm
  273. PAN31XX_LDO_POWER_MAKE(0x1f, 0x0d, 0xc, 1), //9dBm
  274. PAN31XX_LDO_POWER_MAKE(0x1f, 0x11, 0xc, 1), //10dBm
  275. PAN31XX_LDO_POWER_MAKE(0x1f, 0x16, 0xc, 1), //11dBm
  276. PAN31XX_LDO_POWER_MAKE(0x1f, 0x1f, 0xc, 1), //12dBm
  277. PAN31XX_LDO_POWER_MAKE(0x1f, 0x30, 0xc, 1), //13dBm
  278. PAN31XX_LDO_POWER_MAKE(0x1a, 0x0f, 0xc, 0), //14dBm
  279. PAN31XX_LDO_POWER_MAKE(0x1a, 0x12, 0xc, 0), //15dBm
  280. PAN31XX_LDO_POWER_MAKE(0x1a, 0x15, 0xc, 0), //16dBm
  281. PAN31XX_LDO_POWER_MAKE(0x1a, 0x1a, 0xc, 0), //17dBm
  282. PAN31XX_LDO_POWER_MAKE(0x1a, 0x20, 0xc, 0), //18dBm
  283. PAN31XX_LDO_POWER_MAKE(0x1a, 0x2b, 0xc, 0), //19dBm
  284. PAN31XX_LDO_POWER_MAKE(0x1a, 0x3f, 0xc, 0) //20dBm
  285. };
  286. const uint16_t pan31xx_ldo_power_0402_860_870mhz[41] = {
  287. PAN31XX_LDO_POWER_MAKE(0x00, 0x05, 0x1, 1), //-20dBm
  288. PAN31XX_LDO_POWER_MAKE(0x00, 0x13, 0x0, 1), //-19dBm
  289. PAN31XX_LDO_POWER_MAKE(0x18, 0x06, 0x1, 1), //-18dBm
  290. PAN31XX_LDO_POWER_MAKE(0x18, 0x07, 0x1, 1), //-17dBm
  291. PAN31XX_LDO_POWER_MAKE(0x18, 0x08, 0x1, 1), //-16dBm
  292. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0x8, 1), //-15dBm
  293. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0xb, 1), //-14dBm
  294. PAN31XX_LDO_POWER_MAKE(0x04, 0x00, 0xc, 1), //-13dBm
  295. PAN31XX_LDO_POWER_MAKE(0x0a, 0x00, 0xc, 1), //-12dBm
  296. PAN31XX_LDO_POWER_MAKE(0x12, 0x00, 0xc, 1), //-11dBm
  297. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xc, 1), //-10dBm
  298. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xf, 1), //-9dBm
  299. PAN31XX_LDO_POWER_MAKE(0x01, 0x01, 0xc, 1), //-8dBm
  300. PAN31XX_LDO_POWER_MAKE(0x07, 0x01, 0xc, 1), //-7dBm
  301. PAN31XX_LDO_POWER_MAKE(0x0e, 0x01, 0xc, 1), //-6dBm
  302. PAN31XX_LDO_POWER_MAKE(0x01, 0x02, 0xc, 1), //-5dBm
  303. PAN31XX_LDO_POWER_MAKE(0x07, 0x02, 0xc, 1), //-4dBm
  304. PAN31XX_LDO_POWER_MAKE(0x01, 0x03, 0xc, 1), //-3dBm
  305. PAN31XX_LDO_POWER_MAKE(0x06, 0x03, 0xc, 1), //-2dBm
  306. PAN31XX_LDO_POWER_MAKE(0x03, 0x04, 0xc, 1), //-1dBm
  307. PAN31XX_LDO_POWER_MAKE(0x03, 0x05, 0xc, 1), //0dBm
  308. PAN31XX_LDO_POWER_MAKE(0x00, 0x07, 0xc, 1), //1dBm
  309. PAN31XX_LDO_POWER_MAKE(0x06, 0x07, 0xc, 1), //2dBm
  310. PAN31XX_LDO_POWER_MAKE(0x0a, 0x07, 0xc, 1), //3dBm
  311. PAN31XX_LDO_POWER_MAKE(0x11, 0x07, 0xc, 1), //4dBm
  312. PAN31XX_LDO_POWER_MAKE(0x17, 0x07, 0xc, 1), //5dBm
  313. PAN31XX_LDO_POWER_MAKE(0x1f, 0x07, 0xc, 1), //6dBm
  314. PAN31XX_LDO_POWER_MAKE(0x1f, 0x09, 0xc, 1), //7dBm
  315. PAN31XX_LDO_POWER_MAKE(0x07, 0x2c, 0xc, 1), //8dBm
  316. PAN31XX_LDO_POWER_MAKE(0x0b, 0x2c, 0xc, 1), //9dBm
  317. PAN31XX_LDO_POWER_MAKE(0x10, 0x2c, 0xc, 1), //10dBm
  318. PAN31XX_LDO_POWER_MAKE(0x15, 0x2c, 0xc, 1), //11dBm
  319. PAN31XX_LDO_POWER_MAKE(0x1a, 0x2c, 0xc, 1), //12dBm
  320. PAN31XX_LDO_POWER_MAKE(0x1b, 0x3f, 0xc, 1), //13dBm
  321. PAN31XX_LDO_POWER_MAKE(0x01, 0x3c, 0xc, 0), //14dBm
  322. PAN31XX_LDO_POWER_MAKE(0x04, 0x3c, 0xc, 0), //15dBm
  323. PAN31XX_LDO_POWER_MAKE(0x08, 0x3c, 0xc, 0), //16dBm
  324. PAN31XX_LDO_POWER_MAKE(0x0c, 0x3c, 0xc, 0), //17dBm
  325. PAN31XX_LDO_POWER_MAKE(0x11, 0x3c, 0xc, 0), //18dBm
  326. PAN31XX_LDO_POWER_MAKE(0x16, 0x3c, 0xc, 0), //19dBm
  327. PAN31XX_LDO_POWER_MAKE(0x1c, 0x3c, 0xc, 0) //20dBm
  328. };
  329. const uint16_t pan31xx_ldo_power_0402_902_928mhz[41] = {
  330. PAN31XX_LDO_POWER_MAKE(0x00, 0x05, 0x1, 1), //-20dBm
  331. PAN31XX_LDO_POWER_MAKE(0x00, 0x13, 0x0, 1), //-19dBm
  332. PAN31XX_LDO_POWER_MAKE(0x18, 0x06, 0x1, 1), //-18dBm
  333. PAN31XX_LDO_POWER_MAKE(0x18, 0x07, 0x1, 1), //-17dBm
  334. PAN31XX_LDO_POWER_MAKE(0x18, 0x08, 0x1, 1), //-16dBm
  335. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0x8, 1), //-15dBm
  336. PAN31XX_LDO_POWER_MAKE(0x00, 0x00, 0xb, 1), //-14dBm
  337. PAN31XX_LDO_POWER_MAKE(0x04, 0x00, 0xc, 1), //-13dBm
  338. PAN31XX_LDO_POWER_MAKE(0x0a, 0x00, 0xc, 1), //-12dBm
  339. PAN31XX_LDO_POWER_MAKE(0x12, 0x00, 0xc, 1), //-11dBm
  340. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xc, 1), //-10dBm
  341. PAN31XX_LDO_POWER_MAKE(0x1f, 0x00, 0xf, 1), //-9dBm
  342. PAN31XX_LDO_POWER_MAKE(0x01, 0x01, 0xc, 1), //-8dBm
  343. PAN31XX_LDO_POWER_MAKE(0x07, 0x01, 0xc, 1), //-7dBm
  344. PAN31XX_LDO_POWER_MAKE(0x0e, 0x01, 0xc, 1), //-6dBm
  345. PAN31XX_LDO_POWER_MAKE(0x01, 0x02, 0xc, 1), //-5dBm
  346. PAN31XX_LDO_POWER_MAKE(0x07, 0x02, 0xc, 1), //-4dBm
  347. PAN31XX_LDO_POWER_MAKE(0x01, 0x03, 0xc, 1), //-3dBm
  348. PAN31XX_LDO_POWER_MAKE(0x06, 0x03, 0xc, 1), //-2dBm
  349. PAN31XX_LDO_POWER_MAKE(0x03, 0x04, 0xc, 1), //-1dBm
  350. PAN31XX_LDO_POWER_MAKE(0x03, 0x05, 0xc, 1), //0dBm
  351. PAN31XX_LDO_POWER_MAKE(0x00, 0x07, 0xc, 1), //1dBm
  352. PAN31XX_LDO_POWER_MAKE(0x06, 0x07, 0xc, 1), //2dBm
  353. PAN31XX_LDO_POWER_MAKE(0x0a, 0x07, 0xc, 1), //3dBm
  354. PAN31XX_LDO_POWER_MAKE(0x11, 0x07, 0xc, 1), //4dBm
  355. PAN31XX_LDO_POWER_MAKE(0x17, 0x07, 0xc, 1), //5dBm
  356. PAN31XX_LDO_POWER_MAKE(0x1f, 0x07, 0xc, 1), //6dBm
  357. PAN31XX_LDO_POWER_MAKE(0x1f, 0x09, 0xc, 1), //7dBm
  358. PAN31XX_LDO_POWER_MAKE(0x07, 0x2c, 0xc, 1), //8dBm
  359. PAN31XX_LDO_POWER_MAKE(0x0b, 0x2c, 0xc, 1), //9dBm
  360. PAN31XX_LDO_POWER_MAKE(0x10, 0x2c, 0xc, 1), //10dBm
  361. PAN31XX_LDO_POWER_MAKE(0x15, 0x2c, 0xc, 1), //11dBm
  362. PAN31XX_LDO_POWER_MAKE(0x1a, 0x2c, 0xc, 1), //12dBm
  363. PAN31XX_LDO_POWER_MAKE(0x1b, 0x3f, 0xc, 1), //13dBm
  364. PAN31XX_LDO_POWER_MAKE(0x01, 0x3c, 0xc, 0), //14dBm
  365. PAN31XX_LDO_POWER_MAKE(0x04, 0x3c, 0xc, 0), //15dBm
  366. PAN31XX_LDO_POWER_MAKE(0x08, 0x3c, 0xc, 0), //16dBm
  367. PAN31XX_LDO_POWER_MAKE(0x0c, 0x3c, 0xc, 0), //17dBm
  368. PAN31XX_LDO_POWER_MAKE(0x11, 0x3c, 0xc, 0), //18dBm
  369. PAN31XX_LDO_POWER_MAKE(0x16, 0x3c, 0xc, 0), //19dBm
  370. PAN31XX_LDO_POWER_MAKE(0x1c, 0x3c, 0xc, 0) //20dBm
  371. };
  372. #define PAN31XX_DCDC_POWER_GET_VDD_PA_TRIM(v) (((v) >> 11) & 0x1f)
  373. #define PAN31XX_DCDC_POWER_GET_PA_2ND_RAMP(v) (((v) >> 5) & 0x3f)
  374. #define PAN31XX_DCDC_POWER_GET_PA_BIAS_TRIM(v) (((v) >> 1) & 0xf)
  375. #define PAN31XX_DCDC_POWER_GET_LP_EN(v) ((v) & 1)
  376. #define PAN31XX_DCDC_POWER_GET_DCDC_EN(v) (((v) >> 21) & 1)
  377. #define PAN31XX_DCDC_POWER_GET_DCDC_VOUT_TRIM(v) (((v) >> 16) & 0x1f)
  378. #define PAN31XX_DCDC_POWER_MAKE(VDD_PA_TRIM, PA_2ND_RAMP, PA_BIAS_TRIM, lp_en, DCDC_EN, DCDC_VOUT_TRIM) \
  379. (((VDD_PA_TRIM) << 11) | ((PA_2ND_RAMP) << 5) | ((PA_BIAS_TRIM) << 1) | (lp_en) | ((DCDC_EN) << 21) | ((DCDC_VOUT_TRIM) << 16))
  380. const uint32_t pan31xx_dcdc_power_0603_420_445mhz[34] = {
  381. PAN31XX_DCDC_POWER_MAKE(0x00, 0x0e, 0x0, 1, 1, 0x0d), //-20dBm
  382. PAN31XX_DCDC_POWER_MAKE(0x00, 0x11, 0x0, 1, 1, 0x0d), //-19dBm
  383. PAN31XX_DCDC_POWER_MAKE(0x00, 0x05, 0x1, 1, 1, 0x0d), //-18dBm
  384. PAN31XX_DCDC_POWER_MAKE(0x00, 0x06, 0x1, 1, 1, 0x0d), //-17dBm
  385. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x17, 0x0, 1, 1, 0x0d), //-16dBm
  386. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x01, 0x3, 1, 1, 0x0d), //-15dBm
  387. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0x5, 1, 1, 0x0d), //-14dBm
  388. PAN31XX_DCDC_POWER_MAKE(0x0e, 0x00, 0x5, 1, 1, 0x0d), //-13dBm
  389. PAN31XX_DCDC_POWER_MAKE(0x01, 0x00, 0x8, 1, 1, 0x0d), //-12dBm
  390. PAN31XX_DCDC_POWER_MAKE(0x03, 0x00, 0x9, 1, 1, 0x0d), //-11dBm
  391. PAN31XX_DCDC_POWER_MAKE(0x03, 0x00, 0xc, 1, 1, 0x0d), //-10dBm
  392. PAN31XX_DCDC_POWER_MAKE(0x08, 0x00, 0xc, 1, 1, 0x0d), //-9dBm
  393. PAN31XX_DCDC_POWER_MAKE(0x10, 0x00, 0xc, 1, 1, 0x0d), //-8dBm
  394. PAN31XX_DCDC_POWER_MAKE(0x19, 0x00, 0xc, 1, 1, 0x0d), //-7dBm
  395. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xe, 1, 1, 0x0d), //-6dBm
  396. PAN31XX_DCDC_POWER_MAKE(0x02, 0x01, 0xc, 1, 1, 0x0d), //-5dBm
  397. PAN31XX_DCDC_POWER_MAKE(0x07, 0x01, 0xc, 1, 1, 0x0d), //-4dBm
  398. PAN31XX_DCDC_POWER_MAKE(0x0d, 0x01, 0xc, 1, 1, 0x0d), //-3dBm
  399. PAN31XX_DCDC_POWER_MAKE(0x04, 0x02, 0xc, 1, 1, 0x0d), //-2dBm
  400. PAN31XX_DCDC_POWER_MAKE(0x08, 0x02, 0xc, 1, 1, 0x0d), //-1dBm
  401. PAN31XX_DCDC_POWER_MAKE(0x0f, 0x02, 0xc, 1, 1, 0x0d), //0dBm
  402. PAN31XX_DCDC_POWER_MAKE(0x17, 0x02, 0xc, 1, 1, 0x0d), //1dBm
  403. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x02, 0xc, 1, 1, 0x0d), //2dBm
  404. PAN31XX_DCDC_POWER_MAKE(0x18, 0x03, 0xc, 1, 1, 0x0d), //3dBm
  405. PAN31XX_DCDC_POWER_MAKE(0x15, 0x04, 0xc, 1, 1, 0x0d), //4dBm
  406. PAN31XX_DCDC_POWER_MAKE(0x15, 0x05, 0xc, 1, 1, 0x0d), //5dBm
  407. PAN31XX_DCDC_POWER_MAKE(0x17, 0x06, 0xc, 1, 1, 0x0d), //6dBm
  408. PAN31XX_DCDC_POWER_MAKE(0x19, 0x07, 0xc, 1, 1, 0x0d), //7dBm
  409. PAN31XX_DCDC_POWER_MAKE(0x17, 0x0a, 0xc, 1, 1, 0x0d), //8dBm
  410. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x0a, 0xc, 1, 1, 0x0d), //9dBm
  411. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x0d, 0xc, 1, 1, 0x0d), //10dBm
  412. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x12, 0xc, 1, 1, 0x0d), //11dBm
  413. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x1c, 0xc, 1, 1, 0x0d), //12dBm
  414. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x3f, 0xc, 1, 1, 0x13) //13dBm
  415. };
  416. const uint32_t pan31xx_dcdc_power_0603_470_510mhz[34] = {
  417. PAN31XX_DCDC_POWER_MAKE(0x00, 0x0e, 0x0, 1, 1, 0x0f), //-20dBm
  418. PAN31XX_DCDC_POWER_MAKE(0x00, 0x11, 0x0, 1, 1, 0x0f), //-19dBm
  419. PAN31XX_DCDC_POWER_MAKE(0x00, 0x05, 0x1, 1, 1, 0x0f), //-18dBm
  420. PAN31XX_DCDC_POWER_MAKE(0x00, 0x06, 0x1, 1, 1, 0x0f), //-17dBm
  421. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x17, 0x0, 1, 1, 0x0f), //-16dBm
  422. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x01, 0x3, 1, 1, 0x0f), //-15dBm
  423. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0x5, 1, 1, 0x0f), //-14dBm
  424. PAN31XX_DCDC_POWER_MAKE(0x0e, 0x00, 0x5, 1, 1, 0x0f), //-13dBm
  425. PAN31XX_DCDC_POWER_MAKE(0x01, 0x00, 0x8, 1, 1, 0x0f), //-12dBm
  426. PAN31XX_DCDC_POWER_MAKE(0x03, 0x00, 0x9, 1, 1, 0x0f), //-11dBm
  427. PAN31XX_DCDC_POWER_MAKE(0x03, 0x00, 0xc, 1, 1, 0x0f), //-10dBm
  428. PAN31XX_DCDC_POWER_MAKE(0x08, 0x00, 0xc, 1, 1, 0x0f), //-9dBm
  429. PAN31XX_DCDC_POWER_MAKE(0x10, 0x00, 0xc, 1, 1, 0x0f), //-8dBm
  430. PAN31XX_DCDC_POWER_MAKE(0x19, 0x00, 0xc, 1, 1, 0x0f), //-7dBm
  431. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xe, 1, 1, 0x0f), //-6dBm
  432. PAN31XX_DCDC_POWER_MAKE(0x02, 0x01, 0xc, 1, 1, 0x0f), //-5dBm
  433. PAN31XX_DCDC_POWER_MAKE(0x07, 0x01, 0xc, 1, 1, 0x0f), //-4dBm
  434. PAN31XX_DCDC_POWER_MAKE(0x0d, 0x01, 0xc, 1, 1, 0x0f), //-3dBm
  435. PAN31XX_DCDC_POWER_MAKE(0x04, 0x02, 0xc, 1, 1, 0x0f), //-2dBm
  436. PAN31XX_DCDC_POWER_MAKE(0x08, 0x02, 0xc, 1, 1, 0x0f), //-1dBm
  437. PAN31XX_DCDC_POWER_MAKE(0x0f, 0x02, 0xc, 1, 1, 0x0f), //0dBm
  438. PAN31XX_DCDC_POWER_MAKE(0x17, 0x02, 0xc, 1, 1, 0x0f), //1dBm
  439. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x02, 0xc, 1, 1, 0x0f), //2dBm
  440. PAN31XX_DCDC_POWER_MAKE(0x18, 0x03, 0xc, 1, 1, 0x0f), //3dBm
  441. PAN31XX_DCDC_POWER_MAKE(0x15, 0x04, 0xc, 1, 1, 0x0f), //4dBm
  442. PAN31XX_DCDC_POWER_MAKE(0x15, 0x05, 0xc, 1, 1, 0x0f), //5dBm
  443. PAN31XX_DCDC_POWER_MAKE(0x17, 0x06, 0xc, 1, 1, 0x0f), //6dBm
  444. PAN31XX_DCDC_POWER_MAKE(0x19, 0x07, 0xc, 1, 1, 0x0f), //7dBm
  445. PAN31XX_DCDC_POWER_MAKE(0x17, 0x0a, 0xc, 1, 1, 0x0f), //8dBm
  446. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x0a, 0xc, 1, 1, 0x0f), //9dBm
  447. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x0d, 0xc, 1, 1, 0x0f), //10dBm
  448. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x12, 0xc, 1, 1, 0x0f), //11dBm
  449. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x1c, 0xc, 1, 1, 0x0f), //12dBm
  450. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x3f, 0xc, 1, 1, 0x13) //13dBm
  451. };
  452. const uint32_t pan31xx_dcdc_power_0603_860_870mhz[34] = {
  453. PAN31XX_DCDC_POWER_MAKE(0x00, 0x0e, 0x0, 1, 1, 0x0f), //-20dBm
  454. PAN31XX_DCDC_POWER_MAKE(0x00, 0x11, 0x0, 1, 1, 0x0f), //-19dBm
  455. PAN31XX_DCDC_POWER_MAKE(0x00, 0x05, 0x1, 1, 1, 0x0f), //-18dBm
  456. PAN31XX_DCDC_POWER_MAKE(0x00, 0x06, 0x1, 1, 1, 0x0f), //-17dBm
  457. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x17, 0x0, 1, 1, 0x0f), //-16dBm
  458. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0x5, 1, 1, 0x0f), //-15dBm
  459. PAN31XX_DCDC_POWER_MAKE(0x0e, 0x00, 0x5, 1, 1, 0x0f), //-14dBm
  460. PAN31XX_DCDC_POWER_MAKE(0x01, 0x00, 0x8, 1, 1, 0x0f), //-13dBm
  461. PAN31XX_DCDC_POWER_MAKE(0x05, 0x00, 0x9, 1, 1, 0x0f), //-12dBm
  462. PAN31XX_DCDC_POWER_MAKE(0x05, 0x00, 0xc, 1, 1, 0x0f), //-11dBm
  463. PAN31XX_DCDC_POWER_MAKE(0x0b, 0x00, 0xc, 1, 1, 0x0f), //-10dBm
  464. PAN31XX_DCDC_POWER_MAKE(0x13, 0x00, 0xc, 1, 1, 0x0f), //-9dBm
  465. PAN31XX_DCDC_POWER_MAKE(0x1c, 0x00, 0xc, 1, 1, 0x0f), //-8dBm
  466. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xe, 1, 1, 0x0f), //-7dBm
  467. PAN31XX_DCDC_POWER_MAKE(0x06, 0x01, 0xc, 1, 1, 0x0f), //-6dBm
  468. PAN31XX_DCDC_POWER_MAKE(0x0b, 0x01, 0xc, 1, 1, 0x0f), //-5dBm
  469. PAN31XX_DCDC_POWER_MAKE(0x10, 0x01, 0xc, 1, 1, 0x0f), //-4dBm
  470. PAN31XX_DCDC_POWER_MAKE(0x06, 0x02, 0xc, 1, 1, 0x0f), //-3dBm
  471. PAN31XX_DCDC_POWER_MAKE(0x0b, 0x02, 0xc, 1, 1, 0x0f), //-2dBm
  472. PAN31XX_DCDC_POWER_MAKE(0x12, 0x02, 0xc, 1, 1, 0x0f), //-1dBm
  473. PAN31XX_DCDC_POWER_MAKE(0x19, 0x02, 0xc, 1, 1, 0x0f), //0dBm
  474. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x02, 0xf, 1, 1, 0x0f), //1dBm
  475. PAN31XX_DCDC_POWER_MAKE(0x1b, 0x03, 0xc, 1, 1, 0x0f), //2dBm
  476. PAN31XX_DCDC_POWER_MAKE(0x18, 0x04, 0xc, 1, 1, 0x0f), //3dBm
  477. PAN31XX_DCDC_POWER_MAKE(0x18, 0x05, 0xc, 1, 1, 0x0f), //4dBm
  478. PAN31XX_DCDC_POWER_MAKE(0x1a, 0x06, 0xc, 1, 1, 0x0f), //5dBm
  479. PAN31XX_DCDC_POWER_MAKE(0x1c, 0x07, 0xc, 1, 1, 0x0f), //6dBm
  480. PAN31XX_DCDC_POWER_MAKE(0x1a, 0x0a, 0xc, 1, 1, 0x0f), //7dBm
  481. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x2c, 0xc, 1, 1, 0x0f), //8dBm
  482. PAN31XX_DCDC_POWER_MAKE(0x0d, 0x2c, 0xc, 1, 1, 0x0f), //9dBm
  483. PAN31XX_DCDC_POWER_MAKE(0x13, 0x2c, 0xc, 1, 1, 0x13), //10dBm
  484. PAN31XX_DCDC_POWER_MAKE(0x18, 0x2c, 0xc, 1, 1, 0x13), //11dBm
  485. PAN31XX_DCDC_POWER_MAKE(0x1c, 0x2c, 0xc, 1, 1, 0x13), //12dBm
  486. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x3f, 0xc, 1, 1, 0x17) //13dBm
  487. };
  488. const uint32_t pan31xx_dcdc_power_0603_902_928mhz[34] = {
  489. PAN31XX_DCDC_POWER_MAKE(0x00, 0x06, 0x1, 1, 1, 0x0f), //-20dBm
  490. PAN31XX_DCDC_POWER_MAKE(0x00, 0x07, 0x1, 1, 1, 0x0f), //-19dBm
  491. PAN31XX_DCDC_POWER_MAKE(0x00, 0x08, 0x1, 1, 1, 0x0f), //-18dBm
  492. PAN31XX_DCDC_POWER_MAKE(0x00, 0x09, 0x1, 1, 1, 0x0f), //-17dBm
  493. PAN31XX_DCDC_POWER_MAKE(0x00, 0x0a, 0x1, 1, 1, 0x0f), //-16dBm
  494. PAN31XX_DCDC_POWER_MAKE(0x03, 0x04, 0x2, 1, 1, 0x0f), //-15dBm
  495. PAN31XX_DCDC_POWER_MAKE(0x03, 0x05, 0x2, 1, 1, 0x0f), //-14dBm
  496. PAN31XX_DCDC_POWER_MAKE(0x04, 0x00, 0x8, 1, 1, 0x0f), //-13dBm
  497. PAN31XX_DCDC_POWER_MAKE(0x08, 0x00, 0x9, 1, 1, 0x0f), //-12dBm
  498. PAN31XX_DCDC_POWER_MAKE(0x05, 0x00, 0xc, 1, 1, 0x0f), //-11dBm
  499. PAN31XX_DCDC_POWER_MAKE(0x0b, 0x00, 0xc, 1, 1, 0x0f), //-10dBm
  500. PAN31XX_DCDC_POWER_MAKE(0x13, 0x00, 0xc, 1, 1, 0x0f), //-9dBm
  501. PAN31XX_DCDC_POWER_MAKE(0x1c, 0x00, 0xc, 1, 1, 0x0f), //-8dBm
  502. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xe, 1, 1, 0x0f), //-7dBm
  503. PAN31XX_DCDC_POWER_MAKE(0x06, 0x01, 0xc, 1, 1, 0x0f), //-6dBm
  504. PAN31XX_DCDC_POWER_MAKE(0x0b, 0x01, 0xc, 1, 1, 0x0f), //-5dBm
  505. PAN31XX_DCDC_POWER_MAKE(0x10, 0x01, 0xc, 1, 1, 0x0f), //-4dBm
  506. PAN31XX_DCDC_POWER_MAKE(0x06, 0x02, 0xc, 1, 1, 0x0f), //-3dBm
  507. PAN31XX_DCDC_POWER_MAKE(0x0b, 0x02, 0xc, 1, 1, 0x0f), //-2dBm
  508. PAN31XX_DCDC_POWER_MAKE(0x12, 0x02, 0xc, 1, 1, 0x0f), //-1dBm
  509. PAN31XX_DCDC_POWER_MAKE(0x19, 0x02, 0xc, 1, 1, 0x0f), //0dBm
  510. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x02, 0xf, 1, 1, 0x0f), //1dBm
  511. PAN31XX_DCDC_POWER_MAKE(0x1b, 0x03, 0xc, 1, 1, 0x0f), //2dBm
  512. PAN31XX_DCDC_POWER_MAKE(0x18, 0x04, 0xc, 1, 1, 0x0f), //3dBm
  513. PAN31XX_DCDC_POWER_MAKE(0x18, 0x05, 0xc, 1, 1, 0x0f), //4dBm
  514. PAN31XX_DCDC_POWER_MAKE(0x1a, 0x06, 0xc, 1, 1, 0x0f), //5dBm
  515. PAN31XX_DCDC_POWER_MAKE(0x1c, 0x07, 0xc, 1, 1, 0x0f), //6dBm
  516. PAN31XX_DCDC_POWER_MAKE(0x1a, 0x0a, 0xc, 1, 1, 0x0f), //7dBm
  517. PAN31XX_DCDC_POWER_MAKE(0x07, 0x2c, 0xc, 1, 1, 0x0f), //8dBm
  518. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x2c, 0xc, 1, 1, 0x0f), //9dBm
  519. PAN31XX_DCDC_POWER_MAKE(0x10, 0x2c, 0xc, 1, 1, 0x13), //10dBm
  520. PAN31XX_DCDC_POWER_MAKE(0x17, 0x2c, 0xc, 1, 1, 0x13), //11dBm
  521. PAN31XX_DCDC_POWER_MAKE(0x1b, 0x2c, 0xc, 1, 1, 0x13), //12dBm
  522. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x3f, 0xc, 1, 1, 0x17) //13dBm
  523. };
  524. const uint32_t pan31xx_dcdc_power_0402_420_445mhz[34] = {
  525. PAN31XX_DCDC_POWER_MAKE(0x00, 0x05, 0x1, 1, 1, 0x0d), //-20dBm
  526. PAN31XX_DCDC_POWER_MAKE(0x00, 0x13, 0x0, 1, 1, 0x0d), //-19dBm
  527. PAN31XX_DCDC_POWER_MAKE(0x18, 0x06, 0x1, 1, 1, 0x0d), //-18dBm
  528. PAN31XX_DCDC_POWER_MAKE(0x18, 0x07, 0x1, 1, 1, 0x0d), //-17dBm
  529. PAN31XX_DCDC_POWER_MAKE(0x18, 0x08, 0x1, 1, 1, 0x0d), //-16dBm
  530. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0x8, 1, 1, 0x0d), //-15dBm
  531. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0xb, 1, 1, 0x0d), //-14dBm
  532. PAN31XX_DCDC_POWER_MAKE(0x04, 0x00, 0xc, 1, 1, 0x0d), //-13dBm
  533. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x00, 0xc, 1, 1, 0x0d), //-12dBm
  534. PAN31XX_DCDC_POWER_MAKE(0x12, 0x00, 0xc, 1, 1, 0x0d), //-11dBm
  535. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xc, 1, 1, 0x0d), //-10dBm
  536. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xf, 1, 1, 0x0d), //-9dBm
  537. PAN31XX_DCDC_POWER_MAKE(0x01, 0x01, 0xc, 1, 1, 0x0d), //-8dBm
  538. PAN31XX_DCDC_POWER_MAKE(0x07, 0x01, 0xc, 1, 1, 0x0d), //-7dBm
  539. PAN31XX_DCDC_POWER_MAKE(0x0e, 0x01, 0xc, 1, 1, 0x0d), //-6dBm
  540. PAN31XX_DCDC_POWER_MAKE(0x01, 0x02, 0xc, 1, 1, 0x0d), //-5dBm
  541. PAN31XX_DCDC_POWER_MAKE(0x07, 0x02, 0xc, 1, 1, 0x0d), //-4dBm
  542. PAN31XX_DCDC_POWER_MAKE(0x01, 0x03, 0xc, 1, 1, 0x0d), //-3dBm
  543. PAN31XX_DCDC_POWER_MAKE(0x06, 0x03, 0xc, 1, 1, 0x0d), //-2dBm
  544. PAN31XX_DCDC_POWER_MAKE(0x03, 0x04, 0xc, 1, 1, 0x0d), //-1dBm
  545. PAN31XX_DCDC_POWER_MAKE(0x03, 0x05, 0xc, 1, 1, 0x0d), //0dBm
  546. PAN31XX_DCDC_POWER_MAKE(0x00, 0x07, 0xc, 1, 1, 0x0d), //1dBm
  547. PAN31XX_DCDC_POWER_MAKE(0x06, 0x07, 0xc, 1, 1, 0x0d), //2dBm
  548. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x07, 0xc, 1, 1, 0x0d), //3dBm
  549. PAN31XX_DCDC_POWER_MAKE(0x11, 0x07, 0xc, 1, 1, 0x0d), //4dBm
  550. PAN31XX_DCDC_POWER_MAKE(0x17, 0x07, 0xc, 1, 1, 0x0d), //5dBm
  551. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x07, 0xc, 1, 1, 0x0d), //6dBm
  552. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x09, 0xc, 1, 1, 0x0d), //7dBm
  553. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x0b, 0xc, 1, 1, 0x0d), //8dBm
  554. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x0d, 0xc, 1, 1, 0x10), //9dBm
  555. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x11, 0xc, 1, 1, 0x10), //10dBm
  556. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x16, 0xc, 1, 1, 0x10), //11dBm
  557. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x1f, 0xc, 1, 1, 0x13), //12dBm
  558. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x30, 0xc, 1, 1, 0x13) //13dBm
  559. };
  560. const uint32_t pan31xx_dcdc_power_0402_470_510mhz[34] = {
  561. PAN31XX_DCDC_POWER_MAKE(0x00, 0x05, 0x1, 1, 1, 0x0d), //-20dBm
  562. PAN31XX_DCDC_POWER_MAKE(0x00, 0x13, 0x0, 1, 1, 0x0d), //-19dBm
  563. PAN31XX_DCDC_POWER_MAKE(0x18, 0x06, 0x1, 1, 1, 0x0d), //-18dBm
  564. PAN31XX_DCDC_POWER_MAKE(0x18, 0x07, 0x1, 1, 1, 0x0d), //-17dBm
  565. PAN31XX_DCDC_POWER_MAKE(0x18, 0x08, 0x1, 1, 1, 0x0d), //-16dBm
  566. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0x8, 1, 1, 0x0d), //-15dBm
  567. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0xb, 1, 1, 0x0d), //-14dBm
  568. PAN31XX_DCDC_POWER_MAKE(0x04, 0x00, 0xc, 1, 1, 0x0d), //-13dBm
  569. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x00, 0xc, 1, 1, 0x0d), //-12dBm
  570. PAN31XX_DCDC_POWER_MAKE(0x12, 0x00, 0xc, 1, 1, 0x0d), //-11dBm
  571. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xc, 1, 1, 0x0d), //-10dBm
  572. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xf, 1, 1, 0x0d), //-9dBm
  573. PAN31XX_DCDC_POWER_MAKE(0x01, 0x01, 0xc, 1, 1, 0x0d), //-8dBm
  574. PAN31XX_DCDC_POWER_MAKE(0x07, 0x01, 0xc, 1, 1, 0x0d), //-7dBm
  575. PAN31XX_DCDC_POWER_MAKE(0x0e, 0x01, 0xc, 1, 1, 0x0d), //-6dBm
  576. PAN31XX_DCDC_POWER_MAKE(0x01, 0x02, 0xc, 1, 1, 0x0d), //-5dBm
  577. PAN31XX_DCDC_POWER_MAKE(0x07, 0x02, 0xc, 1, 1, 0x0d), //-4dBm
  578. PAN31XX_DCDC_POWER_MAKE(0x01, 0x03, 0xc, 1, 1, 0x0d), //-3dBm
  579. PAN31XX_DCDC_POWER_MAKE(0x06, 0x03, 0xc, 1, 1, 0x0d), //-2dBm
  580. PAN31XX_DCDC_POWER_MAKE(0x03, 0x04, 0xc, 1, 1, 0x0d), //-1dBm
  581. PAN31XX_DCDC_POWER_MAKE(0x03, 0x05, 0xc, 1, 1, 0x0d), //0dBm
  582. PAN31XX_DCDC_POWER_MAKE(0x00, 0x07, 0xc, 1, 1, 0x0d), //1dBm
  583. PAN31XX_DCDC_POWER_MAKE(0x06, 0x07, 0xc, 1, 1, 0x0d), //2dBm
  584. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x07, 0xc, 1, 1, 0x0d), //3dBm
  585. PAN31XX_DCDC_POWER_MAKE(0x11, 0x07, 0xc, 1, 1, 0x0d), //4dBm
  586. PAN31XX_DCDC_POWER_MAKE(0x17, 0x07, 0xc, 1, 1, 0x0d), //5dBm
  587. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x07, 0xc, 1, 1, 0x0d), //6dBm
  588. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x09, 0xc, 1, 1, 0x0d), //7dBm
  589. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x0b, 0xc, 1, 1, 0x0d), //8dBm
  590. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x0d, 0xc, 1, 1, 0x10), //9dBm
  591. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x11, 0xc, 1, 1, 0x10), //10dBm
  592. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x16, 0xc, 1, 1, 0x10), //11dBm
  593. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x1f, 0xc, 1, 1, 0x13), //12dBm
  594. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x30, 0xc, 1, 1, 0x13) //13dBm
  595. };
  596. const uint32_t pan31xx_dcdc_power_0402_860_870mhz[34] = {
  597. PAN31XX_DCDC_POWER_MAKE(0x00, 0x05, 0x1, 1, 1, 0x10), //-20dBm
  598. PAN31XX_DCDC_POWER_MAKE(0x00, 0x13, 0x0, 1, 1, 0x10), //-19dBm
  599. PAN31XX_DCDC_POWER_MAKE(0x18, 0x06, 0x1, 1, 1, 0x10), //-18dBm
  600. PAN31XX_DCDC_POWER_MAKE(0x18, 0x07, 0x1, 1, 1, 0x10), //-17dBm
  601. PAN31XX_DCDC_POWER_MAKE(0x18, 0x08, 0x1, 1, 1, 0x10), //-16dBm
  602. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0x8, 1, 1, 0x10), //-15dBm
  603. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0xb, 1, 1, 0x10), //-14dBm
  604. PAN31XX_DCDC_POWER_MAKE(0x04, 0x00, 0xc, 1, 1, 0x10), //-13dBm
  605. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x00, 0xc, 1, 1, 0x10), //-12dBm
  606. PAN31XX_DCDC_POWER_MAKE(0x12, 0x00, 0xc, 1, 1, 0x10), //-11dBm
  607. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xc, 1, 1, 0x10), //-10dBm
  608. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xf, 1, 1, 0x10), //-9dBm
  609. PAN31XX_DCDC_POWER_MAKE(0x01, 0x01, 0xc, 1, 1, 0x10), //-8dBm
  610. PAN31XX_DCDC_POWER_MAKE(0x07, 0x01, 0xc, 1, 1, 0x10), //-7dBm
  611. PAN31XX_DCDC_POWER_MAKE(0x0e, 0x01, 0xc, 1, 1, 0x10), //-6dBm
  612. PAN31XX_DCDC_POWER_MAKE(0x01, 0x02, 0xc, 1, 1, 0x10), //-5dBm
  613. PAN31XX_DCDC_POWER_MAKE(0x07, 0x02, 0xc, 1, 1, 0x10), //-4dBm
  614. PAN31XX_DCDC_POWER_MAKE(0x01, 0x03, 0xc, 1, 1, 0x10), //-3dBm
  615. PAN31XX_DCDC_POWER_MAKE(0x06, 0x03, 0xc, 1, 1, 0x10), //-2dBm
  616. PAN31XX_DCDC_POWER_MAKE(0x03, 0x04, 0xc, 1, 1, 0x10), //-1dBm
  617. PAN31XX_DCDC_POWER_MAKE(0x03, 0x05, 0xc, 1, 1, 0x10), //0dBm
  618. PAN31XX_DCDC_POWER_MAKE(0x00, 0x07, 0xc, 1, 1, 0x10), //1dBm
  619. PAN31XX_DCDC_POWER_MAKE(0x06, 0x07, 0xc, 1, 1, 0x10), //2dBm
  620. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x07, 0xc, 1, 1, 0x10), //3dBm
  621. PAN31XX_DCDC_POWER_MAKE(0x11, 0x07, 0xc, 1, 1, 0x10), //4dBm
  622. PAN31XX_DCDC_POWER_MAKE(0x17, 0x07, 0xc, 1, 1, 0x10), //5dBm
  623. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x07, 0xc, 1, 1, 0x10), //6dBm
  624. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x09, 0xc, 1, 1, 0x10), //7dBm
  625. PAN31XX_DCDC_POWER_MAKE(0x07, 0x2c, 0xc, 1, 1, 0x0f), //8dBm
  626. PAN31XX_DCDC_POWER_MAKE(0x0b, 0x2c, 0xc, 1, 1, 0x0f), //9dBm
  627. PAN31XX_DCDC_POWER_MAKE(0x10, 0x2c, 0xc, 1, 1, 0x13), //10dBm
  628. PAN31XX_DCDC_POWER_MAKE(0x15, 0x2c, 0xc, 1, 1, 0x13), //11dBm
  629. PAN31XX_DCDC_POWER_MAKE(0x1a, 0x2c, 0xc, 1, 1, 0x15), //12dBm
  630. PAN31XX_DCDC_POWER_MAKE(0x1b, 0x3f, 0xc, 1, 1, 0x19) //13dBm
  631. };
  632. const uint32_t pan31xx_dcdc_power_0402_902_928mhz[34] = {
  633. PAN31XX_DCDC_POWER_MAKE(0x00, 0x05, 0x1, 1, 1, 0x10), //-20dBm
  634. PAN31XX_DCDC_POWER_MAKE(0x00, 0x13, 0x0, 1, 1, 0x10), //-19dBm
  635. PAN31XX_DCDC_POWER_MAKE(0x18, 0x06, 0x1, 1, 1, 0x10), //-18dBm
  636. PAN31XX_DCDC_POWER_MAKE(0x18, 0x07, 0x1, 1, 1, 0x10), //-17dBm
  637. PAN31XX_DCDC_POWER_MAKE(0x18, 0x08, 0x1, 1, 1, 0x10), //-16dBm
  638. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0x8, 1, 1, 0x10), //-15dBm
  639. PAN31XX_DCDC_POWER_MAKE(0x00, 0x00, 0xb, 1, 1, 0x10), //-14dBm
  640. PAN31XX_DCDC_POWER_MAKE(0x04, 0x00, 0xc, 1, 1, 0x10), //-13dBm
  641. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x00, 0xc, 1, 1, 0x10), //-12dBm
  642. PAN31XX_DCDC_POWER_MAKE(0x12, 0x00, 0xc, 1, 1, 0x10), //-11dBm
  643. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xc, 1, 1, 0x10), //-10dBm
  644. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x00, 0xf, 1, 1, 0x10), //-9dBm
  645. PAN31XX_DCDC_POWER_MAKE(0x01, 0x01, 0xc, 1, 1, 0x10), //-8dBm
  646. PAN31XX_DCDC_POWER_MAKE(0x07, 0x01, 0xc, 1, 1, 0x10), //-7dBm
  647. PAN31XX_DCDC_POWER_MAKE(0x0e, 0x01, 0xc, 1, 1, 0x10), //-6dBm
  648. PAN31XX_DCDC_POWER_MAKE(0x01, 0x02, 0xc, 1, 1, 0x10), //-5dBm
  649. PAN31XX_DCDC_POWER_MAKE(0x07, 0x02, 0xc, 1, 1, 0x10), //-4dBm
  650. PAN31XX_DCDC_POWER_MAKE(0x01, 0x03, 0xc, 1, 1, 0x10), //-3dBm
  651. PAN31XX_DCDC_POWER_MAKE(0x06, 0x03, 0xc, 1, 1, 0x10), //-2dBm
  652. PAN31XX_DCDC_POWER_MAKE(0x03, 0x04, 0xc, 1, 1, 0x10), //-1dBm
  653. PAN31XX_DCDC_POWER_MAKE(0x03, 0x05, 0xc, 1, 1, 0x10), //0dBm
  654. PAN31XX_DCDC_POWER_MAKE(0x00, 0x07, 0xc, 1, 1, 0x10), //1dBm
  655. PAN31XX_DCDC_POWER_MAKE(0x06, 0x07, 0xc, 1, 1, 0x10), //2dBm
  656. PAN31XX_DCDC_POWER_MAKE(0x0a, 0x07, 0xc, 1, 1, 0x10), //3dBm
  657. PAN31XX_DCDC_POWER_MAKE(0x11, 0x07, 0xc, 1, 1, 0x10), //4dBm
  658. PAN31XX_DCDC_POWER_MAKE(0x17, 0x07, 0xc, 1, 1, 0x10), //5dBm
  659. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x07, 0xc, 1, 1, 0x10), //6dBm
  660. PAN31XX_DCDC_POWER_MAKE(0x1f, 0x09, 0xc, 1, 1, 0x10), //7dBm
  661. PAN31XX_DCDC_POWER_MAKE(0x07, 0x2c, 0xc, 1, 1, 0x0f), //8dBm
  662. PAN31XX_DCDC_POWER_MAKE(0x0b, 0x2c, 0xc, 1, 1, 0x0f), //9dBm
  663. PAN31XX_DCDC_POWER_MAKE(0x10, 0x2c, 0xc, 1, 1, 0x13), //10dBm
  664. PAN31XX_DCDC_POWER_MAKE(0x15, 0x2c, 0xc, 1, 1, 0x13), //11dBm
  665. PAN31XX_DCDC_POWER_MAKE(0x1a, 0x2c, 0xc, 1, 1, 0x15), //12dBm
  666. PAN31XX_DCDC_POWER_MAKE(0x1b, 0x3f, 0xc, 1, 1, 0x1a) //13dBm
  667. };
  668. //-------------------------PAN312x api接口------------------------//
  669. //--------------------------------------------------------------//
  670. static int __PAN312xCmd_Write__(const void* wbuf, int wlen);
  671. static int __PAN312xCmd_Write(const void* wbuf, int wlen);
  672. static int __PAN312xCmd_WriteRead(const void* wbuf, int wlen, void* rbuf, int rlen);
  673. #if PAN312x_INTERFACE == PAN312x_IF_SPI
  674. #define PAN312x_DataBeginWrite() PAN312x_DataBegin()
  675. #define PAN312x_DataBeginRead() /* nothing to do */
  676. #define PAN312x_DataReadNonLast(B, L) PAN312x_DataRead((B), (L))
  677. #define PAN312x_DataReadLast(B, L) PAN312x_DataRead((B), (L))
  678. #define PAN312xReg_Waddr(adr) (((adr) << 1) | 1)
  679. #define PAN312xReg_Raddr(adr) (((adr) << 1) | 0)
  680. #elif PAN312x_INTERFACE == PAN312x_IF_3SPI
  681. #define PAN312x_DataBeginWrite() PAN312x_DataBegin()
  682. #define PAN312x_DataBeginRead() /* nothing to do */
  683. #define PAN312x_DataReadNonLast(B, L) PAN312x_DataRead((B), (L))
  684. #define PAN312x_DataReadLast(B, L) PAN312x_DataRead((B), (L))
  685. #define PAN312xReg_Waddr(adr) (((adr) << 1) | 1)
  686. #define PAN312xReg_Raddr(adr) (((adr) << 1) | 0)
  687. #elif PAN312x_INTERFACE == PAN312x_IF_I2C
  688. #define PAN312x_DataBeginWrite() PAN312x_DataBegin()
  689. #define PAN312x_DataBeginRead() PAN312x_DataReadBegin()/* nothing to do */
  690. #define PAN312x_DataReadNonLast(B, L) PAN312x_DataReadNonLast((B), (L))
  691. #define PAN312x_DataReadLast(B, L) PAN312x_DataRead((B), (L))
  692. #define PAN312xReg_Waddr(adr) (((adr) << 1) | 0)
  693. #define PAN312xReg_Raddr(adr) (((adr) << 1) | 1)
  694. #endif //PAN312x_INTERFACE
  695. /**
  696. * @简介:等待OTP加载完成,写R004并查询CTS直到芯片可接受命令
  697. * @参数:无
  698. * @返回值: PAN312x_OK=成功,其余=总线/CTS错误
  699. */
  700. int PAN312x_Trigger()
  701. {
  702. while(1){
  703. uint8_t temp = PAN312xReg_ReadB1(R000);
  704. if(temp & R000_OTP_LOAD_DONE_Msk){
  705. break;
  706. }
  707. }
  708. PAN312xReg_WriteB1(R004, 0x1C);
  709. int ret;
  710. uint8_t cmd = COMMADN_CTS, cts;
  711. do{
  712. PAN312x_DataBeginWrite();
  713. ret = PAN312x_DataWrite(&cmd, 1);
  714. if(ret == 1) {
  715. PAN312x_DataBeginRead();
  716. ret = PAN312x_DataReadLast(&cts, 1);
  717. }
  718. PAN312x_DataEnd();
  719. if(ret == 1){
  720. if((cts & 0xC0u) == 0x40u){
  721. ret = PAN312x_OK;
  722. break;
  723. }
  724. }
  725. } while(ret == 1);
  726. return ret;
  727. }
  728. //--------------------------------------------------------------------------------------------------
  729. /**
  730. * @简介:底层总线写数据(不加寄存器地址)
  731. * @参数:buf:写缓冲
  732. * len:字节数
  733. * @返回值: 实际写入字节数,或负错误码
  734. */
  735. int PAN312xRaw_Write(const void* buf, int len){
  736. PAN312x_Lock();
  737. PAN312x_DataBeginWrite();
  738. int ret = PAN312x_DataWrite(buf, len);
  739. PAN312x_DataEnd();
  740. PAN312x_Unlock();
  741. return ret;
  742. }
  743. /**
  744. * @简介:底层总线按地址写数据
  745. * @参数:adr:总线地址
  746. * buf:写缓冲
  747. * len:字节数
  748. * @返回值: 实际写入字节数,或负错误码
  749. */
  750. int PAN312xRaw_WriteAddr(uint8_t adr, const void* buf, int len){
  751. int ret;
  752. PAN312x_Lock();
  753. PAN312x_DataBeginWrite();
  754. ret = PAN312x_DataWrite(&adr, 1);
  755. if(ret == 1){
  756. ret = PAN312x_DataWrite(buf, len);
  757. }
  758. PAN312x_DataEnd();
  759. PAN312x_Unlock();
  760. return ret;
  761. }
  762. /**
  763. * @简介:按地址写1字节
  764. * @参数:adr:总线地址
  765. * val:数据
  766. * @返回值: 0-成功,非0-失败
  767. */
  768. int PAN312xRaw_WriteAddrB1(uint8_t adr, uint8_t val){
  769. int ret = PAN312xRaw_WriteAddr(adr, &val, 1);
  770. return ret == 1 ? 0 : ret;
  771. }
  772. /**
  773. * @简介:按地址写2字节
  774. * @参数:adr:总线地址
  775. * val:数据
  776. * @返回值: 0-成功,非0-失败
  777. */
  778. int PAN312xRaw_WriteAddrB2(uint8_t adr, uint16_t val){
  779. int ret = PAN312xRaw_WriteAddr(adr, &val, 2);
  780. return ret == 2 ? 0 : ret;
  781. }
  782. /**
  783. * @简介:按地址写3字节
  784. * @参数:adr:总线地址
  785. * val:数据
  786. * @返回值: 0-成功,非0-失败
  787. */
  788. int PAN312xRaw_WriteAddrB3(uint8_t adr, uint32_t val){
  789. int ret = PAN312xRaw_WriteAddr(adr, &val, 3);
  790. return ret == 3 ? 0 : ret;
  791. }
  792. /**
  793. * @简介:按地址写4字节
  794. * @参数:adr:总线地址
  795. * val:数据
  796. * @返回值: 0-成功,非0-失败
  797. */
  798. int PAN312xRaw_WriteAddrB4(uint8_t adr, uint32_t val){
  799. int ret = PAN312xRaw_WriteAddr(adr, &val, 4);
  800. return ret == 4 ? 0 : ret;
  801. }
  802. /**
  803. * @简介:底层总线按地址读数据
  804. * @参数:adr:总线地址
  805. * buf:读缓冲
  806. * len:字节数
  807. * @返回值: 实际读取字节数,或负错误码
  808. */
  809. int PAN312xRaw_ReadAddr(uint8_t adr, void* buf, int len){
  810. int ret;
  811. PAN312x_Lock();
  812. PAN312x_DataBeginWrite();
  813. ret = PAN312x_DataWrite(&adr, 1);
  814. if(ret == 1){
  815. PAN312x_DataBeginRead();
  816. ret = PAN312x_DataReadLast(buf, len);
  817. }
  818. PAN312x_DataEnd();
  819. PAN312x_Unlock();
  820. return ret;
  821. }
  822. /**
  823. * @简介:按地址读1字节
  824. * @参数:adr:总线地址
  825. * @返回值: 读到的数据
  826. */
  827. int PAN312xRaw_ReadAddrB1(uint8_t adr){
  828. uint8_t val;
  829. int ret = PAN312xRaw_ReadAddr(adr, &val, 1);
  830. return ret == 1 ? val : ret;
  831. }
  832. /**
  833. * @简介:按地址读2字节
  834. * @参数:adr:总线地址
  835. * @返回值: 读到的数据
  836. */
  837. int PAN312xRaw_ReadAddrB2(uint8_t adr){
  838. uint16_t val;
  839. int ret = PAN312xRaw_ReadAddr(adr, &val, 2);
  840. return ret == 2 ? val : ret;
  841. }
  842. /**
  843. * @简介:按地址读3字节
  844. * @参数:adr:总线地址
  845. * @返回值: 读到的数据
  846. */
  847. int PAN312xRaw_ReadAddrB3(uint8_t adr){
  848. uint32_t val = 0;
  849. int ret = PAN312xRaw_ReadAddr(adr, &val, 3);
  850. return ret == 3 ? val : ret;
  851. }
  852. /**
  853. * @简介:按地址读4字节
  854. * @参数:adr:总线地址
  855. * @返回值: 读到的数据
  856. */
  857. uint32_t PAN312xRaw_ReadAddrB4(uint8_t adr){
  858. uint32_t val;
  859. int ret = PAN312xRaw_ReadAddr(adr, &val, 4);
  860. return val;
  861. }
  862. //--------------------------------------------------------------------------------------------------
  863. /**
  864. * @简介:写PAN312x寄存器
  865. * @参数:reg:寄存器地址
  866. * buf:写缓冲
  867. * len:字节数
  868. * @返回值: 实际写入字节数,或负错误码
  869. */
  870. int PAN312xReg_Write(uint8_t reg, const void* buf, int len){
  871. return PAN312xRaw_WriteAddr(PAN312xReg_Waddr(reg), buf, len);
  872. }
  873. /**
  874. * @简介:写寄存器1字节
  875. * @参数:reg:寄存器地址
  876. * val:数据
  877. * @返回值: 实际写入字节数或负错误码
  878. */
  879. int PAN312xReg_WriteB1(uint8_t reg, uint8_t val){
  880. int ret = PAN312xReg_Write(reg, &val, 1);
  881. return ret == 1 ? PAN312x_OK : ret;
  882. }
  883. /**
  884. * @简介:写寄存器2字节
  885. * @参数:reg:寄存器地址
  886. * val:数据
  887. * @返回值: 实际写入字节数或负错误码
  888. */
  889. int PAN312xReg_WriteB2(uint8_t reg, uint16_t val){
  890. int ret = PAN312xReg_Write(reg, &val, 2);
  891. return ret == 2 ? PAN312x_OK : ret;
  892. }
  893. /**
  894. * @简介:写寄存器3字节
  895. * @参数:reg:寄存器地址
  896. * val:数据
  897. * @返回值: 实际写入字节数或负错误码
  898. */
  899. int PAN312xReg_WriteB3(uint8_t reg, uint32_t val){
  900. int ret = PAN312xReg_Write(reg, &val, 3);
  901. return ret == 3 ? PAN312x_OK : ret;
  902. }
  903. /**
  904. * @简介:写寄存器4字节
  905. * @参数:reg:寄存器地址
  906. * val:数据
  907. * @返回值: 实际写入字节数或负错误码
  908. */
  909. int PAN312xReg_WriteB4(uint8_t reg, uint32_t val){
  910. int ret = PAN312xReg_Write(reg, &val, 4);
  911. return ret == 4 ? PAN312x_OK : ret;
  912. }
  913. /**
  914. * @简介:读PAN312x寄存器
  915. * @参数:reg:寄存器地址
  916. * buf:读缓冲
  917. * len:字节数
  918. * @返回值: 实际读取字节数,或负错误码
  919. */
  920. int PAN312xReg_Read(uint8_t reg, void* buf, int len){
  921. return PAN312xRaw_ReadAddr(PAN312xReg_Raddr(reg), buf, len);
  922. }
  923. /**
  924. * @简介:读寄存器1字节
  925. * @参数:reg:寄存器地址
  926. * @返回值: 读到的数据
  927. */
  928. int PAN312xReg_ReadB1(uint8_t reg){
  929. uint8_t val;
  930. int ret = PAN312xReg_Read(reg, &val, 1);
  931. return ret == 1 ? val : ret;
  932. }
  933. /**
  934. * @简介:读寄存器2字节
  935. * @参数:reg:寄存器地址
  936. * @返回值: 读到的数据
  937. */
  938. int PAN312xReg_ReadB2(uint8_t reg){
  939. uint16_t val;
  940. int ret = PAN312xReg_Read(reg, &val, 2);
  941. return ret == 2 ? val : ret;
  942. }
  943. /**
  944. * @简介:读寄存器3字节
  945. * @参数:reg:寄存器地址
  946. * @返回值: 读到的数据
  947. */
  948. int PAN312xReg_ReadB3(uint8_t reg){
  949. uint32_t val = 0;
  950. int ret = PAN312xReg_Read(reg, &val, 3);
  951. return ret == 3 ? val : ret;
  952. }
  953. /**
  954. * @简介:读寄存器4字节
  955. * @参数:reg:寄存器地址
  956. * @返回值: 读到的数据
  957. */
  958. uint32_t PAN312xReg_ReadB4(uint8_t reg){
  959. uint32_t val;
  960. int ret = PAN312xReg_Read(reg, &val, 4);
  961. return val;
  962. }
  963. //--------------------------------------------------------------------------------------------------
  964. /**
  965. * @简介:命令通道等待CTS就绪(已持锁)
  966. * @参数:无
  967. * @返回值: PAN312x_OK=成功,其余=CTS/总线错误
  968. */
  969. static int __PAN312xCmd_WaitCts__()
  970. {
  971. int ret;
  972. uint8_t cmd = COMMADN_CTS, cts;
  973. do{
  974. PAN312x_DataBeginWrite();
  975. ret = PAN312x_DataWrite(&cmd, 1);
  976. if(ret == 1) {
  977. PAN312x_DataBeginRead();
  978. ret = PAN312x_DataReadLast(&cts, 1);
  979. }
  980. PAN312x_DataEnd();
  981. if(ret == 1){
  982. if(!(cts & 0x40)) ret = PAN312x_CTS_ERROR;
  983. else if(!(cts & 0x80)) ret = PAN312x_OK;
  984. }
  985. } while(ret == 1);
  986. return ret;
  987. }
  988. /**
  989. * @简介:命令通道写并等待CTS(已持锁)
  990. * @参数:wbuf:命令缓冲
  991. * wlen:字节数
  992. * @返回值: 写入字节数或错误码
  993. */
  994. static int __PAN312xCmd_Write__(const void* wbuf, int wlen){
  995. PAN312x_DataBeginWrite();
  996. int ret = PAN312x_DataWrite(wbuf, wlen);
  997. PAN312x_DataEnd();
  998. if(ret == wlen){
  999. int _ret = __PAN312xCmd_WaitCts__();
  1000. if(_ret != PAN312x_OK) ret = _ret;
  1001. }
  1002. return ret;
  1003. }
  1004. /**
  1005. * @简介:命令通道写并等待CTS
  1006. * @参数:wbuf:命令缓冲
  1007. * wlen:字节数
  1008. * @返回值: 写入字节数或错误码
  1009. */
  1010. static int __PAN312xCmd_Write(const void* wbuf, int wlen){
  1011. PAN312x_Lock();
  1012. int ret = __PAN312xCmd_Write__(wbuf, wlen);
  1013. PAN312x_Unlock();
  1014. return ret;
  1015. }
  1016. /**
  1017. * @简介:命令通道写后读应答
  1018. * @参数:wbuf:命令缓冲
  1019. * wlen:写字节数
  1020. * rbuf:读缓冲
  1021. * rlen:读字节数
  1022. * @返回值: 读取字节数或错误码
  1023. */
  1024. static int __PAN312xCmd_WriteRead(const void* wbuf, int wlen, void* rbuf, int rlen)
  1025. {
  1026. PAN312x_Lock();
  1027. int ret = __PAN312xCmd_Write__(wbuf, wlen);
  1028. if(ret == wlen){
  1029. uint8_t temp = COMMADN_CTS;//0x44;
  1030. PAN312x_DataBeginWrite();
  1031. ret = PAN312x_DataWrite(&temp, 1);
  1032. if(ret == 1){
  1033. PAN312x_DataBeginRead();
  1034. ret = PAN312x_DataReadNonLast(&temp, 1); //skip CTS
  1035. if(ret == 1){
  1036. ret = PAN312x_DataReadLast(rbuf, rlen);
  1037. }
  1038. }
  1039. PAN312x_DataEnd();
  1040. }
  1041. PAN312x_Unlock();
  1042. return ret;
  1043. }
  1044. /**
  1045. * @简介:查询一次CTS状态
  1046. * @参数:无
  1047. * @返回值: PAN312x_OK=就绪,PAN312x_CTS_ERROR=未就绪,PAN312x_IO_ERROR=总线错误
  1048. */
  1049. int PAN312x_CheckCts(void)
  1050. {
  1051. int ret;
  1052. uint8_t cmd = COMMADN_CTS, cts;
  1053. PAN312x_DataBeginWrite();
  1054. ret = PAN312x_DataWrite(&cmd, 1);
  1055. if(ret == 1) {
  1056. PAN312x_DataBeginRead();
  1057. ret = PAN312x_DataReadLast(&cts, 1);
  1058. }
  1059. PAN312x_DataEnd();
  1060. if(ret == 1){
  1061. if((cts & 0xC0u) == 0x40u){
  1062. return PAN312x_OK;
  1063. } else {
  1064. return PAN312x_CTS_ERROR;
  1065. }
  1066. }
  1067. return PAN312x_IO_ERROR;
  1068. }
  1069. /**
  1070. * @简介:阻塞等待CTS就绪
  1071. * @参数:无
  1072. * @返回值: 无
  1073. */
  1074. void PAN312x_WaitCtsOk(void)
  1075. {
  1076. while(1){
  1077. int ret = PAN312x_CheckCts();
  1078. if(ret == PAN312x_OK || ret == PAN312x_IO_ERROR){
  1079. break;
  1080. }
  1081. }
  1082. }
  1083. void PAN312x_ReadInvalidData(void)
  1084. {
  1085. uint8_t tmpBuffer[33];
  1086. PAN312xReg_Read(0x22, tmpBuffer, sizeof(tmpBuffer));
  1087. }
  1088. /**
  1089. * @简介:向寄存器地址写1字节数据
  1090. * @参数:addr - 寄存器地址
  1091. * data - 数据
  1092. * @返回值:无
  1093. */
  1094. void PAN312x_Write( uint8_t addr, uint8_t data )
  1095. {
  1096. PAN312xReg_WriteB1(addr, data);
  1097. }
  1098. /**
  1099. * @简介:向寄存器地址读1字节数据
  1100. * @参数:addr - 寄存器地址
  1101. * data - 读数据存储地址
  1102. * @返回值:无
  1103. */
  1104. void PAN312x_Read( uint8_t addr, uint8_t *data )
  1105. {
  1106. PAN312xReg_Read(addr, data, 1);
  1107. }
  1108. /**
  1109. * @简介:按地址连续写操作寄存器(XDATA)
  1110. * @参数:addr:起始地址
  1111. * num_value:字节数
  1112. * value:写缓冲
  1113. * @返回值: 0-成功,非0-失败
  1114. */
  1115. void PAN312x_Set_OP_Reg(uint16_t addr, uint8_t num_value, const uint8_t *value)
  1116. {
  1117. PAN312x_SetXdatas(addr, value, num_value);
  1118. }
  1119. /**
  1120. * @简介:按地址连续读操作寄存器(XDATA)
  1121. * @参数:addr:起始地址
  1122. * num_value:字节数
  1123. * value:读缓冲
  1124. * @返回值: 0-成功,非0-失败
  1125. */
  1126. void PAN312x_Get_OP_Reg(uint16_t addr, uint8_t num_value, uint8_t *value)
  1127. {
  1128. PAN312x_GetXdatas(addr, value, num_value);
  1129. }
  1130. /**
  1131. * @简介:通过PAD复位PAN312x(低电平有效)
  1132. * @参数:无
  1133. * @返回值:无
  1134. */
  1135. void PAN312x_Reset(void)
  1136. {
  1137. PAN312x_Reset_Init();
  1138. PAN312x_Reset_Low();
  1139. delay1ms(20);
  1140. PAN312x_Reset_High();
  1141. delay1ms(20);
  1142. }
  1143. /**
  1144. * @简介:PAN312x IO初始化及配置
  1145. * @参数:无
  1146. * @返回值:无
  1147. */
  1148. void PAN312x_InitIo(void)
  1149. {
  1150. PAN312x_DIO8_INPUT();
  1151. }
  1152. /**
  1153. * @简介:DIO8中断开启使能
  1154. * @参数:无
  1155. * @返回值:无
  1156. */
  1157. void DIO8_EnableInterrupt(void)
  1158. {
  1159. PAN312x_DIO8_INTENABLE();
  1160. }
  1161. /**
  1162. * @简介:DIO8中断关闭使能
  1163. * @参数:无
  1164. * @返回值:无
  1165. */
  1166. void DIO8_DisableInterrupt(void)
  1167. {
  1168. PAN312x_DIO8_INTDISABLE();
  1169. }
  1170. /**
  1171. * @简介:DIO8引脚状态获取
  1172. * @参数:无
  1173. * @返回值:State表示DIO0获取的电平,高电平"1",低电平"0"
  1174. */
  1175. bool DIO8_GetState(void)
  1176. {
  1177. bool State;
  1178. State = PAN312x_DIO8_GetState();
  1179. return State;
  1180. }
  1181. /**
  1182. * @简介:PAN312x FSK初始化
  1183. * @参数:无
  1184. * @返回值:无
  1185. */
  1186. void PAN312x_Fsk_Init(void)
  1187. {
  1188. PAN312x_InitIo(); // PAIO口初始化
  1189. PAN312x_SPI_Init(); // SPI初始化
  1190. PAN312x_Reset(); // 复位RF
  1191. #if PAN312x_INTERFACE == PAN312x_IF_3SPI
  1192. PAN312x_SPI3wire_Enable();
  1193. #endif
  1194. if(TcxoControlByGpio == 0x01){
  1195. PAN312x_TCXO_ControlByGpio(PAN312x_GPIO_PIN_9, 1); /* 使能TCXO, 高电平有效 */
  1196. }
  1197. PAN312x_Trigger();
  1198. PAN312x_RegMap_Init();
  1199. //RC校准
  1200. PAN312x_RC_Calibration();
  1201. }
  1202. /**
  1203. * @简介:PAN312x寄存器RegMap初始化
  1204. * @参数:无
  1205. * @返回值:无
  1206. */
  1207. void PAN312x_RegMap_Init(void)
  1208. {
  1209. uint8_t tmp;
  1210. //XTH_DEGLITCH
  1211. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C6);
  1212. tmp &= ~PROPERTY_MSK_R2C6_XTH_DEGLITCH_EN;
  1213. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C6, tmp);
  1214. //[0x70][0x3e][0x13e]: 0x80
  1215. //[8]:adc_clk相位选择;
  1216. //0:不取反;1:取反
  1217. tmp = 0x80;
  1218. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R13E, tmp);
  1219. //[0x72][0x31]
  1220. tmp = 0x7d;
  1221. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R231, tmp);
  1222. //[0x73][0x53]修改PLL_CP_ISEL,PSHIFT,优化相噪
  1223. tmp = 0x2e;//v1.0:0x28,v1.1:0x2e
  1224. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2BE, tmp);
  1225. //[0x73][0x41]修改XTH_HYS_EN,优化相噪
  1226. tmp = 0x00;
  1227. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C1, tmp);
  1228. //[0x73][0x53]修改PLL_CP_ISEL,PSHIFT,优化相噪
  1229. tmp = 0x7d;
  1230. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D3, tmp);
  1231. //[0x73][0x53]修改PLL_CP_ISEL,PSHIFT,优化相噪
  1232. tmp = 0xfd;//v1.0:0x7d,v1.1:0xfd
  1233. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D4, tmp);
  1234. //[0x73][0x57]:PA模拟模式 ramp时间常数调节
  1235. //PA_RAMP_RC_TRIM[3:1]
  1236. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D7);
  1237. tmp &= ~PROPERTY_MSK_R2D7_PA_RAMP_RC_TRIM;
  1238. tmp |= (0x06 << 1);
  1239. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D7, tmp);
  1240. //[0x73][0x5c],默认值修改
  1241. tmp = 0xff;
  1242. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2DC, tmp);
  1243. //[0x74][0x16] AGC输入使能
  1244. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R316);
  1245. tmp |= PROPERTY_MSK_R316_REG_AGC_IN_MODE | PROPERTY_MSK_R316_REG_DC_CAL_TRIG;
  1246. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R316, tmp);
  1247. //V1.1
  1248. //[0x72][0x38]
  1249. tmp = 0x71;
  1250. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R238, tmp);
  1251. //[0x72][0x40]
  1252. tmp = 0x86;
  1253. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R240, tmp);
  1254. //DCDC_CAL_EN: [0x73][0x45][5:3] =111b dcdc
  1255. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C5);
  1256. tmp &= ~PROPERTY_MSK_R2C5_DCDC_IMAX;
  1257. tmp |= (0x07 << PROPERTY_POS_R2C5_DCDC_IMAX);
  1258. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C5, tmp);
  1259. //[0x73][0x44]
  1260. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C4);
  1261. //DCDC_BUFSEL:[0x73][0x44][7:5] = 000b
  1262. tmp &= ~PROPERTY_MSK_R2C4_DCDC_BUFSEL;
  1263. //DCDC_RESSEL:[0x73][0x44][4:2] = 010b
  1264. tmp &= ~PROPERTY_MSK_R2C4_DCDC_RESSEL;
  1265. tmp |= (0x02 << PROPERTY_POS_R2C4_DCDC_RESSEL);
  1266. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C4, tmp);
  1267. //[0x73][0x48]
  1268. //XTH_AMP_SEL[7]=0,优化DCDC杂散,32M spur,功耗
  1269. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C8);
  1270. tmp &= ~PROPERTY_MSK_R2C8_XTH_AMP_SEL;
  1271. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C8, tmp);
  1272. //[0x73][0x44] RX_TIA_DCOC_ENABLE = 0,analog dc close
  1273. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C3);
  1274. tmp &= ~PROPERTY_MSK_R2C3_RX_TIA_DCOC_ENABLE;
  1275. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C3, tmp);
  1276. //
  1277. // //20250928 tx_setting and rx_setting time
  1278. //[0x74][0x40]
  1279. tmp = 0x02;
  1280. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R340, tmp);
  1281. //[0x74][0x41]
  1282. tmp = 0x08;
  1283. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R341, tmp);
  1284. //[0x74][0x43]
  1285. tmp = 0x10;
  1286. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R343, tmp);
  1287. //[0x74][0x44], 03 to 02,128us to 64us
  1288. tmp = 0x02;
  1289. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R344, tmp);
  1290. //[0x74][0x45],
  1291. //ramp down 时间,从128us改为64us
  1292. tmp = 0x02;
  1293. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R345, tmp);
  1294. //500kbps
  1295. tmp = 0x22;
  1296. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R338, tmp);
  1297. }
  1298. /**
  1299. * @简介:读取GET_FWID的4字节应答
  1300. * @参数:tmp:4字节缓冲区,低2字节FwId,高2字节YMDH
  1301. * @返回值: 0-成功,非0-失败
  1302. */
  1303. static int __PAN312x_Get_FwIdReply(uint8_t tmp[4])
  1304. {
  1305. uint8_t cmd = COMMAND_GET_FWID;
  1306. int ret = __PAN312xCmd_WriteRead(&cmd, 1, tmp, 4);
  1307. return ret == 4 ? PAN312x_OK : ret;
  1308. }
  1309. /**
  1310. * @简介:获取PAN312x固件ID(GET_FWID 低2字节)
  1311. * @参数:fwid:固件ID缓冲区
  1312. * @返回值: 0-成功,非0-失败
  1313. */
  1314. int PAN312x_Get_FwId(uint16_t *fwid)
  1315. {
  1316. uint8_t tmp[4];
  1317. int ret = __PAN312x_Get_FwIdReply(tmp);
  1318. if(ret != PAN312x_OK){
  1319. return ret;
  1320. }
  1321. *fwid = (uint16_t)tmp[0] | ((uint16_t)tmp[1] << 8);
  1322. return PAN312x_OK;
  1323. }
  1324. /**
  1325. * @简介:解析 PAN312x 固件编译时间(GET_FWID 应答高字节)
  1326. * @参数:build_time:输出年/月/日/时
  1327. * @返回值: 0-成功,非0-失败
  1328. */
  1329. int PAN312x_Get_FwBuildTime(PAN312xFwBuildTime *build_time)
  1330. {
  1331. uint8_t tmp[4];
  1332. uint16_t ymdh;
  1333. int ret = __PAN312x_Get_FwIdReply(tmp);
  1334. if(ret != PAN312x_OK){
  1335. return ret;
  1336. }
  1337. ymdh = (uint16_t)tmp[2] | ((uint16_t)tmp[3] << 8);
  1338. build_time->ymdh = ymdh;
  1339. build_time->year = (uint16_t)(((ymdh >> 13) & 0x07u) + 2026u);
  1340. build_time->month = (uint8_t)((ymdh >> 9) & 0x0Fu);
  1341. build_time->day = (uint8_t)((ymdh >> 4) & 0x1Fu);
  1342. build_time->hour = (uint8_t)((ymdh & 0x0Fu) + 7u);
  1343. return PAN312x_OK;
  1344. }
  1345. /**
  1346. * @简介:寄存器操作
  1347. * @参数:op_reg_flag - 操作标志,参考PAN312x_OpRegFlag_t
  1348. * addr - 寄存器地址
  1349. * buf - 寄存器值缓冲区
  1350. * len - 缓冲区长度
  1351. * @返回值:0-成功,非0-失败
  1352. */
  1353. int PAN312x_OpRegister(uint8_t op_reg_flag, uint16_t addr, void* buf, int len)
  1354. {
  1355. int ret;
  1356. if(op_reg_flag & OP_REG_FLAG_READ_INFO){
  1357. uint8_t txbuf[3] = {COMMAND_OP_REGISTER, OP_REG_FLAG_READ_INFO, addr};
  1358. ret = __PAN312xCmd_WriteRead(txbuf, 3, buf, 2);
  1359. if(ret == 1) ret = PAN312x_OK;
  1360. } else if(op_reg_flag & OP_REG_FLAG_WRITE){
  1361. uint8_t txbuf[33];
  1362. txbuf[0] = COMMAND_OP_REGISTER;
  1363. txbuf[1] = (op_reg_flag & 0xf0) | ((addr >> 8) & 0x07);
  1364. txbuf[2] = addr;
  1365. memcpy(txbuf + 3, buf, len);
  1366. ret = __PAN312xCmd_Write(txbuf, len + 3);
  1367. if(ret == len + 3) ret = PAN312x_OK;
  1368. } else {
  1369. uint8_t txbuf[4] = {COMMAND_OP_REGISTER, (op_reg_flag & 0xf0) | ((addr >> 8) & 0x07), addr, len};
  1370. ret = __PAN312xCmd_WriteRead(txbuf, 4, buf, len);
  1371. if(ret == len) ret = PAN312x_OK;
  1372. }
  1373. return ret;
  1374. }
  1375. /**
  1376. * @简介:设置sfr/data值,地址自增
  1377. * @参数:addr - sfr/data地址
  1378. * buff - 数据缓冲区
  1379. * len - 数据长度
  1380. * @返回值:实际设置的数据量
  1381. */
  1382. int PAN312x_SetDatas(uint8_t addr, const void* buff, int len)
  1383. {
  1384. int count = len;
  1385. uint8_t* ptr = (uint8_t*)buff;
  1386. uint8_t adr = addr;
  1387. while(len > 0){
  1388. int tx = len > 30 ? 30 : len;
  1389. int ret = PAN312x_OpRegister(OP_REG_FLAG_INC_ADDR | OP_REG_FLAG_WRITE, adr, ptr, tx);
  1390. if(ret != PAN312x_OK) return ret;
  1391. adr += tx;
  1392. ptr += tx;
  1393. len -= tx;
  1394. }
  1395. return count;
  1396. }
  1397. /**
  1398. * @简介:设置单个sfr/data数据
  1399. * @参数:addr - sfr/data地址
  1400. * value - sfr/data数据
  1401. * @返回值:0-成功,非0-失败
  1402. */
  1403. int PAN312x_SetData(uint8_t addr, uint8_t value)
  1404. {
  1405. int ret = PAN312x_SetDatas(addr, &value, 1);
  1406. return ret == 1 ? PAN312x_OK : ret;
  1407. }
  1408. /**
  1409. * @简介:获取sfr/data数据,地址自增
  1410. * @参数:addr - sfr/data地址
  1411. * buff - 数据缓冲区
  1412. * len - 数据长度
  1413. * @返回值:实际设置的数据量
  1414. */
  1415. int PAN312x_GetDatas(uint8_t addr, void* buff, int len)
  1416. {
  1417. int count = len;
  1418. uint8_t* ptr = (uint8_t*)buff;
  1419. uint8_t adr = addr;
  1420. while(len > 0){
  1421. int rx = len > 30 ? 30 : len;
  1422. int ret = PAN312x_OpRegister(OP_REG_FLAG_INC_ADDR, adr, ptr, rx);
  1423. if(ret != PAN312x_OK) return ret;
  1424. adr += rx;
  1425. ptr += rx;
  1426. len -= rx;
  1427. }
  1428. return count;
  1429. }
  1430. /**
  1431. * @简介:获取单个sfr/data数据
  1432. * @参数:addr - sfr/data地址
  1433. * @返回值:成功返回数据值,失败返回负数
  1434. */
  1435. int PAN312x_GetData(uint8_t addr)
  1436. {
  1437. uint8_t value;
  1438. if(PAN312x_GetDatas(addr, &value, 1) == 1){
  1439. return value;
  1440. }
  1441. return -1;
  1442. }
  1443. /**
  1444. * @简介:设置xdata数据,地址自增
  1445. * @参数:addr - xdata地址
  1446. * buff - 数据缓冲区
  1447. * len - 数据长度
  1448. * @返回值:实际设置的数据量
  1449. */
  1450. int PAN312x_SetXdatas(uint16_t addr, const void* buff, int len)
  1451. {
  1452. int count = len;
  1453. uint8_t* ptr = (uint8_t*)buff;
  1454. uint16_t adr = addr;
  1455. while(len > 0){
  1456. int tx = len > 30 ? 30 : len;
  1457. int ret = PAN312x_OpRegister(OP_REG_FLAG_INC_ADDR | OP_REG_FLAG_XDATA | OP_REG_FLAG_WRITE, adr, ptr, tx);
  1458. if(ret != PAN312x_OK) return ret;
  1459. adr += tx;
  1460. ptr += tx;
  1461. len -= tx;
  1462. }
  1463. return count;
  1464. }
  1465. /**
  1466. * @简介:设置单个xdata数据
  1467. * @参数:addr - xdata地址
  1468. * value - xdata数据
  1469. * @返回值:实际设置的数据量
  1470. */
  1471. int PAN312x_SetXdata(uint16_t addr, uint8_t value)
  1472. {
  1473. int ret = PAN312x_SetXdatas(addr, &value, 1);
  1474. return ret == 1 ? PAN312x_OK : ret;
  1475. }
  1476. /**
  1477. * @简介:获取xdata数据,地址自增
  1478. * @参数:addr - xdata地址
  1479. * buff - 数据缓冲区
  1480. * len - 缓冲区长度
  1481. * @返回值:实际获取的数据量
  1482. */
  1483. int PAN312x_GetXdatas(uint16_t addr, void* buff, int len)
  1484. {
  1485. int count = len;
  1486. uint8_t* ptr = (uint8_t*)buff;
  1487. uint16_t adr = addr;
  1488. while(len > 0){
  1489. int rx = len > 30 ? 30 : len;
  1490. int ret = PAN312x_OpRegister(OP_REG_FLAG_INC_ADDR | OP_REG_FLAG_XDATA, adr, ptr, rx);
  1491. if(ret != PAN312x_OK) return ret;
  1492. adr += rx;
  1493. ptr += rx;
  1494. len -= rx;
  1495. }
  1496. return count;
  1497. }
  1498. /**
  1499. * @简介:获取单个xdata数据
  1500. * @参数:addr - xdata地址
  1501. * @返回值:成功返回数据,失败返回负数
  1502. */
  1503. int PAN312x_GetXdata(uint16_t addr)
  1504. {
  1505. uint8_t value;
  1506. if(PAN312x_GetXdatas(addr, &value, 1) == 1){
  1507. return value;
  1508. }
  1509. return -1;
  1510. }
  1511. /**
  1512. * @简介:底层总线写数据(不加寄存器地址)
  1513. * @addr - INFO
  1514. * buff - 数据缓冲区
  1515. * len -
  1516. * @
  1517. */
  1518. int PAN312x_GetInfoDatas(uint8_t addr, void* buff, int len)
  1519. {
  1520. int count = len;
  1521. uint8_t* ptr = (uint8_t*)buff;
  1522. while(len > 0){
  1523. int ret = PAN312x_OpRegister(OP_REG_FLAG_READ_INFO, addr, ptr, 2);
  1524. if(ret != PAN312x_OK) return ret;
  1525. addr += 1;
  1526. ptr += 2;
  1527. len -= 2;
  1528. }
  1529. return count;
  1530. }
  1531. /**
  1532. * @简介:强制进入READY状态,非休眠状态下有效
  1533. * @addr - INFO
  1534. * @简介:底层总线写数据(不加寄存器地址)
  1535. */
  1536. int PAN312x_GetInfoData(uint8_t addr)
  1537. {
  1538. uint16_t value;
  1539. if(PAN312x_GetInfoDatas(addr, &value, 2) == 2){
  1540. return value;
  1541. }
  1542. return -1;
  1543. }
  1544. /**
  1545. * @简介:设置PAN312x进入Tx
  1546. * @参数:channel: 信道
  1547. * condition: 条件标志,参考PAN312xStartCond
  1548. * tx_len: 发送数据长度
  1549. * @返回值:0-成功,非0-失败
  1550. */
  1551. int PAN312x_Enter_Tx(uint16_t channel, uint8_t condition, uint16_t tx_len)
  1552. {
  1553. uint8_t txbuf[6] = {
  1554. COMMAND_START_TX,
  1555. channel, channel >> 8,
  1556. condition,
  1557. tx_len, (tx_len >> 8) & 0x1f
  1558. };
  1559. int ret = __PAN312xCmd_Write(txbuf, 6);
  1560. return ret == 6 ? PAN312x_OK : ret;
  1561. }
  1562. /**
  1563. * @简介:设置PAN312x进入Rx
  1564. * @参数:channel: 信道
  1565. * condition: 条件标志,参考PAN312xStartCond
  1566. * rx_len: 接收数据长度
  1567. * 注意:可变包长帧结构时,该参数设置为0x00
  1568. * 固定包长帧结构时,该参数需要与发端的数据长度一致
  1569. * @返回值:0-成功,非0-失败
  1570. */
  1571. int PAN312x_Enter_Rx(uint16_t channel, uint8_t condition, uint16_t rx_len)
  1572. {
  1573. uint8_t txbuf[6] = {
  1574. COMMAND_START_RX,
  1575. channel, channel >> 8,
  1576. condition,
  1577. rx_len, (rx_len >> 8) & 0x1f
  1578. };
  1579. int ret = __PAN312xCmd_Write(txbuf, 6);
  1580. return ret == 6 ? PAN312x_OK : ret;
  1581. }
  1582. /**
  1583. * @简介:PAN312x发送ACK
  1584. * @参数:无
  1585. * @返回值:0-成功,非0-失败
  1586. */
  1587. int PAN312x_Tx_Ack(void)
  1588. {
  1589. uint8_t cmd = COMMAND_TX_ACK;
  1590. int ret = __PAN312xCmd_Write(&cmd, 1);
  1591. return ret == 1 ? PAN312x_OK : ret;
  1592. }
  1593. /**
  1594. * @简介:设置PAN312x进入sleep状态
  1595. * @参数:sleep_mode - 休眠模式,参考PAN312x_SleepMode_t
  1596. * wake_up_state - 唤醒后进入状态(仅NormalSleep有效),参考PAN312x_WakeUpState_t
  1597. * @返回值:无
  1598. */
  1599. int PAN312x_Enter_Sleep(PAN312xSleepMode sleep_mode, PAN312xWakeUpState wake_up_state)
  1600. {
  1601. uint8_t txbuf[2] = {
  1602. COMMAND_GO_SLEEP,
  1603. (sleep_mode == DEEP_SLEEP_MODE ? 0x08 : 0x00) | (wake_up_state & 0x03)
  1604. };
  1605. int ret = PAN312xRaw_Write(txbuf, 2);
  1606. return ret == 2 ? PAN312x_OK : ret;
  1607. }
  1608. /**
  1609. * @简介:强制进入READY状态,非休眠状态下有效
  1610. * @参数:无
  1611. * @返回值:0-成功,非0-失败
  1612. */
  1613. int PAN312x_Enter_Ready(void)
  1614. {
  1615. uint8_t cmd = COMMAND_GO_READY;
  1616. int ret = __PAN312xCmd_Write(&cmd, 1);
  1617. return ret == 1 ? PAN312x_OK : ret;
  1618. }
  1619. /**
  1620. * @简介:设置属性寄存器
  1621. * @参数:group- 寄存器地址
  1622. * num_value - 缓冲区长度
  1623. * value - 寄存器值缓冲区
  1624. * @返回值:0-成功,非0-失败
  1625. */
  1626. int PAN312x_Set_Property(uint16_t group, uint8_t num_value, const void* value)
  1627. {
  1628. uint8_t txbuf[33];
  1629. txbuf[0] = COMMAND_SET_PROPERTY;
  1630. txbuf[1] = group >> 8;
  1631. txbuf[2] = group;
  1632. memcpy(txbuf + 3, value, num_value);
  1633. int ret = __PAN312xCmd_Write(txbuf, num_value + 3);
  1634. return ret == num_value + 3 ? PAN312x_OK : ret;
  1635. }
  1636. /**
  1637. * @简介:设置1个字节的属性寄存器值
  1638. * @参数:group- 寄存器地址
  1639. * value - 值
  1640. * @返回值:0-成功,非0-失败
  1641. */
  1642. int PAN312x_Set_PropertyB1(uint16_t group, uint8_t value)
  1643. {
  1644. int ret = PAN312x_Set_Property(group, 1, &value);
  1645. return ret == 1 ? PAN312x_OK : ret;
  1646. }
  1647. /**
  1648. * @简介:设置2个字节的属性寄存器值
  1649. * @参数:group- 寄存器地址
  1650. * value - 值
  1651. * @返回值:0-成功,非0-失败
  1652. */
  1653. int PAN312x_Set_PropertyB2(uint16_t group, uint16_t value)
  1654. {
  1655. int ret = PAN312x_Set_Property(group, 2, &value);
  1656. return ret == 2 ? PAN312x_OK : ret;
  1657. }
  1658. /**
  1659. * @简介:设置3个字节的属性寄存器值
  1660. * @参数:group- 寄存器地址
  1661. * value - 值
  1662. * @返回值:0-成功,非0-失败
  1663. */
  1664. int PAN312x_Set_PropertyB3(uint16_t group, uint32_t value)
  1665. {
  1666. int ret = PAN312x_Set_Property(group, 3, &value);
  1667. return ret == 3 ? PAN312x_OK : ret;
  1668. }
  1669. /**
  1670. * @简介:设置4个字节的属性寄存器值
  1671. * @参数:group- 寄存器地址
  1672. * value - 值
  1673. * @返回值:0-成功,非0-失败
  1674. */
  1675. int PAN312x_Set_PropertyB4(uint16_t group, uint32_t value)
  1676. {
  1677. int ret = PAN312x_Set_Property(group, 4, &value);
  1678. return ret == 4 ? PAN312x_OK : ret;
  1679. }
  1680. /**
  1681. * @简介:获取属性寄存器
  1682. * @参数:group- 寄存器地址
  1683. * num_value - 缓冲区长度
  1684. * value - 寄存器值缓冲区
  1685. * @返回值:0-成功,非0-失败
  1686. */
  1687. int PAN312x_Get_Property(uint16_t group, uint8_t num_value, void *value)
  1688. {
  1689. uint8_t txbuf[4] = {
  1690. COMMAND_GET_PROPERTY,
  1691. num_value, group >> 8, group
  1692. };
  1693. int ret = __PAN312xCmd_WriteRead(txbuf, 4, value, num_value);
  1694. return ret == num_value ? PAN312x_OK : ret;
  1695. }
  1696. /**
  1697. * @简介:获取1个字节的属性寄存器值
  1698. * @参数:group- 寄存器地址
  1699. * value - 值
  1700. * @返回值:0-成功,非0-失败
  1701. */
  1702. int PAN312x_Get_PropertyB1(uint16_t group)
  1703. {
  1704. uint8_t value;
  1705. int ret = PAN312x_Get_Property(group, 1, &value);
  1706. return ret == PAN312x_OK ? value : ret;
  1707. }
  1708. /**
  1709. * @简介:获取2个字节的属性寄存器值
  1710. * @参数:group- 寄存器地址
  1711. * value - 值
  1712. * @返回值:0-成功,非0-失败
  1713. */
  1714. int PAN312x_Get_PropertyB2(uint16_t group)
  1715. {
  1716. uint16_t value = 0;
  1717. int ret = PAN312x_Get_Property(group, 2, &value);
  1718. return ret == PAN312x_OK ? value : ret;
  1719. }
  1720. /**
  1721. * @简介:获取3个字节的属性寄存器值
  1722. * @参数:group- 寄存器地址
  1723. * value - 值
  1724. * @返回值:0-成功,非0-失败
  1725. */
  1726. int PAN312x_Get_PropertyB3(uint16_t group)
  1727. {
  1728. uint32_t value = 0;
  1729. int ret = PAN312x_Get_Property(group, 3, &value);
  1730. return ret == PAN312x_OK ? value : ret;
  1731. }
  1732. /**
  1733. * @简介:获取4个字节的属性寄存器值
  1734. * @参数:group- 寄存器地址
  1735. * value - 值
  1736. * @返回值:返回寄存器值,注意该函数无法区分是否发生错误
  1737. */
  1738. uint32_t PAN312x_Get_PropertyB4(uint16_t group)
  1739. {
  1740. uint32_t value;
  1741. PAN312x_Get_Property(group, 4, &value);
  1742. return value;
  1743. }
  1744. /**
  1745. * @简介:读取芯片当前工作状态
  1746. * @参数:无
  1747. * @返回值: 芯片状态(GET_STATUS字节1低3位)
  1748. */
  1749. uint8_t PAN312x_Get_ChipState(void)
  1750. {
  1751. uint32_t status;
  1752. uint8_t cmd = COMMAND_GET_STATUS;
  1753. int ret = __PAN312xCmd_WriteRead(&cmd, 1, &status, 4);
  1754. //memcpy(pIrqStatus, &status, 4);
  1755. return (uint8_t)((status >> 8) & 0x07);
  1756. }
  1757. /**
  1758. * @简介:启动DutyCycle
  1759. * @参数:sleep_now:
  1760. 0x00:启动DutyCycle时,发送一包报数据,然后休眠
  1761. 0x01:启动DutyCycle时,立即休眠(Sleep)
  1762. * @返回值:0-成功,非0-失败
  1763. */
  1764. int PAN312x_Enter_DutyCycle(uint8_t sleep_now)
  1765. {
  1766. uint8_t txbuf[2] = {
  1767. COMMAND_DUTY_CYCLE,
  1768. sleep_now ? 0x08 : 0x00
  1769. };
  1770. int ret = sleep_now ? PAN312xRaw_Write(txbuf, 2) : __PAN312xCmd_Write(txbuf, 2);
  1771. return ret == 2 ? PAN312x_OK : ret;
  1772. }
  1773. /**
  1774. * @简介:退出DutyCycle
  1775. * @参数:无
  1776. * @返回值:无
  1777. */
  1778. int PAN312x_Exit_DutyCycle(uint32_t timeout)
  1779. {
  1780. // int ret;
  1781. // uint32_t tick0 = sys_tick_get();
  1782. // //PAN312x_WaitCtsOk();
  1783. // do{
  1784. // ret = PAN312x_CheckCts();
  1785. // // printf("CtsRetValue: %d\r\n", ret);
  1786. // if(ret == PAN312x_OK){
  1787. // PAN312x_Enter_Ready();
  1788. // PAN312x_Irq_Clear_AllStatus();
  1789. // PAN312x_FlushTxFifoRxFifo();
  1790. // PAN312x_Reset_Modem();
  1791. // PAN312x_WutDisable();
  1792. // break;
  1793. // } else if(timeout) {
  1794. // uint32_t ticks = sys_tick_get() - tick0;
  1795. // if(ticks >= timeout){
  1796. // return PAN312x_TIMEOUT;
  1797. // }
  1798. // }
  1799. // }while(1);
  1800. return PAN312x_OK;
  1801. }
  1802. /**
  1803. * @简介:获取PAN312x的irq的状态
  1804. * @参数:pIrqStatus:参考PAN312xIrqs;
  1805. * @返回值:无
  1806. */
  1807. int PAN312x_Irq_Get_Status(PAN312xIrqs* pIrqStatus)
  1808. {
  1809. uint32_t status;
  1810. uint8_t cmd = COMMAND_GET_STATUS;
  1811. int ret = __PAN312xCmd_WriteRead(&cmd, 1, &status, 4);
  1812. memcpy(pIrqStatus, &status, 4);
  1813. return ret == 4 ? PAN312x_OK : ret;
  1814. }
  1815. /**
  1816. * @简介:清除PAN312x的所有irq的状态
  1817. * @参数:无;
  1818. * @返回值:无
  1819. */
  1820. int PAN312x_Irq_Clear_AllStatus(void)
  1821. {
  1822. uint32_t status = 0xffffffff;
  1823. uint8_t txbuf[5];
  1824. txbuf[0] = COMMAND_CLEAR_STATUS;
  1825. memcpy(txbuf + 1, &status, 4);
  1826. int ret = __PAN312xCmd_Write(txbuf, 5);
  1827. return ret == 5 ? PAN312x_OK : ret;
  1828. }
  1829. /**
  1830. * @简介:清除PAN312x的irq的状态
  1831. * @参数:pIrqStatus:参考PAN312xIrqs;
  1832. * @返回值:无
  1833. */
  1834. int PAN312x_Irq_Clear_Status(PAN312xIrqs pIrqStatus)
  1835. {
  1836. uint32_t status;
  1837. memcpy(&status, &pIrqStatus, 4);
  1838. status &= ~(IRQ_STATUS_FW_STATE | IRQ_STATUS_DUTYCYCLE_FLAG);
  1839. uint8_t txbuf[5];
  1840. txbuf[0] = COMMAND_CLEAR_STATUS;
  1841. memcpy(txbuf + 1, &status, 4);
  1842. int ret = __PAN312xCmd_Write(txbuf, 5);
  1843. return ret == 5 ? PAN312x_OK : ret;
  1844. }
  1845. /**
  1846. * @简介:清除PAN312x的tx fifo的状态
  1847. * @参数:pIrqStatus:参考PAN312xIrqs;
  1848. * @返回值:无
  1849. */
  1850. int PAN312x_Irq_Clear_TxFifo_Status(PAN312xIrqs pIrqStatus)
  1851. {
  1852. uint32_t status;
  1853. memcpy(&status, &pIrqStatus, 4);
  1854. status &= ~(IRQ_STATUS_FW_STATE | IRQ_STATUS_DUTYCYCLE_FLAG);
  1855. uint8_t txbuf[5];
  1856. txbuf[0] = COMMAND_CLEAR_STATUS;
  1857. memcpy(txbuf + 1, &status, 4);
  1858. int ret = __PAN312xCmd_Write(txbuf, 5);
  1859. return ret == 5 ? PAN312x_OK : ret;
  1860. }
  1861. /**
  1862. * @简介:清除PAN312x的rx fifo的状态
  1863. * @参数:无;
  1864. * @返回值:无
  1865. */
  1866. int PAN312x_Irq_Clear_RxFifo_Status(void)
  1867. {
  1868. uint32_t status = IRQ_STATUS_RX_FIFO;
  1869. status &= ~(IRQ_STATUS_FW_STATE | IRQ_STATUS_DUTYCYCLE_FLAG);
  1870. uint8_t txbuf[5];
  1871. txbuf[0] = COMMAND_CLEAR_STATUS;
  1872. memcpy(txbuf + 1, &status, 4);
  1873. int ret = __PAN312xCmd_Write(txbuf, 5);
  1874. return ret == 5 ? PAN312x_OK : ret;
  1875. }
  1876. /**
  1877. * @简介:清除PAN312x的rx done的状态
  1878. * @参数:无
  1879. * @返回值:无
  1880. */
  1881. int PAN312x_Irq_Clear_RxDone_Status(void)
  1882. {
  1883. uint32_t status = IRQ_STATUS_RX_DONE | IRQ_STATUS_RX_FIFO;
  1884. status &= ~(IRQ_STATUS_FW_STATE | IRQ_STATUS_DUTYCYCLE_FLAG);
  1885. uint8_t txbuf[5];
  1886. txbuf[0] = COMMAND_CLEAR_STATUS;
  1887. memcpy(txbuf + 1, &status, 4);
  1888. int ret = __PAN312xCmd_Write(txbuf, 5);
  1889. return ret == 5 ? PAN312x_OK : ret;
  1890. }
  1891. /**
  1892. * @简介:清除PAN312x的rx crc error的状态
  1893. * @参数:无
  1894. * @返回值:无
  1895. */
  1896. int PAN312x_Irq_Clear_RxCrcError_Status(void)
  1897. {
  1898. uint32_t status = IRQ_STATUS_CRC_ERROR | IRQ_STATUS_RX_FIFO;
  1899. status &= ~(IRQ_STATUS_FW_STATE | IRQ_STATUS_DUTYCYCLE_FLAG);
  1900. uint8_t txbuf[5];
  1901. txbuf[0] = COMMAND_CLEAR_STATUS;
  1902. memcpy(txbuf + 1, &status, 4);
  1903. int ret = __PAN312xCmd_Write(txbuf, 5);
  1904. return ret == 5 ? PAN312x_OK : ret;
  1905. }
  1906. /**
  1907. * @简介:获取PAN312x的GpioIrq 使能的状态
  1908. * @参数:无
  1909. * @返回值:GpioIrq 使能的状态值
  1910. */
  1911. uint32_t PAN312x_Get_GpioIrq_EnableStatus(void)
  1912. {
  1913. return PAN312x_Get_PropertyB3(PROPERTY_ADDR_IRQ_ENABLE);
  1914. }
  1915. /**
  1916. * @简介:使能or失能某个中断映射到Gpio引脚上
  1917. * @参数:status:
  1918. * @返回值:无
  1919. */
  1920. void PAN312x_GpioIrq_EnableStatus(uint32_t status)
  1921. {
  1922. PAN312x_Set_PropertyB3(PROPERTY_ADDR_IRQ_ENABLE, status);
  1923. }
  1924. /**
  1925. * @简介:将PAN312x的中断映射到PAN312x的irq(GPIO8)引脚上
  1926. * @参数:pIrqStatus:参考PAN312xIrqList;
  1927. * xNewState: 0:enable
  1928. * 1:disable
  1929. * @返回值:无
  1930. */
  1931. void PAN312x_GpioIrq_Config(PAN312xIrqList xIrq, SFunctionalState xNewState)
  1932. {
  1933. uint32_t status = PAN312x_Get_GpioIrq_EnableStatus();
  1934. uint32_t newsts = xNewState ? (status | xIrq) : (status & (~xIrq));
  1935. if(status != newsts){
  1936. PAN312x_GpioIrq_EnableStatus(newsts);
  1937. }
  1938. }
  1939. /**
  1940. * @简介:设置PAN312x的包过滤控制
  1941. * @参数:epat1: 0:
  1942. * 1:
  1943. * epat2: 0:
  1944. * 1:
  1945. * epat3: 0:
  1946. * 1:
  1947. * inten: 0: 失能node id中断
  1948. * 1: 使能node id中断
  1949. * reset: 0:node id不匹配时,不丢弃数据,继续接收
  1950. 1:node id不匹配时,丢弃已接收的数据,继续接收
  1951. * @返回值:无
  1952. */
  1953. void PAN312x_Set_PacketFilter_Ctrl(uint8_t PacketFilterCtrl)
  1954. {
  1955. //uint8_t tmp = 0x00;
  1956. //tmp |= (inten << 7) | (epat3 << 6) | (epat2 << 5) | (epat1 << 4) | (reset << 3);
  1957. PAN312x_Set_PropertyB1(PROPERTY_ADDR_PACKET_FILTER_CTRL, PacketFilterCtrl);
  1958. }
  1959. /**
  1960. * @简介:设置PAN312x的包过滤掩码
  1961. * @参数:pat_mask:
  1962. * @返回值:无
  1963. */
  1964. void PAN312x_Set_PacketFilter_Mask(uint32_t pat_mask)
  1965. {
  1966. PAN312x_Set_PropertyB4(PROPERTY_ADDR_PACKET_FILTER_MASK, pat_mask);
  1967. }
  1968. /**
  1969. * @简介:设置PAN312x的包过滤pat1_value
  1970. * @参数: pat1_value:
  1971. * @返回值:无
  1972. */
  1973. void PAN312x_Set_PacketFilter_Pat1Value(uint32_t pat1_value)
  1974. {
  1975. PAN312x_Set_PropertyB4(PROPERTY_ADDR_PACKET_FILTER_PAT1, pat1_value);
  1976. }
  1977. /**
  1978. * @简介:设置PAN312x的包过滤pat2_value
  1979. * @参数: pat2_value:
  1980. * @返回值:无
  1981. */
  1982. void PAN312x_Set_PacketFilter_Pat2Value(uint32_t pat2_value)
  1983. {
  1984. PAN312x_Set_PropertyB4(PROPERTY_ADDR_PACKET_FILTER_PAT2, pat2_value);
  1985. }
  1986. /**
  1987. * @简介:设置PAN312x的包过滤pat3_value
  1988. * @参数: pat3_value:
  1989. * @返回值:无
  1990. */
  1991. void PAN312x_Set_PacketFilter_Pat3Value(uint32_t pat3_value)
  1992. {
  1993. PAN312x_Set_PropertyB4(PROPERTY_ADDR_PACKET_FILTER_PAT3, pat3_value);
  1994. }
  1995. /**
  1996. * @简介:设置PAN312x的NodeId
  1997. * @参数: nodeid_length : nodeid的长度(最大4bytes)
  1998. * nodeid_position(该参数只针对rx有效):
  1999. 0 nodeid before length
  2000. * 1 nodeid after length
  2001. * @返回值:无
  2002. */
  2003. void PAN312x_Set_Rx_NodeId_Config(uint8_t nodeid_length, uint8_t nodeid_position)
  2004. {
  2005. uint8_t tmp = (nodeid_length << 2) | (nodeid_position << 1);
  2006. PAN312x_Set_PropertyB1(PROPERTY_ADDR_NODE_ID_CONF, tmp);
  2007. }
  2008. /**
  2009. * @简介:获取PAN312x接收的NodeId的值
  2010. * @参数: nodeid_value : nodeid_value的值
  2011. * @返回值:无
  2012. * 备注:
  2013. * 这个只支持如下帧结构:
  2014. * preamble + syncword + node_id + length + data + crc
  2015. */
  2016. uint32_t PAN312x_Get_Rx_NodeId_Value(void)
  2017. {
  2018. return PAN312x_Get_PropertyB4(PROPERTY_ADDR_RX_NODE_ID);
  2019. }
  2020. /**
  2021. * @简介:设置PAN3110的Tx NodeId的长度
  2022. * @参数: nodeid_length : nodeid的长度(最大4bytes)
  2023. * @返回值:无
  2024. * 备注:tx时,只支持node id在前的帧结构
  2025. * nodeid_length = 0时,帧结构为preamble + syncword + length + data + crc;
  2026. * nodeid_length非0时,帧结构为preamble + nodeid + syncword + length + data + crc;
  2027. */
  2028. void PAN312x_Set_Tx_NodeId_Lnegth(uint8_t nodeid_length)
  2029. {
  2030. uint8_t tmp = (nodeid_length << 5);
  2031. PAN312x_Set_PropertyB1(PROPERTY_ADDR_NODE_ID_CONF, tmp);
  2032. }
  2033. /**
  2034. * @简介:设置PAN312x的NodeId的值
  2035. * @参数: nodeid_value : nodeid_value的值
  2036. * @返回值:无
  2037. * 备注:
  2038. * 这个只支持如下帧结构:
  2039. * preamble + syncword + node_id + length + data + crc
  2040. */
  2041. void PAN312x_Set_Tx_NodeId_Value(uint32_t nodeid_value)
  2042. {
  2043. PAN312x_Set_PropertyB4(PROPERTY_ADDR_R11C_REG_NODE_ID_L1, nodeid_value);
  2044. }
  2045. /**
  2046. * @简介:设置PAN312x的TxPacket
  2047. * @参数:crc_state: 0 失能crc
  2048. * 1 使能crc
  2049. * packet_type: 0 固定包长
  2050. * 1 可变包长
  2051. * @返回值:无
  2052. */
  2053. void PAN312x_Set_TxPacket_Config(PAN312xTxPacketConfig TxPacketConfig)
  2054. {
  2055. PAN312x_Set_PropertyB1(PROPERTY_ADDR_TXPKT_CONF, TxPacketConfig);
  2056. }
  2057. /**
  2058. * @简介:设置PAN312x的TxPacket Number
  2059. * @参数:number:
  2060. * @返回值:无
  2061. */
  2062. void PAN312x_Set_TxPacket_ExtraNumber(uint8_t number)
  2063. {
  2064. PAN312x_Set_PropertyB1(PROPERTY_ADDR_TX_REPEAT_TIMES, number);
  2065. }
  2066. /**
  2067. * @简介:设置PAN312x的TxPacket Gap
  2068. * @参数:gap:(单位:1us))
  2069. * @返回值:无
  2070. */
  2071. void PAN312x_Set_TxPacket_Gap(uint16_t gap)
  2072. {
  2073. PAN312x_Set_PropertyB2(PROPERTY_ADDR_TX_PACKET_GAP, gap);
  2074. }
  2075. /**
  2076. * @简介:设置PAN312x的退出当前状态后的状态
  2077. * @参数:cond:参考 PAN312x_ExitStateCond_t
  2078. * state:参考 PAN312x_State_t
  2079. * @返回值:无
  2080. */
  2081. void PAN312x_Set_ExitState(PAN312xExitStateCond cond, PAN312xState state)
  2082. {
  2083. PAN312x_Set_PropertyB1(cond, state & 0x03);
  2084. }
  2085. /**
  2086. * 注意:可变包长帧结构时,该参数设置为0x00
  2087. * @cond PAN312x_ExitStateCond_t
  2088. * @
  2089. */
  2090. PAN312xState PAN312x_Get_ExitState(PAN312xExitStateCond cond)
  2091. {
  2092. return (PAN312xState)PAN312x_Get_PropertyB1(cond);
  2093. }
  2094. /**
  2095. * @简介:PAN312x Tx Ok后,rf的退出状态
  2096. * @参数:state:参考PAN312x_State_t
  2097. * @返回值:无
  2098. */
  2099. void PAN312x_Set_TxOk_ExitState(PAN312xState state)
  2100. {
  2101. PAN312x_Set_ExitState(EXIT_STATE_COND_TX_OK, state);
  2102. }
  2103. /**
  2104. * @简介:设置PAN312x的RxPacket
  2105. * @参数:crc_host: 0: 由mcu来自己计算crc
  2106. * 1: 由PAN312x固件来计算crc,同时需要使能crc,失能硬件计算crc
  2107. * crc_hardware: 0: 失能硬件计算crc
  2108. * 1: 使能引荐计算crc,同时需要使能crc
  2109. * crc_state: 0: 失能crc
  2110. * 1: 使能crc
  2111. * read_pl_by_cmd:
  2112. * length_in_payload:
  2113. * rx_packet_type: 0:固定包长
  2114. * 1:可变包长
  2115. *
  2116. * @返回值:接收的数据长度
  2117. */
  2118. void PAN312x_Set_RxPacket_Config(PAN312xRxPacketConfig RxPacketConfig)
  2119. {
  2120. PAN312x_Set_PropertyB1(PROPERTY_ADDR_RXPKT_CONF, RxPacketConfig);
  2121. }
  2122. /**
  2123. * @简介:设置PAN312x Rx Timeout时间
  2124. * @参数:rx_time_out:单位(us)
  2125. * @返回值:无
  2126. */
  2127. void PAN312x_Set_RxTimeOut(uint32_t rx_time_out)
  2128. {
  2129. PAN312x_Set_PropertyB4(PROPERTY_ADDR_RX_TIMEOUT, rx_time_out);
  2130. }
  2131. /**
  2132. * @简介:设置PAN312x Rx Timeout2时间
  2133. * @参数:rx_time_out_2:单位(us)
  2134. * @返回值: 无
  2135. */
  2136. void PAN312x_Set_RxTimeOut2(uint32_t rx_time_out_2)
  2137. {
  2138. PAN312x_Set_PropertyB4(PROPERTY_ADDR_RX_TIMEOUT2, rx_time_out_2);
  2139. }
  2140. /**
  2141. * @简介:设置Rx Timeout2使能条件
  2142. * @参数:Cond:参考PAN312xRxTimeout2EnableCond
  2143. * @返回值: 无
  2144. */
  2145. void PAN312x_Set_RxTimeout2EnableCond(PAN312xRxTimeout2EnableCond Cond)
  2146. {
  2147. PAN312x_Set_PropertyB1(PROPERTY_ADDR_RXPKT_CONF2, Cond);
  2148. }
  2149. /**
  2150. * @简介:PAN312x Rx Timeout后,从rx退出后的状态
  2151. * @参数:state:参考PAN312x_State_t
  2152. * @返回值:无
  2153. */
  2154. void PAN312x_Set_RxTimeout_ExitState(PAN312xState state)
  2155. {
  2156. PAN312x_Set_ExitState(EXIT_STATE_COND_RX_TIMEOUT, state);
  2157. }
  2158. /**
  2159. * @简介:PAN312x Rx Invalid(CRC ERROR)后,rf的退出状态
  2160. * @参数:state:参考PAN312x_State_t
  2161. * @返回值:无
  2162. */
  2163. void PAN312x_Set_RxInvalid_ExitState(PAN312xState state)
  2164. {
  2165. PAN312x_Set_ExitState(EXIT_STATE_COND_RX_INVALID, state);
  2166. }
  2167. /**
  2168. * @简介:PAN312x Rx Valid(RX DONE)后,rf的退出状态
  2169. * @参数:state:参考PAN312x_State_t
  2170. * @返回值:无
  2171. */
  2172. void PAN312x_Set_RxValid_ExitState(PAN312xState state)
  2173. {
  2174. PAN312x_Set_ExitState(EXIT_STATE_COND_RX_VALID, state);
  2175. }
  2176. void PAN312x_Set_AckError_ExitState(PAN312xState state)
  2177. {
  2178. PAN312x_Set_ExitState(EXIT_STATE_COND_ACK_ERROR, state);
  2179. }
  2180. /**
  2181. * @简介:读取自动应答接收字节
  2182. * @参数:无
  2183. * @返回值: 应答字节
  2184. */
  2185. uint8_t PAN312x_GetAckRxByte(void)
  2186. {
  2187. return PAN312x_Get_PropertyB1(PROPERTY_ADDR_RX_ACK_BYTE);
  2188. }
  2189. /**
  2190. * @简介:设置自动应答发送字节
  2191. * @参数:AckTxByte:应答发送字节
  2192. * @返回值: 无
  2193. */
  2194. void PAN312x_SetAckTxByte(uint8_t AckTxByte)
  2195. {
  2196. PAN312x_Set_PropertyB1(PROPERTY_ADDR_TX_ACK_BYTE, AckTxByte);
  2197. }
  2198. /**
  2199. * @简介:设置自动应答校验字节
  2200. * @参数:AckCheckByte:应答校验字节
  2201. * @返回值: 无
  2202. */
  2203. void PAN312x_SetAckCheckByte(uint8_t AckCheckByte)
  2204. {
  2205. PAN312x_Set_PropertyB1(PROPERTY_ADDR_ACK_CHECK_BYTE, AckCheckByte);
  2206. }
  2207. /**
  2208. * @简介:设置PAN312x Ack Timeout时间
  2209. * @参数:ack_time_out: 单位(us)
  2210. * @返回值:无
  2211. */
  2212. void PAN312x_Set_AckTimeOut(uint32_t ack_time_out)
  2213. {
  2214. PAN312x_Set_PropertyB4(PROPERTY_ADDR_ACK_TIMEOUT, ack_time_out);
  2215. }
  2216. /**
  2217. * @简介:PAN312x Ack Timeout后,rf的退出状态
  2218. * @参数:state:参考PAN312x_State_t
  2219. * @返回值:无
  2220. * 备注:tx端发送完数据,转为rx,如果一直未接收到ack,直至AckTimeout后,rf退出后的状态
  2221. */
  2222. void PAN312x_Set_AckTimeout_ExitState(PAN312xState state)
  2223. {
  2224. PAN312x_Set_ExitState(EXIT_STATE_COND_ACK_TIMEOUT, state);
  2225. }
  2226. /**
  2227. * @简介:单位:10us
  2228. * @参数:state:参考PAN312x_State_t
  2229. * @返回值:无
  2230. * 备注:
  2231. */
  2232. void PAN312x_Set_AckTxDelay1(uint8_t delay1)
  2233. {
  2234. PAN312x_Set_PropertyB1(PROPERTY_ADDR_ACK_TX_DELAY1, delay1);
  2235. }
  2236. /**
  2237. * @简介:单位:1us
  2238. * @参数:delay2
  2239. * @返回值:无
  2240. * 备注:
  2241. */
  2242. void PAN312x_Set_AckTxDelay2(uint8_t delay2)
  2243. {
  2244. PAN312x_Set_PropertyB1(PROPERTY_ADDR_ACK_TX_DELAY2, delay2);
  2245. }
  2246. /**
  2247. * @简介:设置DutyCycle基准时间
  2248. * @参数:BaseTime
  2249. * @返回值:无
  2250. * 备注:最小时间62.5us
  2251. */
  2252. void PAN312x_Set_BaseDutyCycleTime(uint32_t BaseTime)
  2253. {
  2254. PAN312x_Set_PropertyB3(PROPERTY_ADDR_DUTY_CYCLE_BASE, BaseTime);
  2255. }
  2256. /**
  2257. * @简介:设置PAN312x 系统控制
  2258. * @参数:ctrl:参考PAN312x_SysCtrl_t
  2259. * @返回值:无
  2260. */
  2261. void PAN312x_System_Ctrl(PAN312xSysCtrl ctrl)
  2262. {
  2263. PAN312x_Set_PropertyB1(PROPERTY_ADDR_SYS_CTRL0, ctrl);
  2264. }
  2265. /**
  2266. * @简介:获取PAN312x的接收数据长度
  2267. * @参数:无
  2268. * @返回值:接收的数据长度
  2269. */
  2270. uint16_t PAN312x_Get_Rx_Length(void)
  2271. {
  2272. return PAN312x_Get_PropertyB2(PROPERTY_ADDR_RX_LENGTH_IN_PACKET);
  2273. }
  2274. /**
  2275. * @简介:获取当前接收包内的数据长度
  2276. * @参数:无
  2277. * @返回值: 接收数据长度
  2278. */
  2279. uint16_t PAN312x_Get_RxLengthInPacket(void)
  2280. {
  2281. return PAN312x_Get_PropertyB2(PROPERTY_ADDR_RX_LENGTH_IN_PACKET);
  2282. }
  2283. uint16_t PAN312x_Get_RxLengthInFifo(void)
  2284. {
  2285. return PAN312x_Get_PropertyB2(PROPERTY_ADDR_RX_LENGTH_IN_FIFO);
  2286. }
  2287. /**
  2288. * @简介:PAN312x 向FIFO写数据
  2289. * @参数:uint8_t *buffer,数组指针 uint8_t size长度
  2290. * @返回值:无
  2291. */
  2292. void PAN312x_Write_Fifo(const void *buffer, uint8_t size )
  2293. {
  2294. if(size == 0 || size > 128){
  2295. return;
  2296. }
  2297. PAN312xReg_Write(0x01, buffer, size);
  2298. }
  2299. /**
  2300. * @简介:PAN312x 向FIFO读数据
  2301. * @参数:uint8_t *buffer,数组指针 uint8_t size长度
  2302. * @返回值:uint8_t *buffer 存储读取内容
  2303. */
  2304. void PAN312x_Read_Fifo( uint8_t *buffer, uint8_t size )
  2305. {
  2306. if(size == 0 || size > 128){
  2307. return;
  2308. }
  2309. PAN312xReg_Read(0x01, buffer, size);
  2310. }
  2311. /**
  2312. * @简介:PAN312x通过命令获取SPI接收数据,固件计算CRC时必须使用该接口
  2313. * @参数:ubuf - 数据缓冲区
  2314. * len - 缓冲区长度
  2315. * @返回值:0-成功,非0-失败
  2316. */
  2317. int PAN312x_Get_RxDataByCmd(void *data, uint8_t length)
  2318. {
  2319. uint8_t cmd = COMMAND_GET_RXDATA;
  2320. int ret = __PAN312xCmd_WriteRead(&cmd, 1, data, length);
  2321. return ret == length ? PAN312x_OK : ret;
  2322. }
  2323. /**
  2324. * @简介:设置PAN312x的可变包长length为几个bytes
  2325. * @参数:LengthFieldConfig:
  2326. * 0: 1 bytes
  2327. * 1: 2 bytes
  2328. * @返回值: 无
  2329. */
  2330. void PAN312x_SetLengthFiled(PAN312xLengthFieldConfig LengthFieldConfig)
  2331. {
  2332. uint8_t tmp;
  2333. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R11B);
  2334. tmp &= ~PROPERTY_MSK_R11B_REG_VIA_LENGTH_LEN;
  2335. tmp |= (LengthFieldConfig << 7);
  2336. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R11B, tmp);
  2337. }
  2338. /**
  2339. * @简介:设置PAN312x的可变包长lengthField的大小端
  2340. * @参数:number_byte:
  2341. * 0: 小端
  2342. * 1: 大端
  2343. * @返回值: 无
  2344. */
  2345. void PAN312x_SetLengthFiledEndian(uint8_t endian)
  2346. {
  2347. uint8_t tmp;
  2348. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12B);
  2349. tmp &= ~PROPERTY_MSK_R12B_REG_VIA_LEN_ENDIAN;
  2350. tmp |= (endian << 5);
  2351. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12B, tmp);
  2352. }
  2353. /**
  2354. * @简介:设置PAN312x的Payload Manchester mode
  2355. * @参数:mode:参考PAN312x_MANCHESTER_Mode_t
  2356. * @返回值:无
  2357. */
  2358. void PAN312x_Set_PayloadManchesterMode(PAN312xManchesterMode mode)
  2359. {
  2360. uint8_t tmp;
  2361. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R11A);
  2362. tmp &= ~PROPERTY_MSK_R11A_REG_PL_MAN_MODE;
  2363. tmp |= (mode << 4);
  2364. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R11A, tmp);
  2365. }
  2366. /**
  2367. * @简介:使能PAN312x的Payload Manchester
  2368. * @参数:无
  2369. * @返回值:无
  2370. */
  2371. void PAN312x_PayloadManchesterEnable(void)
  2372. {
  2373. uint8_t tmp;
  2374. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12E);
  2375. tmp |= PROPERTY_MSK_R12E_FIELD1_MAN_EN;
  2376. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12E, tmp);
  2377. }
  2378. /**
  2379. * @简介:失能PAN312x的Payload Manchester
  2380. * @参数:无
  2381. * @返回值:无
  2382. */
  2383. void PAN312x_PayloadManchesterDisable(void)
  2384. {
  2385. uint8_t tmp;
  2386. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12E);
  2387. tmp &= ~PROPERTY_MSK_R12E_FIELD1_MAN_EN;
  2388. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12E, tmp);
  2389. }
  2390. /**
  2391. * @简介:设置PAN312x的Payload Msb First
  2392. * @参数:无
  2393. * @返回值:无
  2394. */
  2395. void PAN312x_Set_Payload_MsbFirst(void)
  2396. {
  2397. uint8_t tmp;
  2398. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10D);
  2399. tmp &= ~PROPERTY_MSK_R10D_REG_PAYLOAD_ENDIAN;
  2400. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10D, tmp);
  2401. }
  2402. /**
  2403. * @简介:设置PAN312x的Payload Lsb First
  2404. * @参数:无
  2405. * @返回值:无
  2406. */
  2407. void PAN312x_Set_Payload_LsbFirst(void)
  2408. {
  2409. uint8_t tmp;
  2410. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10D);
  2411. tmp |= PROPERTY_MSK_R10D_REG_PAYLOAD_ENDIAN;
  2412. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10D, tmp);
  2413. }
  2414. /**
  2415. * @简介:使能PAN312x的Whitening
  2416. * @参数:无
  2417. * @返回值:无
  2418. */
  2419. void PAN312x_Whitening_Enable(void)
  2420. {
  2421. uint8_t tmp;
  2422. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12E);
  2423. tmp |= PROPERTY_MSK_R12E_FIELD1_WHITE_EN;
  2424. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12E, tmp);
  2425. }
  2426. /**
  2427. * @简介:失能PAN312x的Whitening
  2428. * @参数:无
  2429. * @返回值:无
  2430. */
  2431. void PAN312x_Whitening_Disable(void)
  2432. {
  2433. uint8_t tmp;
  2434. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12E);
  2435. tmp &= ~PROPERTY_MSK_R12E_FIELD1_WHITE_EN;
  2436. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12E, tmp);
  2437. }
  2438. /**
  2439. * @简介:使能PAN312x的PN9IBM扰码模式
  2440. * @参数:无
  2441. * @返回值:无
  2442. */
  2443. void PAN312x_Whitening_PN9IBM_Enable(void)
  2444. {
  2445. uint8_t tmp;
  2446. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12B);
  2447. tmp |= PROPERTY_MSK_R12B_REG_WHITEN_PN9_SEL;
  2448. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12B, tmp);
  2449. }
  2450. /**
  2451. * @简介:失能PAN312x的PN9IBM扰码模式
  2452. * @参数:无
  2453. * @返回值:无
  2454. */
  2455. void PAN312x_Whitening_PN9IBM_Disable(void)
  2456. {
  2457. uint8_t tmp;
  2458. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12B);
  2459. tmp &= ~PROPERTY_MSK_R12B_REG_WHITEN_PN9_SEL;
  2460. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12B, tmp);
  2461. }
  2462. /**
  2463. * @简介:设置PAN312x的白化计算复位
  2464. * @参数:无
  2465. * @返回值:无
  2466. */
  2467. void PAN312x_Whitening_Cal_Reset(void)
  2468. {
  2469. uint8_t tmp;
  2470. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12E);
  2471. tmp |= PROPERTY_MSK_R12E_FIELD1_WHITE_SET;
  2472. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12E, tmp);
  2473. }
  2474. /**
  2475. * @简介:设置PAN312x的白化计算不复位
  2476. * @参数:无
  2477. * @返回值:无
  2478. */
  2479. void PAN312x_Whitening_Cal_NoReset(void)
  2480. {
  2481. uint8_t tmp;
  2482. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12E);
  2483. tmp &= ~PROPERTY_MSK_R12E_FIELD1_WHITE_SET;
  2484. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12E, tmp);
  2485. }
  2486. /**
  2487. * @简介:设置PAN312x的白化多项式长度
  2488. * @参数:length
  2489. * @返回值:无
  2490. */
  2491. void PAN312x_Set_Whitening_Length(uint8_t length)
  2492. {
  2493. uint8_t tmp;
  2494. if(length > 15){
  2495. return;
  2496. }
  2497. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R11A);
  2498. tmp &= ~PROPERTY_MSK_R11A_REG_WHITEN_LENGTH;
  2499. tmp |= (length & 0x0f);
  2500. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R11A, tmp);
  2501. }
  2502. /**
  2503. * @简介:设置PAN312x的白化输出序列模式
  2504. * @参数:mode:
  2505. * 0:白化输出序列从第一个序列开始
  2506. * 1:白化输出序列从第二个序列开始
  2507. * @返回值:无
  2508. */
  2509. void PAN312x_Set_Whitening_Mode(uint8_t mode)
  2510. {
  2511. uint8_t tmp;
  2512. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R116);
  2513. tmp &= ~PROPERTY_MSK_R116_REG_WHITEN_SEL;
  2514. tmp |= (mode << 3);
  2515. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R116, tmp);
  2516. }
  2517. /**
  2518. * @简介:设置PAN312x的白化初始值
  2519. * @参数:seed:白化初始值
  2520. * @返回值:无
  2521. */
  2522. void PAN312x_Set_Whitening_Seed(uint16_t seed)
  2523. {
  2524. PAN312x_Set_PropertyB2(PROPERTY_ADDR_R118, seed);
  2525. }
  2526. /**
  2527. * @简介:设置PAN312x的白化与或输入bit和输出bit
  2528. * @参数:xor1_bit:
  2529. * xor2_bit:
  2530. * output_bit
  2531. * example:
  2532. * xor1_bit | xor2_bit | output_bit
  2533. * PN6: 2 | 1 | 6
  2534. * @返回值:无
  2535. */
  2536. void PAN312x_Set_Whitening_BitSel(uint8_t xor1_bit, uint8_t xor2_bit, uint8_t output_bit)
  2537. {
  2538. uint8_t tmp;
  2539. if((xor1_bit > 15) || (xor2_bit > 15) || (output_bit > 15)){
  2540. return;
  2541. }
  2542. tmp = xor1_bit | (xor2_bit << 4);
  2543. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R117, tmp);
  2544. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R116);
  2545. tmp &= ~PROPERTY_MSK_R116_REG_WHITEN_OUT_SEL;
  2546. tmp |= (output_bit << 4);
  2547. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R116, tmp);
  2548. }
  2549. /**
  2550. * @简介:设置PAN312x的payload 的白化类型
  2551. * @参数:WhiteningPattern
  2552. * typedef enum{
  2553. * WHITENING_DISABLE = 0,
  2554. * WHITENING_PN6 = 1,
  2555. * WHITENING_PN7 = 2,
  2556. * WHITENING_PN9 = 3,
  2557. * WHITENING_PN9_IBM = 4,
  2558. * WHITENING_IEEE_802154g = 5,
  2559. * WHITENING_PN9_CCITT = 6,
  2560. * WHITENING_PN11 = 7,
  2561. * WHITENING_PN13 = 8,
  2562. * WHITENING_PN15 = 9
  2563. * }PAN312xWhiteningPattern;
  2564. * @返回值:无
  2565. */
  2566. void PAN312x_Set_Payload_Whitening_Pattern(PAN312xWhiteningPattern WhiteningPattern)
  2567. {
  2568. if(WhiteningPattern == WHITENING_DISABLE){
  2569. PAN312x_Whitening_Disable();
  2570. PAN312x_Whitening_PN9IBM_Disable();
  2571. return;
  2572. }else{
  2573. PAN312x_Whitening_Enable();
  2574. }
  2575. PAN312x_Whitening_Cal_Reset();
  2576. PAN312x_Set_Whitening_Mode(0);
  2577. if(WhiteningPattern == WHITENING_PN6){
  2578. PAN312x_Set_Whitening_Length(6);
  2579. PAN312x_Set_Whitening_BitSel(2,1,6);
  2580. PAN312x_Set_Whitening_Mode(0);
  2581. PAN312x_Set_Whitening_Seed(0xffff);
  2582. PAN312x_Whitening_PN9IBM_Disable();
  2583. }else if(WhiteningPattern == WHITENING_PN7){
  2584. PAN312x_Set_Whitening_Length(7);
  2585. PAN312x_Set_Whitening_BitSel(5,1,1);
  2586. PAN312x_Set_Whitening_Mode(0);
  2587. PAN312x_Set_Whitening_Seed(0xffff);
  2588. PAN312x_Whitening_PN9IBM_Disable();
  2589. }else if(WhiteningPattern == WHITENING_PN9){
  2590. PAN312x_Set_Whitening_Length(9);
  2591. PAN312x_Set_Whitening_BitSel(6,1,9);
  2592. PAN312x_Set_Whitening_Mode(0);
  2593. PAN312x_Set_Whitening_Seed(0xffff);
  2594. PAN312x_Whitening_PN9IBM_Disable();
  2595. }else if(WhiteningPattern == WHITENING_PN9_IBM){
  2596. PAN312x_Set_Whitening_Length(9);
  2597. PAN312x_Set_Whitening_BitSel(6,1,9);
  2598. PAN312x_Set_Whitening_Mode(1);
  2599. PAN312x_Set_Whitening_Seed(0xffff);
  2600. PAN312x_Whitening_PN9IBM_Enable();
  2601. }else if(WhiteningPattern == WHITENING_IEEE_802154g){
  2602. PAN312x_Set_Whitening_Length(9);
  2603. PAN312x_Set_Whitening_BitSel(6,1,9);
  2604. PAN312x_Set_Whitening_Mode(1);
  2605. PAN312x_Set_Whitening_Seed(0xffff);
  2606. PAN312x_Whitening_PN9IBM_Disable();
  2607. }else if(WhiteningPattern == WHITENING_PN9_CCITT){
  2608. PAN312x_Set_Whitening_Length(9);
  2609. PAN312x_Set_Whitening_BitSel(6,1,1);
  2610. PAN312x_Set_Whitening_Mode(0);
  2611. PAN312x_Set_Whitening_Seed(0xffff);
  2612. PAN312x_Whitening_PN9IBM_Disable();
  2613. }else if(WhiteningPattern == WHITENING_PN11){
  2614. PAN312x_Set_Whitening_Length(11);
  2615. PAN312x_Set_Whitening_BitSel(3,1,11);
  2616. PAN312x_Set_Whitening_Mode(0);
  2617. PAN312x_Set_Whitening_Seed(0xffff);
  2618. PAN312x_Whitening_PN9IBM_Disable();
  2619. }else if(WhiteningPattern == WHITENING_PN13){
  2620. uint8_t tmp;
  2621. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R11A);
  2622. tmp |= PROPERTY_MSK_R11A_REG_WHITEN_PN13_SEL;
  2623. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R11A, tmp);
  2624. PAN312x_Set_Whitening_Length(13);
  2625. PAN312x_Set_Whitening_BitSel(4,5,13);
  2626. PAN312x_Set_Whitening_Mode(0);
  2627. PAN312x_Set_Whitening_Seed(0xffff);
  2628. PAN312x_Whitening_PN9IBM_Disable();
  2629. }else if(WhiteningPattern == WHITENING_PN15){
  2630. PAN312x_Set_Whitening_Length(15);
  2631. PAN312x_Set_Whitening_BitSel(2,1,15);
  2632. PAN312x_Set_Whitening_Mode(0);
  2633. PAN312x_Set_Whitening_Seed(0xffff);
  2634. PAN312x_Whitening_PN9IBM_Disable();
  2635. }
  2636. }
  2637. /**
  2638. * @简介:设置PAN312x的CrcMode
  2639. * @参数:CrcMode
  2640. * 0: crc-8
  2641. * 1: crc-16
  2642. * 2: crc-24
  2643. * 3: crc-32
  2644. * @返回值:无
  2645. */
  2646. void PAN312x_Set_CrcMode(PAN312xCrcMode CrcMode)
  2647. {
  2648. uint8_t tmp;
  2649. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R116);
  2650. tmp &= ~PROPERTY_MSK_R116_REG_CRC_MODE;
  2651. tmp |= CrcMode;
  2652. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R116, tmp);
  2653. }
  2654. /**
  2655. * @简介:设置PAN312x的CrcSeed
  2656. * @参数:CrcSeed
  2657. * @返回值:无
  2658. */
  2659. void PAN312x_Set_CrcSeed(uint32_t CrcSeed)
  2660. {
  2661. PAN312x_Set_PropertyB4(PROPERTY_ADDR_R112, CrcSeed);
  2662. }
  2663. /**
  2664. * @简介:设置PAN312x的crc多项式
  2665. * @参数:CrcPolynomial
  2666. * @返回值:无
  2667. */
  2668. void PAN312x_Set_CrcPolynomial(uint32_t CrcPolynomial)
  2669. {
  2670. PAN312x_Set_PropertyB4(PROPERTY_ADDR_R10E, CrcPolynomial);
  2671. }
  2672. /**
  2673. * @简介:设置PAN312x的crc invert(CRC结果是否取反)
  2674. * @参数:xNewState
  2675. * 0: 不取反
  2676. * 1: 取反
  2677. * @返回值:无
  2678. */
  2679. void PAN312x_Set_CrcInvert(SFunctionalState xNewState)
  2680. {
  2681. uint8_t tmp;
  2682. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R116);
  2683. if(xNewState == S_ENABLE) {
  2684. tmp |= PROPERTY_MSK_R116_REG_CRC_NOT_SEL;
  2685. }
  2686. else{
  2687. tmp &= ~PROPERTY_MSK_R116_REG_CRC_NOT_SEL;
  2688. }
  2689. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R116, tmp);
  2690. }
  2691. /**
  2692. // PAN312x_Get_OP_Reg(R10D, 1, &tmp_test);
  2693. * @xNewState
  2694. * @
  2695. */
  2696. //uint8_t tmp_test;
  2697. void PAN312x_Set_CrcEndian(SFunctionalState xNewState)
  2698. {
  2699. uint8_t tmp;
  2700. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10D);
  2701. if(xNewState == S_ENABLE) {
  2702. tmp |= PROPERTY_MSK_R10D_REG_CRC_ENDIAN;
  2703. }
  2704. else{
  2705. tmp &= ~PROPERTY_MSK_R10D_REG_CRC_ENDIAN;
  2706. }
  2707. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10D, tmp);
  2708. }
  2709. /**
  2710. * @简介:设置PAN312x的crc
  2711. * @参数:xNewState
  2712. * 0:帧结构中没有crc字段
  2713. * 1:帧结构中插入crc字段
  2714. * @返回值:无
  2715. */
  2716. void PAN312x_CrcInsertSelect(SFunctionalState xNewState)
  2717. {
  2718. uint8_t tmp;
  2719. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12E);
  2720. if(xNewState == S_ENABLE) {
  2721. tmp |= PROPERTY_MSK_R12E_FIELD1_CRC_IN;
  2722. }
  2723. else{
  2724. tmp &= ~PROPERTY_MSK_R12E_FIELD1_CRC_IN;
  2725. }
  2726. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12E, tmp);
  2727. }
  2728. /**
  2729. * @简介:将整个CRC部分的高低顺序倒过来
  2730. * @参数:CrcBitOrder:参考PAN312xCrcBitOrder
  2731. * @返回值:无
  2732. */
  2733. void PAN312x_Set_CrcBitOrder(PAN312xCrcBitOrder CrcBitOrder)
  2734. {
  2735. uint8_t tmp;
  2736. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10D);
  2737. if(CrcBitOrder == CRC_BIT_ORDER_MSB_FIRST) {
  2738. tmp &= ~PROPERTY_MSK_R10D_REG_CRC_ENDIAN;
  2739. }else if(CrcBitOrder == CRC_BIT_ORDER_LSB_FIRST){
  2740. tmp |= PROPERTY_MSK_R10D_REG_CRC_ENDIAN;
  2741. }
  2742. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10D, tmp);
  2743. }
  2744. /**
  2745. * @简介:将整个CRC将两个Byte的位置倒过来,但是不改变每个Byte里面的Bit的顺序
  2746. * @参数:CrcByteSwap:参考PAN312xCrcByteSwap
  2747. * @返回值:无
  2748. */
  2749. void PAN312x_Set_CrcByteSwap(PAN312xCrcByteSwap CrcByteSwap)
  2750. {
  2751. uint8_t tmp;
  2752. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R12B);
  2753. if(CrcByteSwap == CRC_BIT_ORDER_MSB_FIRST) {
  2754. tmp &= ~PROPERTY_MSK_R12B_CRC_BYTE_ENDIAN;
  2755. }else if(CrcByteSwap == CRC_BIT_ORDER_LSB_FIRST){
  2756. tmp |= PROPERTY_MSK_R12B_CRC_BYTE_ENDIAN;
  2757. }
  2758. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R12B, tmp);
  2759. }
  2760. /**
  2761. * @简介:设置PAN312x的SyncWord Pattern
  2762. * @参数:Syncwords
  2763. * SyncLength
  2764. * @返回值:无
  2765. */
  2766. void PAN312x_Set_SyncWordPattern(uint32_t Syncwords, uint8_t SyncWordLength)
  2767. {
  2768. uint8_t tmp;
  2769. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10D);
  2770. tmp &= ~PROPERTY_MSK_R10D_REG_SYNC_LEN;
  2771. tmp |= (SyncWordLength << 0);
  2772. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10D, tmp);
  2773. PAN312x_Set_PropertyB4(PROPERTY_ADDR_R189, Syncwords);
  2774. }
  2775. /**
  2776. * @简介:设置PAN312x的SyncWord Length
  2777. * @参数:SyncWordLength
  2778. * @返回值:无
  2779. */
  2780. void PAN312x_Set_SyncWordLength(uint8_t SyncWordLength)
  2781. {
  2782. uint8_t tmp;
  2783. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10D);
  2784. tmp &= ~PROPERTY_MSK_R10D_REG_SYNC_LEN;
  2785. tmp |= (SyncWordLength << 0);
  2786. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10D, tmp);
  2787. }
  2788. /**
  2789. * @简介:设置PAN312x的Syncword Manchester编码
  2790. * @参数:PreambleManchesterMode:
  2791. * 0: 0->01
  2792. * 1: 0->10
  2793. * @返回值:无
  2794. */
  2795. void PAN312x_Set_SyncwordManchesterMode(PAN312xManchesterMode SyncwordManchesterMode)
  2796. {
  2797. uint8_t tmp;
  2798. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10D);
  2799. tmp &= ~PROPERTY_MSK_R10D_REG_SYNC_MAN_MODE;
  2800. tmp |= (SyncwordManchesterMode << 4);
  2801. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10D, tmp);
  2802. }
  2803. /**
  2804. * @简介:使能PAN312x的Syncword Manchester编码
  2805. * @参数:无
  2806. * @返回值:无
  2807. */
  2808. void PAN312x_SyncwordManchesterEnable(void)
  2809. {
  2810. uint8_t tmp;
  2811. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10D);
  2812. tmp |= PROPERTY_MSK_R10D_REG_SYNC_MAN_EN;
  2813. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10D, tmp);
  2814. }
  2815. /**
  2816. * @简介:使能PAN312x的Syncword Manchester编码
  2817. * @参数:无
  2818. * @返回值:无
  2819. */
  2820. void PAN312x_SyncwordManchesterDisable(void)
  2821. {
  2822. uint8_t tmp;
  2823. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10D);
  2824. tmp &= ~PROPERTY_MSK_R10D_REG_SYNC_MAN_EN;
  2825. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10D, tmp);
  2826. }
  2827. /**
  2828. * @简介:设置PAN312x的Preamble Manchester编码
  2829. * @参数:PreambleManchesterMode:
  2830. * 0: 0->01
  2831. * 1: 0->10
  2832. * @返回值:无
  2833. */
  2834. void PAN312x_Set_PreambleManchesterMode(PAN312xManchesterMode PreambleManchesterMode)
  2835. {
  2836. uint8_t tmp;
  2837. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  2838. tmp &= ~PROPERTY_MSK_R107_REG_PRE_MAN_MODE;
  2839. tmp |= (PreambleManchesterMode << 1);
  2840. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  2841. }
  2842. /**
  2843. * @简介:使能PAN312x的Preamble Manchester编码
  2844. * @参数:无
  2845. * @返回值:无
  2846. */
  2847. void PAN312x_PreambleManchesterEnable(void)
  2848. {
  2849. uint8_t tmp;
  2850. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  2851. tmp |= PROPERTY_MSK_R107_REG_PRE_MAN_EN;
  2852. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  2853. }
  2854. /**
  2855. * @简介:失能PAN312x的Preamble Manchester编码
  2856. * @参数:无
  2857. * @返回值:无
  2858. */
  2859. void PAN312x_PreambleManchesterDisable(void)
  2860. {
  2861. uint8_t tmp;
  2862. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  2863. tmp &= ~PROPERTY_MSK_R107_REG_PRE_MAN_EN;
  2864. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  2865. }
  2866. /**
  2867. * @简介:设置PAN312x的Preamble Pattern
  2868. * @参数:PreamblePattern
  2869. * 0: non standard
  2870. * 1: 0101
  2871. * 2: 1010(default)
  2872. * @返回值:无
  2873. */
  2874. void PAN312x_Set_PreamblePattern(uint8_t PreamblePattern)
  2875. {
  2876. uint8_t tmp;
  2877. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  2878. tmp &= ~PROPERTY_MSK_R107_REG_PRE_SEL;
  2879. tmp |= (PreamblePattern << 2);
  2880. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  2881. }
  2882. /**
  2883. * @简介:设置PAN312x的Preamble Endian
  2884. * @参数:PreambleEndian
  2885. * 0: big endian
  2886. * 1: little endian
  2887. * @返回值:无
  2888. */
  2889. void PAN312x_Set_PreambleEndian(uint8_t PreambleEndian)
  2890. {
  2891. uint8_t tmp;
  2892. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  2893. tmp &= ~PROPERTY_MSK_R107_REG_PRE_BIT_MODE;
  2894. tmp |= (PreambleEndian << 4);
  2895. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  2896. }
  2897. /**
  2898. * @简介:设置PAN312x的Preamble 长度
  2899. * @参数:PreambleLength:preamble的长度
  2900. * @返回值:无
  2901. */
  2902. void PAN312x_Set_PreambleLength(uint8_t PreambleLength)
  2903. {
  2904. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R10C, PreambleLength);
  2905. }
  2906. /**
  2907. * @简介:获取PAN312x的Preamble长度
  2908. * @参数:无
  2909. * @返回值:Preamble的长度
  2910. */
  2911. uint8_t PAN312x_Get_PreambleLength(void)
  2912. {
  2913. return PAN312x_Get_PropertyB1(PROPERTY_ADDR_R10C);
  2914. }
  2915. /**
  2916. * @简介:设置PAN312x的非标准Preamble Pattern
  2917. * @参数:PreamblePattern:
  2918. * PreambleLength:
  2919. * @返回值:无
  2920. */
  2921. void PAN312x_Set_NonStandardPreamblePattern(uint32_t PreamblePattern)
  2922. {
  2923. uint8_t tmp;
  2924. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  2925. tmp &= PROPERTY_MSK_R107_REG_PRE_SEL;
  2926. if(tmp != 0x00){
  2927. return;
  2928. }
  2929. PAN312x_Set_PropertyB4(PROPERTY_ADDR_R108, PreamblePattern);
  2930. }
  2931. /**
  2932. * @简介:获取PAN312x的非标准Preamble Pattern
  2933. * @参数:无
  2934. * @返回值:非标准Preamble Pattern值
  2935. */
  2936. uint32_t PAN312x_Get_NonStandardPreamblePattern(void)
  2937. {
  2938. return PAN312x_Get_PropertyB4(PROPERTY_ADDR_R108);
  2939. }
  2940. /**
  2941. * @简介:使能PAN312x的Postamble
  2942. * @参数:无
  2943. * @返回值:无
  2944. */
  2945. void PAN312x_PostambleEnable(void)
  2946. {
  2947. uint8_t tmp;
  2948. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R125);
  2949. tmp |= PROPERTY_MSK_R125_REG_POST_EN;
  2950. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R125, tmp);
  2951. }
  2952. /**
  2953. * @简介:使能PAN312x的Postamble
  2954. * @参数:无
  2955. * @返回值:无
  2956. */
  2957. void PAN312x_PostambleDisable(void)
  2958. {
  2959. uint8_t tmp;
  2960. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R125);
  2961. tmp &= ~PROPERTY_MSK_R125_REG_POST_EN;
  2962. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R125, tmp);
  2963. }
  2964. /**
  2965. * @简介:设置PAN312x的Postamble长度
  2966. * @参数:PostambleLength: Postamble长度
  2967. * @返回值:无
  2968. */
  2969. void PAN312x_Set_PostambleLength(uint8_t PostambleLength)
  2970. {
  2971. uint8_t tmp;
  2972. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R120);
  2973. tmp &= ~PROPERTY_MSK_R120_REG_POSTAMBLE_LEN;
  2974. tmp |= (PostambleLength << PROPERTY_POS_R120_REG_POSTAMBLE_LEN);
  2975. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R120, tmp);
  2976. }
  2977. /**
  2978. * @简介:设置PAN312x的Postamble内容
  2979. * @参数:PostamblePattern: Postamble内容
  2980. * @返回值:无
  2981. */
  2982. void PAN312x_Set_PostamblePattern(uint32_t PostamblePattern)
  2983. {
  2984. PAN312x_Set_PropertyB4(PROPERTY_ADDR_R121, PostamblePattern);
  2985. }
  2986. /**
  2987. * @简介:设置PAN312x的Postamble Endian
  2988. * @参数:PostambleEndian
  2989. * 0: big endian
  2990. * 1: little endian
  2991. * @返回值:无
  2992. */
  2993. void PAN312x_Set_PostambleEndian(uint8_t PostambleEndian)
  2994. {
  2995. uint8_t tmp;
  2996. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R125);
  2997. tmp &= ~PROPERTY_MSK_R125_REG_POST_BIT_MODE;
  2998. tmp |= (PostambleEndian << PROPERTY_POS_R125_REG_POST_BIT_MODE);
  2999. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R125, tmp);
  3000. }
  3001. /**
  3002. * @简介:设置PAN312x的tx deviation
  3003. * @参数:tx_deviation:(单位hz)
  3004. * @返回值:无
  3005. */
  3006. void PAN312x_Set_Tx_Deviation(uint32_t tx_deviation)
  3007. {
  3008. int tmp;
  3009. if(tx_deviation == 1000000){
  3010. tmp = 255;
  3011. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R142, tmp);
  3012. tmp = 128;
  3013. PAN312x_Set_PropertyB2(PROPERTY_ADDR_R15A, tmp);
  3014. }else if((tx_deviation > 2400) &&(tx_deviation <= 500000)){
  3015. tmp = 0x80;
  3016. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R142, tmp);
  3017. tmp = (int)(tx_deviation * 256.0 / 500000);
  3018. if(tmp > 511){
  3019. tmp = 511;
  3020. }
  3021. PAN312x_Set_PropertyB2(PROPERTY_ADDR_R15A, tmp);
  3022. }else if((tx_deviation <= 2400) &&(tx_deviation >= 500)){
  3023. //[0x70][0x42]配置fsk_dev,当deviation小于2.4k以后,此时需要按比例修改fsk_dev配置
  3024. tmp = tx_deviation * 128 / 2400;
  3025. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R142,tmp);
  3026. tmp = 1;
  3027. PAN312x_Set_PropertyB2(PROPERTY_ADDR_R15A,tmp);
  3028. }
  3029. }
  3030. /**
  3031. * @简介:设置PAN312x的rx deviation h 小于或等于1的配置
  3032. * @参数:rx_dev
  3033. * @返回值:无
  3034. */
  3035. void PAN312x_Set_Rx_Deviation_H_BelowOne(uint16_t rx_deviation_tmp)
  3036. {
  3037. uint8_t tmp;
  3038. uint8_t tmpBuffer[2];
  3039. //[0x70][0x46]: reg_rx_tr_dev_outer_l
  3040. //[0x70][0x47][3:0]: reg_rx_tr_dev_outer_h
  3041. tmpBuffer[0] = (uint8_t)rx_deviation_tmp;
  3042. tmpBuffer[1] = (uint8_t)((rx_deviation_tmp >> 8) & PROPERTY_MSK_R147_REG_RX_TR_DEV_OUTER_H);
  3043. PAN312x_Set_Property(PROPERTY_ADDR_R146, 2, tmpBuffer);
  3044. //[0x70][0x3d][7:0]:reg_fltr_dev_l
  3045. //[0x70][0x3e][0]: reg_fltr_dev_h
  3046. tmpBuffer[0] = 0x00;
  3047. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R13E);
  3048. tmp &= ~PROPERTY_MSK_R13E_REG_FLTR_DEV_H;
  3049. tmpBuffer[1] = tmp;
  3050. PAN312x_Set_Property(PROPERTY_ADDR_R13D, 2, tmpBuffer);
  3051. //[0x70][0x4b][6]:high_dev_decimat_en
  3052. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14B);
  3053. tmp &= ~PROPERTY_MSK_R14B_HIGH_DEV_DECIMAT_EN;
  3054. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14B, tmp);
  3055. //[0x72][0x52][6]:decimat_last_manu_en
  3056. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R252);
  3057. tmp &= ~PROPERTY_MSK_R252_DECIMAT_LAST_MANU_EN;
  3058. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R252, tmp);
  3059. }
  3060. /**
  3061. * @简介:设置PAN312x的rx deviation h 大于1的配置
  3062. * @参数:rx_dev
  3063. * @返回值:无
  3064. */
  3065. void PAN312x_Set_Rx_Deviation_H_HighOne(uint16_t rx_deviation_tmp, uint32_t rx_deviation, uint32_t data_rate)
  3066. {
  3067. uint8_t tmp;
  3068. uint8_t tmpBuffer[3];
  3069. uint16_t fltr_dev;
  3070. uint32_t symbrate_rbw;
  3071. uint8_t chf_sel;
  3072. uint8_t a, b;
  3073. double high_dev_decimat_num;
  3074. int decimat_last_manu_num;
  3075. //[0x70][0x46]: reg_rx_tr_dev_outer_l
  3076. //[0x70][0x47][3:0]: reg_rx_tr_dev_outer_h
  3077. tmpBuffer[0] = (uint8_t)rx_deviation_tmp;
  3078. tmpBuffer[1] = (uint8_t)((rx_deviation_tmp >> 8) & PROPERTY_MSK_R147_REG_RX_TR_DEV_OUTER_H);
  3079. PAN312x_Set_Property(PROPERTY_ADDR_R146, 2, tmpBuffer);
  3080. //[0x70][0x3d][7:0]:reg_fltr_dev_l
  3081. //[0x70][0x3e][0]: reg_fltr_dev_h
  3082. fltr_dev = (int)rx_deviation * 1.0 / 100;
  3083. tmpBuffer[0] = (uint8_t)fltr_dev;
  3084. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R13E);
  3085. tmp |= (uint8_t)((fltr_dev >> 8) & PROPERTY_MSK_R13E_REG_FLTR_DEV_H);
  3086. tmpBuffer[1] = tmp;
  3087. PAN312x_Set_Property(PROPERTY_ADDR_R13D, 2, tmpBuffer);
  3088. symbrate_rbw = 2 * rx_deviation;
  3089. //[0x70][0x50][7:4]:reg_chf_sel
  3090. if(symbrate_rbw > 1000000){
  3091. chf_sel = 0;
  3092. }else if(symbrate_rbw > 500000){
  3093. chf_sel = 1;
  3094. }else if(symbrate_rbw > 400000){
  3095. chf_sel = 2;
  3096. }else if(symbrate_rbw > 250000){
  3097. chf_sel = 3;
  3098. }else if(symbrate_rbw > 200000){
  3099. chf_sel = 4;
  3100. }else if(symbrate_rbw > 125000){
  3101. chf_sel = 5;
  3102. }else if(symbrate_rbw > 100000){
  3103. chf_sel = 6;
  3104. }else if(symbrate_rbw > 80000){
  3105. chf_sel = 7;
  3106. }else if(symbrate_rbw > 62500){
  3107. chf_sel = 8;
  3108. }else if(symbrate_rbw > 50000){
  3109. chf_sel = 9;
  3110. }else if(symbrate_rbw > 40000){
  3111. chf_sel = 10;
  3112. }else if(symbrate_rbw == 40000){
  3113. chf_sel = 11;
  3114. }else if(symbrate_rbw > 10000){
  3115. chf_sel = 12;
  3116. }else{
  3117. chf_sel = 13;
  3118. }
  3119. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R150);
  3120. tmp &= ~PROPERTY_MSK_R150_REG_CHF_SEL;
  3121. tmp |= (chf_sel << 4);
  3122. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R150, tmp);
  3123. //[0x70][0x4b][6]:high_dev_decimat_en
  3124. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14B);
  3125. if(symbrate_rbw <= data_rate){
  3126. tmp &= ~PROPERTY_MSK_R14B_HIGH_DEV_DECIMAT_EN;
  3127. }else{
  3128. tmp |= PROPERTY_MSK_R14B_HIGH_DEV_DECIMAT_EN;
  3129. }
  3130. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14B, tmp);
  3131. //[0x72][0x52][6]:decimat_last_manu_en
  3132. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R252);
  3133. if(symbrate_rbw <= data_rate){
  3134. tmp &= ~PROPERTY_MSK_R252_DECIMAT_LAST_MANU_EN;
  3135. }else{
  3136. tmp |= PROPERTY_MSK_R252_DECIMAT_LAST_MANU_EN;
  3137. }
  3138. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R252, tmp);
  3139. if(symbrate_rbw >= 10000){
  3140. a = 8;
  3141. }else{
  3142. a = 16;
  3143. }
  3144. if(data_rate >= 10000){
  3145. b = 8;
  3146. }else{
  3147. b = 16;
  3148. }
  3149. //high_dev_decimat_num = (int)1.0 * a * symbrate_rbw / b / data_rate;
  3150. high_dev_decimat_num = round(1.0 * a * symbrate_rbw / b / data_rate * 10000) / 10000.0;
  3151. decimat_last_manu_num = (int)1.0 * 320000 / high_dev_decimat_num;
  3152. //[0x72][0x50][7:0]:decimat_last_manu_num_l1
  3153. //[0x72][0x51][7:0]:decimat_last_manu_num_l2
  3154. //[0x72][0x52][2:0]:decimat_last_manu_num_h
  3155. tmpBuffer[0] = (uint8_t)decimat_last_manu_num;
  3156. tmpBuffer[1] = (uint8_t)(decimat_last_manu_num >> 8);
  3157. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R252);
  3158. tmp |= (uint8_t)((decimat_last_manu_num >> 16) & 0x07);
  3159. tmpBuffer[2] = tmp;
  3160. PAN312x_Set_Property(PROPERTY_ADDR_R250, 3, tmpBuffer);
  3161. }
  3162. /**
  3163. * @简介:设置PAN312x的rx deviation
  3164. * @参数:rx_deviation:(单位hz)
  3165. * @返回值:无
  3166. */
  3167. void PAN312x_Set_Rx_Deviation(uint32_t rx_deviation)
  3168. {
  3169. uint8_t tmp;
  3170. uint8_t rate_tmp;
  3171. uint32_t data_rate;
  3172. int rx_dev_tmp;
  3173. float h;
  3174. //[0x71][0x06]
  3175. rate_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R186);
  3176. if((rate_tmp & PROPERTY_MSK_R186_REG_SYMB_AB_SEL) == PROPERTY_MSK_R186_REG_SYMB_AB_SEL){
  3177. //data rate >= 50kbps
  3178. rate_tmp = (rate_tmp & PROPERTY_MSK_R186_REG_SYMBRATE_B) >> 4;
  3179. if(rate_tmp == 0x00){
  3180. //50kbps
  3181. data_rate = 50000;
  3182. }else if(rate_tmp == 0x01){
  3183. //62.5kbps
  3184. data_rate = 62500;
  3185. }else if(rate_tmp == 0x02){
  3186. //80kbps
  3187. data_rate = 80000;
  3188. }else if(rate_tmp == 0x03){
  3189. //100kbps
  3190. data_rate = 100000;
  3191. }else if(rate_tmp == 0x04){
  3192. //125kbps
  3193. data_rate = 125000;
  3194. }else if(rate_tmp == 0x05){
  3195. //200kbps
  3196. data_rate = 200000;
  3197. }else if(rate_tmp == 0x06){
  3198. //250kbps
  3199. data_rate = 250000;
  3200. }else if(rate_tmp == 0x07){
  3201. //400kbps
  3202. data_rate = 400000;
  3203. }else if(rate_tmp == 0x08){
  3204. //500kbps
  3205. data_rate = 500000;
  3206. }
  3207. else if(rate_tmp == 0x09){
  3208. //1Mbps
  3209. data_rate = 1000000;
  3210. }else if(rate_tmp == 0x0a){
  3211. //2Mbps
  3212. data_rate = 2000000;
  3213. }
  3214. }else{
  3215. //data rate <= 40kbps
  3216. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R187);
  3217. data_rate = tmp;
  3218. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R188);
  3219. data_rate |= ((tmp & PROPERTY_MSK_R188_REG_SYMBRATE_A_H) << 8);
  3220. data_rate *= 100;
  3221. }
  3222. h = 2.0f * rx_deviation / data_rate;
  3223. if((h >= 0.5) && (h <= 1.0)){
  3224. rx_dev_tmp = (int)rx_deviation * 1.0 * (1 << 14) / data_rate / 8 / 2;
  3225. // if(data_rate >= 10000){
  3226. // rx_dev_tmp = rx_dev_tmp / 2;
  3227. // }
  3228. PAN312x_Set_Rx_Deviation_H_BelowOne(rx_dev_tmp);
  3229. }else if((h > 1.0) && (h <= 20)){
  3230. rx_dev_tmp = 1024;
  3231. // if(data_rate >= 10000){
  3232. // rx_dev_tmp = rx_dev_tmp / 2;
  3233. // }
  3234. rx_dev_tmp = rx_dev_tmp / 2;
  3235. PAN312x_Set_Rx_Deviation_H_HighOne(rx_dev_tmp, rx_deviation, data_rate);
  3236. }else{
  3237. return;
  3238. }
  3239. }
  3240. /**
  3241. * @简介:使能PAN312x的GPIO Direct Tx
  3242. * @参数:无
  3243. * @返回值: 无
  3244. */
  3245. void PAN312x_GPIO_Direct_Tx_Enable(void)
  3246. {
  3247. uint8_t tmp;
  3248. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  3249. tmp |= PROPERTY_MSK_R107_REG_DIRECT_TX_EN;
  3250. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  3251. }
  3252. /**
  3253. * @简介:失能PAN312x的GPIO Direct Tx
  3254. * @参数:无
  3255. * @返回值: 无
  3256. */
  3257. void PAN312x_GPIO_Direct_Tx_Disable(void)
  3258. {
  3259. uint8_t tmp;
  3260. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  3261. tmp &= ~PROPERTY_MSK_R107_REG_DIRECT_TX_EN;
  3262. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  3263. }
  3264. /**
  3265. * @简介:使能PAN312x的GPIO Direct Rx
  3266. * @参数:无
  3267. * @返回值: 无
  3268. */
  3269. void PAN312x_GPIO_Direct_Rx_Enable(void)
  3270. {
  3271. uint8_t tmp;
  3272. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  3273. tmp |= PROPERTY_MSK_R107_REG_DIRECT_RX_EN;
  3274. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  3275. }
  3276. /**
  3277. * @简介:失能PAN312x的GPIO Direct Rx
  3278. * @参数:无
  3279. * @返回值: 无
  3280. */
  3281. void PAN312x_GPIO_Direct_Rx_Disable(void)
  3282. {
  3283. uint8_t tmp;
  3284. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  3285. tmp &= ~PROPERTY_MSK_R107_REG_DIRECT_RX_EN;
  3286. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  3287. }
  3288. /**
  3289. * @简介:设置PAN312x的GPIO Direct 异步模式
  3290. * @参数:无
  3291. * @返回值: 无
  3292. */
  3293. void PAN312x_Gpio_Direct_Asynchronous_Mode(void)
  3294. {
  3295. uint8_t tmp;
  3296. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  3297. tmp &= ~PROPERTY_MSK_R107_REG_DIRECT_MODE;
  3298. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  3299. }
  3300. /**
  3301. * @简介:设置PAN312x的GPIO Direct 同步模式
  3302. * @参数:无
  3303. * @返回值: 无
  3304. */
  3305. void PAN312x_Gpio_Direct_Synchronous_Mode(void)
  3306. {
  3307. uint8_t tmp;
  3308. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R107);
  3309. tmp |= PROPERTY_MSK_R107_REG_DIRECT_MODE;
  3310. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R107, tmp);
  3311. }
  3312. /**
  3313. * @简介:设置PAN312x的EncodingHaming模式
  3314. * @参数:无
  3315. * @返回值: 无
  3316. */
  3317. void PAN312x_Set_FecHamingEncoding(PAN312xFecEncoding HamingEncoding)
  3318. {
  3319. uint8_t tmp;
  3320. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R106);
  3321. if(HamingEncoding == FEC_HAMING_DISABLE){
  3322. tmp &= ~PROPERTY_MSK_R106_REG_HAMMING_EN;
  3323. }else if(HamingEncoding == FEC_HAMING_X3_X_1){
  3324. tmp |= PROPERTY_MSK_R106_REG_HAMMING_EN;
  3325. tmp &= ~PROPERTY_MSK_R106_REG_HAMMING_MODE;
  3326. }else if(HamingEncoding == FEC_HAMING_X3_X2_1){
  3327. tmp |= (PROPERTY_MSK_R106_REG_HAMMING_EN | PROPERTY_MSK_R106_REG_HAMMING_MODE);
  3328. }
  3329. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R106, tmp);
  3330. }
  3331. /**
  3332. * @802.15.4g FECPROPERTY_ADDR_R106 bit[4:3]
  3333. * @Fec802154Type0=1=RSC2=NRNSC3=3-out-of-6
  3334. * @:
  3335. */
  3336. void PAN312x_Set_802154FecType(PAN312x802154FecType Fec802154Type)
  3337. {
  3338. uint8_t tmp;
  3339. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R106);
  3340. tmp &= ~PROPERTY_MSK_R106_REG_FEC_TYPE;
  3341. tmp |= ((uint8_t)Fec802154Type << PROPERTY_POS_R106_REG_FEC_TYPE) & PROPERTY_MSK_R106_REG_FEC_TYPE;
  3342. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R106, tmp);
  3343. }
  3344. /**
  3345. * @简介:设置 3-out-of-6 编码输出大小端(PROPERTY_ADDR_R106 bit[6])
  3346. * @参数:Endian
  3347. * MBUS_3OF6_OUT_BIG_ENDIAN = 0:大端
  3348. * MBUS_3OF6_OUT_LITTLE_ENDIAN = 1:小端
  3349. * @返回值: 无
  3350. */
  3351. void PAN312x_Set_Mbus3OutOf6Endian(PAN312xMbus3OutOf6Endian Endian)
  3352. {
  3353. uint8_t tmp;
  3354. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R106);
  3355. if (Endian == MBUS_3OF6_OUT_LITTLE_ENDIAN) {
  3356. tmp |= PROPERTY_MSK_R106_REG_MBUS_MSB_OUT_SEL;
  3357. } else {
  3358. tmp &= (uint8_t)(~PROPERTY_MSK_R106_REG_MBUS_MSB_OUT_SEL);
  3359. }
  3360. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R106, tmp);
  3361. }
  3362. /**
  3363. * @简介:使能硬件 3-out-of-6 编码(PROPERTY_ADDR_R106)
  3364. * bit[4:3]=3:3-out-of-6;bit[6]:输出大小端
  3365. * @参数:Endian 输出大小端选择
  3366. * @返回值: 无
  3367. *
  3368. * @note bit[4:3]:0=no FEC,1=RSC,2=NRNSC,3=3-out-of-6
  3369. * 关闭时调用 PAN312x_Set_802154FecType(FEC_802154_DISABLE)
  3370. */
  3371. void PAN312x_Set_3OutOf6Encoding(PAN312xMbus3OutOf6Endian Endian)
  3372. {
  3373. PAN312x_Set_802154FecType(FEC_3_OUT_OF_6);
  3374. PAN312x_Set_Mbus3OutOf6Endian(Endian);
  3375. }
  3376. /**
  3377. * @简介:使能或关闭802.15.4g交织
  3378. * @参数:InterleavingState:S_ENABLE/S_DISABLE
  3379. * @返回值: 无
  3380. */
  3381. void PAN312x_Set_InterleavingState(SFunctionalState InterleavingState)
  3382. {
  3383. uint8_t tmp;
  3384. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R106);
  3385. if(InterleavingState == S_DISABLE){
  3386. tmp &= ~PROPERTY_MSK_R106_REG_INT_EN;
  3387. }else if(InterleavingState == S_ENABLE){
  3388. tmp |= PROPERTY_MSK_R106_REG_INT_EN;
  3389. }
  3390. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R106, tmp);
  3391. }
  3392. /**
  3393. * @简介:底层总线写数据(不加寄存器地址)
  3394. * @简介:底层总线写数据(不加寄存器地址)
  3395. * @:
  3396. */
  3397. void PAN312x_SetDualSyncWordPattern(uint32_t SyncWords)
  3398. {
  3399. uint8_t tmp;
  3400. //Second SyncWord
  3401. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R13E);
  3402. tmp |= PROPERTY_MSK_R13E_REG_SYNC_WORD2_EN;
  3403. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R13E, tmp);
  3404. //Second SyncWord Value
  3405. PAN312x_Set_PropertyB4(PROPERTY_ADDR_R18D, SyncWords);
  3406. }
  3407. /**
  3408. * @飺 3-out-of-6 СPROPERTY_ADDR_R106 bit[6]
  3409. * @
  3410. * @简介:按DCDC校准码设置PAN312x发射功率
  3411. */
  3412. uint32_t PAN312x_GetDualSyncWordPattern(void)
  3413. {
  3414. return PAN312x_Get_PropertyB4(PROPERTY_ADDR_R18D);
  3415. }
  3416. /**
  3417. * @简介:底层总线写数据(不加寄存器地址)
  3418. * @
  3419. * @:
  3420. */
  3421. void PAN312x_MaxPayloadLimitDisable(void)
  3422. {
  3423. uint8_t tmp;
  3424. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R31C);
  3425. tmp &= ~PROPERTY_MSK_R31C_REG_MAX_VLD;
  3426. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R31C, tmp);
  3427. }
  3428. /**
  3429. * @简介:设置PAN312x的
  3430. * @参数:base_frequency(hz):
  3431. * frequency_step(hz):
  3432. * channel_number
  3433. * @返回值:无
  3434. */
  3435. void PAN312x_Set_ModulationType(PAN312xModulationSelect ModType)
  3436. {
  3437. uint8_t tmp;
  3438. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R186);
  3439. tmp &= ~PROPERTY_MSK_R186_REG_MODTYPE;
  3440. tmp |= (ModType << PROPERTY_POS_R186_REG_MODTYPE);
  3441. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R186, tmp);
  3442. }
  3443. /**
  3444. * @PAN312xBase Frequency
  3445. * @base_frequency(hz):
  3446. * frequency_step(hz):
  3447. * channel_number
  3448. * @
  3449. */
  3450. /* LO/VCO AFE segment cache: updated at end of PAN312x_Set_Frequency */
  3451. static uint8_t s_freq_afe_valid = 0;
  3452. static uint16_t s_freq_afe_seg = 0;
  3453. /**
  3454. * @简介:按最终频点归类 LO/VCO 模拟前端分段
  3455. * 同段内跳频可只改 channel;跨段必须全量 Set_Frequency
  3456. * @参数:final_hz:目标频点(Hz)
  3457. * @返回值: 高字节=LO档,低字节=VCO子档;0xFFFF=不支持频点
  3458. */
  3459. static uint16_t PAN312x_Get_FrequencyAfeSegment(uint32_t final_hz)
  3460. {
  3461. uint8_t lo = 0xFFu;
  3462. uint8_t vco = 0xFFu;
  3463. if ((final_hz >= 127000000u) && (final_hz <= 183000000u)) {
  3464. lo = 12u;
  3465. if (final_hz < 130000000u) {
  3466. vco = 0u;
  3467. } else if (final_hz < 135000000u) {
  3468. vco = 1u;
  3469. } else if (final_hz < 140000000u) {
  3470. vco = 2u;
  3471. } else if (final_hz < 147000000u) {
  3472. vco = 3u;
  3473. } else if (final_hz < 153000000u) {
  3474. vco = 4u;
  3475. } else if (final_hz < 162000000u) {
  3476. vco = 5u;
  3477. } else if (final_hz < 170000000u) {
  3478. vco = 6u;
  3479. } else {
  3480. vco = 7u;
  3481. }
  3482. } else if ((final_hz >= 190000000u) && (final_hz < 253000000u)) {
  3483. lo = 8u;
  3484. if (final_hz < 195000000u) {
  3485. vco = 0u;
  3486. } else if (final_hz < 203000000u) {
  3487. vco = 1u;
  3488. } else if (final_hz < 210000000u) {
  3489. vco = 2u;
  3490. } else if (final_hz < 220000000u) {
  3491. vco = 3u;
  3492. } else if (final_hz < 230000000u) {
  3493. vco = 4u;
  3494. } else if (final_hz < 243000000u) {
  3495. vco = 5u;
  3496. } else {
  3497. vco = 6u;
  3498. }
  3499. } else if ((final_hz >= 253000000u) && (final_hz <= 367000000u)) {
  3500. lo = 6u;
  3501. if (final_hz < 260000000u) {
  3502. vco = 0u;
  3503. } else if (final_hz < 270000000u) {
  3504. vco = 1u;
  3505. } else if (final_hz < 280000000u) {
  3506. vco = 2u;
  3507. } else if (final_hz < 293000000u) {
  3508. vco = 3u;
  3509. } else if (final_hz < 307000000u) {
  3510. vco = 4u;
  3511. } else if (final_hz < 323000000u) {
  3512. vco = 5u;
  3513. } else if (final_hz < 340000000u) {
  3514. vco = 6u;
  3515. } else {
  3516. vco = 7u;
  3517. }
  3518. } else if ((final_hz >= 380000000u) && (final_hz <= 550000000u)) {
  3519. lo = 4u;
  3520. if (final_hz < 390000000u) {
  3521. vco = 0u;
  3522. } else if (final_hz < 405000000u) {
  3523. vco = 1u;
  3524. } else if (final_hz < 420000000u) {
  3525. vco = 2u;
  3526. } else if (final_hz < 440000000u) {
  3527. vco = 3u;
  3528. } else if (final_hz < 460000000u) {
  3529. vco = 4u;
  3530. } else if (final_hz < 485000000u) {
  3531. vco = 5u;
  3532. } else if (final_hz < 510000000u) {
  3533. vco = 6u;
  3534. } else {
  3535. vco = 7u;
  3536. }
  3537. } else if ((final_hz >= 760000000u) && (final_hz <= 1100000000u)) {
  3538. lo = 2u;
  3539. if (final_hz < 780000000u) {
  3540. vco = 0u;
  3541. } else if (final_hz < 810000000u) {
  3542. vco = 1u;
  3543. } else if (final_hz < 840000000u) {
  3544. vco = 2u;
  3545. } else if (final_hz < 880000000u) {
  3546. vco = 3u;
  3547. } else if (final_hz < 920000000u) {
  3548. vco = 4u;
  3549. } else if (final_hz < 970000000u) {
  3550. vco = 5u;
  3551. } else if (final_hz < 1020000000u) {
  3552. vco = 6u;
  3553. } else {
  3554. vco = 7u;
  3555. }
  3556. } else {
  3557. return 0xFFFFu;
  3558. }
  3559. return (uint16_t)(((uint16_t)lo << 8) | (uint16_t)vco);
  3560. }
  3561. /**
  3562. * @简介:设置PAN312x的Base Frequency
  3563. * @参数:base_frequency(hz):
  3564. * frequency_step(hz):
  3565. * channel_number
  3566. * @返回值:无
  3567. */
  3568. void PAN312x_Set_Frequency(uint32_t base_frequency, uint32_t frequency_step, uint16_t channel_number)
  3569. {
  3570. uint8_t tmp;
  3571. uint8_t vco_tmp;
  3572. uint8_t vco_vd_sw_tmp;
  3573. uint8_t tmpBuffer[4];
  3574. int base_frequency_tmp;
  3575. int carrier_frequency;
  3576. uint32_t carrier_frequency_tmp;
  3577. // int freq_step_integer;
  3578. float freq_step_fraction;
  3579. float mid_frequency_tmp;
  3580. float frequency_step_tmp;
  3581. uint32_t ref_freq = 32000000;
  3582. uint32_t mid_frequency = 500000;
  3583. uint32_t final_frequency;
  3584. uint8_t freq_tmp;
  3585. final_frequency = base_frequency + frequency_step * channel_number;
  3586. //1lo
  3587. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1B3);
  3588. tmp &= 0xf8;
  3589. //2vco
  3590. vco_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D2);
  3591. vco_vd_sw_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D4);
  3592. vco_vd_sw_tmp &= ~PROPERTY_MSK_R2D4_PLL_VCO_VD_SW;
  3593. vco_tmp &= 0xc7;
  3594. if((final_frequency >= 127000000) && (final_frequency <= 183000000)){
  3595. //lo12
  3596. tmp |= 0x04;
  3597. base_frequency_tmp = base_frequency * 12.0 / ref_freq * (1 << 24);
  3598. frequency_step_tmp = frequency_step * 12.0 / ref_freq * (1 << 24);
  3599. mid_frequency_tmp = mid_frequency * 12.0 / ref_freq * (1 << 24);
  3600. //127Mhz~183Mhz
  3601. if((final_frequency >= 127000000) && (final_frequency < 130000000)){
  3602. vco_tmp |= (0x0 << 3);
  3603. vco_vd_sw_tmp |= 0x02;
  3604. }else if((final_frequency >= 130000000) && (final_frequency < 135000000)){
  3605. vco_tmp |= (0x1 << 3);
  3606. vco_vd_sw_tmp |= 0x02;
  3607. }else if((final_frequency >= 135000000) && (final_frequency < 140000000)){
  3608. vco_tmp |= (0x2 << 3);
  3609. vco_vd_sw_tmp |= 0x02;
  3610. }else if((final_frequency >= 140000000) && (final_frequency < 147000000)){
  3611. vco_tmp |= (0x3 << 3);
  3612. vco_vd_sw_tmp |= 0x01;
  3613. }else if((final_frequency >= 147000000) && (final_frequency < 153000000)){
  3614. vco_tmp |= (0x4 << 3);
  3615. vco_vd_sw_tmp |= 0x01;
  3616. }else if((final_frequency >= 153000000) && (final_frequency < 162000000)){
  3617. vco_tmp |= (0x5 << 3);
  3618. vco_vd_sw_tmp |= 0x01;
  3619. }else if((final_frequency >= 162000000) && (final_frequency < 170000000)){
  3620. vco_tmp |= (0x6 << 3);
  3621. vco_vd_sw_tmp |= 0x01;
  3622. }else if((final_frequency >= 170000000) && (final_frequency <= 183000000)){
  3623. vco_tmp |= (0x07 << 3);
  3624. vco_vd_sw_tmp |= 0x01;
  3625. }
  3626. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C4);
  3627. freq_tmp &= ~PROPERTY_MSK_R2C4_TRX_COMATCH_EN;
  3628. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C4, freq_tmp);
  3629. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D9);
  3630. freq_tmp &= ~PROPERTY_MSK_R2D9_RX_LNA2_ICORE;
  3631. freq_tmp |= (0x04 << PROPERTY_POS_R2D9_RX_LNA2_ICORE);
  3632. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D9, freq_tmp);
  3633. }else if((final_frequency >= 190000000) && (final_frequency < 253000000)){
  3634. //lo8
  3635. tmp |= 0x03;
  3636. base_frequency_tmp = base_frequency * 8.0 / ref_freq * (1 << 24);
  3637. frequency_step_tmp = frequency_step * 8.0 / ref_freq * (1 << 24);
  3638. mid_frequency_tmp = mid_frequency * 8.0 / ref_freq * (1 << 24);
  3639. //190Mhz~253Mhz
  3640. if((final_frequency >= 190000000) && (final_frequency < 195000000)){
  3641. vco_tmp |= (0x0 << 3);
  3642. vco_vd_sw_tmp |= 0x02;
  3643. }else if((final_frequency >= 195000000) && (final_frequency < 203000000)){
  3644. vco_tmp |= (0x1 << 3);
  3645. vco_vd_sw_tmp |= 0x02;
  3646. }else if((final_frequency >= 203000000) && (final_frequency < 210000000)){
  3647. vco_tmp |= (0x2 << 3);
  3648. vco_vd_sw_tmp |= 0x02;
  3649. }else if((final_frequency >= 210000000) && (final_frequency < 220000000)){
  3650. vco_tmp |= (0x3 << 3);
  3651. vco_vd_sw_tmp |= 0x01;
  3652. }else if((final_frequency >= 220000000) && (final_frequency < 230000000)){
  3653. vco_tmp |= (0x4 << 3);
  3654. vco_vd_sw_tmp |= 0x01;
  3655. }else if((final_frequency >= 230000000) && (final_frequency < 243000000)){
  3656. vco_tmp |= (0x5 << 3);
  3657. vco_vd_sw_tmp |= 0x01;
  3658. }else if((final_frequency >= 243000000) && (final_frequency < 253000000)){
  3659. vco_tmp |= (0x6 << 3);
  3660. vco_vd_sw_tmp |= 0x01;
  3661. }
  3662. // else if((final_frequency >= 253000000) && (final_frequency <= 275000000)){
  3663. // vco_tmp |= (0x07 << 3);
  3664. // vco_vd_sw_tmp |= 0x01;
  3665. // }
  3666. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C4);
  3667. freq_tmp &= ~PROPERTY_MSK_R2C4_TRX_COMATCH_EN;
  3668. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C4, freq_tmp);
  3669. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D9);
  3670. freq_tmp &= ~PROPERTY_MSK_R2D9_RX_LNA2_ICORE;
  3671. freq_tmp |= (0x04 << PROPERTY_POS_R2D9_RX_LNA2_ICORE);
  3672. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D9, freq_tmp);
  3673. }else if((final_frequency >= 253000000) && (final_frequency <= 367000000)){
  3674. //lo6
  3675. tmp |= 0x02;
  3676. base_frequency_tmp = base_frequency * 6.0 / ref_freq * (1 << 24);
  3677. frequency_step_tmp = frequency_step * 6.0 / ref_freq * (1 << 24);
  3678. mid_frequency_tmp = mid_frequency * 6.0 / ref_freq * (1 << 24);
  3679. //253Mhz~367Mhz
  3680. if((final_frequency >= 253000000) && (final_frequency < 260000000)){
  3681. vco_tmp |= (0x0 << 3);
  3682. vco_vd_sw_tmp |= 0x02;
  3683. }else if((final_frequency >= 260000000) && (final_frequency < 270000000)){
  3684. vco_tmp |= (0x1 << 3);
  3685. vco_vd_sw_tmp |= 0x02;
  3686. }else if((final_frequency >= 270000000) && (final_frequency < 280000000)){
  3687. vco_tmp |= (0x2 << 3);
  3688. vco_vd_sw_tmp |= 0x02;
  3689. }else if((final_frequency >= 280000000) && (final_frequency < 293000000)){
  3690. vco_tmp |= (0x3 << 3);
  3691. vco_vd_sw_tmp |= 0x01;
  3692. }else if((final_frequency >= 293000000) && (final_frequency < 307000000)){
  3693. vco_tmp |= (0x4 << 3);
  3694. vco_vd_sw_tmp |= 0x01;
  3695. }else if((final_frequency >= 307000000) && (final_frequency < 323000000)){
  3696. vco_tmp |= (0x5 << 3);
  3697. vco_vd_sw_tmp |= 0x01;
  3698. }else if((final_frequency >= 323000000) && (final_frequency < 340000000)){
  3699. vco_tmp |= (0x6 << 3);
  3700. vco_vd_sw_tmp |= 0x01;
  3701. }else if((final_frequency >= 340000000) && (final_frequency <= 367000000)){
  3702. vco_tmp |= (0x07 << 3);
  3703. vco_vd_sw_tmp |= 0x01;
  3704. }
  3705. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C4);
  3706. freq_tmp &= ~PROPERTY_MSK_R2C4_TRX_COMATCH_EN;
  3707. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C4, freq_tmp);
  3708. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D9);
  3709. freq_tmp &= ~PROPERTY_MSK_R2D9_RX_LNA2_ICORE;
  3710. freq_tmp |= (0x04 << PROPERTY_POS_R2D9_RX_LNA2_ICORE);
  3711. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D9, freq_tmp);
  3712. }else if((final_frequency >= 380000000) && (final_frequency <= 550000000)){
  3713. //lo4
  3714. tmp |= 0x01;
  3715. base_frequency_tmp = base_frequency * 4.0 / ref_freq * (1 << 24);
  3716. frequency_step_tmp = frequency_step * 4.0 / ref_freq * (1 << 24);
  3717. mid_frequency_tmp = mid_frequency * 4.0 / ref_freq * (1 << 24);
  3718. //380Mhz~550Mhz
  3719. if((final_frequency >= 380000000) && (final_frequency < 390000000)){
  3720. vco_tmp |= (0x0 << 3);
  3721. vco_vd_sw_tmp |= 0x02;
  3722. }else if((final_frequency >= 390000000) && (final_frequency < 405000000)){
  3723. vco_tmp |= (0x1 << 3);
  3724. vco_vd_sw_tmp |= 0x02;
  3725. }else if((final_frequency >= 405000000) && (final_frequency < 420000000)){
  3726. vco_tmp |= (0x2 << 3);
  3727. vco_vd_sw_tmp |= 0x02;
  3728. }else if((final_frequency >= 420000000) && (final_frequency < 440000000)){
  3729. vco_tmp |= (0x3 << 3);
  3730. vco_vd_sw_tmp |= 0x01;
  3731. }else if((final_frequency >= 440000000) && (final_frequency < 460000000)){
  3732. vco_tmp |= (0x4 << 3);
  3733. vco_vd_sw_tmp |= 0x01;
  3734. }else if((final_frequency >= 460000000) && (final_frequency < 485000000)){
  3735. vco_tmp |= (0x5 << 3);
  3736. vco_vd_sw_tmp |= 0x01;
  3737. }else if((final_frequency >= 485000000) && (final_frequency < 510000000)){
  3738. vco_tmp |= (0x6 << 3);
  3739. vco_vd_sw_tmp |= 0x01;
  3740. }else if((final_frequency >= 510000000) && (final_frequency <= 550000000)){
  3741. vco_tmp |= (0x07 << 3);
  3742. vco_vd_sw_tmp |= 0x01;
  3743. }
  3744. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C4);
  3745. freq_tmp &= ~PROPERTY_MSK_R2C4_TRX_COMATCH_EN;
  3746. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C4, freq_tmp);
  3747. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D9);
  3748. freq_tmp &= ~PROPERTY_MSK_R2D9_RX_LNA2_ICORE;
  3749. freq_tmp |= (0x04 << PROPERTY_POS_R2D9_RX_LNA2_ICORE);
  3750. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D9, freq_tmp);
  3751. }else if((final_frequency >= 760000000) && (final_frequency <= 1100000000)){
  3752. //lo2
  3753. base_frequency_tmp = base_frequency * 2.0 / ref_freq * (1 << 24);
  3754. frequency_step_tmp = frequency_step * 2.0 / ref_freq * (1 << 24);
  3755. mid_frequency_tmp = mid_frequency * 2.0 / ref_freq * (1 << 24);
  3756. //760Mhz~1100Mhz
  3757. if((final_frequency >= 760000000) && (final_frequency < 780000000)){
  3758. vco_tmp |= (0x0 << 3);
  3759. vco_vd_sw_tmp |= 0x02;
  3760. }else if((final_frequency >= 780000000) && (final_frequency < 810000000)){
  3761. vco_tmp |= (0x1 << 3);
  3762. vco_vd_sw_tmp |= 0x02;
  3763. }else if((final_frequency >= 810000000) && (final_frequency < 840000000)){
  3764. vco_tmp |= (0x2 << 3);
  3765. vco_vd_sw_tmp |= 0x02;
  3766. }else if((final_frequency >= 840000000) && (final_frequency < 880000000)){
  3767. vco_tmp |= (0x3 << 3);
  3768. vco_vd_sw_tmp |= 0x01;
  3769. }else if((final_frequency >= 880000000) && (final_frequency < 920000000)){
  3770. vco_tmp |= (0x4 << 3);
  3771. vco_vd_sw_tmp |= 0x01;
  3772. }else if((final_frequency >= 920000000) && (final_frequency < 970000000)){
  3773. vco_tmp |= (0x5 << 3);
  3774. vco_vd_sw_tmp |= 0x01;
  3775. }else if((final_frequency >= 970000000) && (final_frequency < 1020000000)){
  3776. vco_tmp |= (0x6 << 3);
  3777. vco_vd_sw_tmp |= 0x01;
  3778. }else if((final_frequency >= 1020000000) && (final_frequency <= 1100000000)){
  3779. vco_tmp |= (0x07 << 3);
  3780. vco_vd_sw_tmp |= 0x01;
  3781. }
  3782. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C4);
  3783. freq_tmp |= PROPERTY_MSK_R2C4_TRX_COMATCH_EN;
  3784. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C4, freq_tmp);
  3785. freq_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D9);
  3786. freq_tmp &= ~PROPERTY_MSK_R2D9_RX_LNA2_ICORE;
  3787. freq_tmp |= (0x0a << PROPERTY_POS_R2D9_RX_LNA2_ICORE);
  3788. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D9, freq_tmp);
  3789. }
  3790. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1B3, tmp);
  3791. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D2, vco_tmp);
  3792. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D4, vco_vd_sw_tmp);
  3793. //帧结构中插入crc字段
  3794. freq_step_fraction = frequency_step_tmp - (int)frequency_step_tmp;
  3795. base_frequency_tmp += round(freq_step_fraction * channel_number);
  3796. //3[0x71][0x15][0x71][0x16][0x71][0x17][0x71][0x18]base frequency
  3797. PAN312x_Set_PropertyB4(PROPERTY_ADDR_R195, (uint32_t)base_frequency_tmp);
  3798. //4[0x71][0x11][0x71][0x12]frequency step
  3799. PAN312x_Set_PropertyB2(PROPERTY_ADDR_R191, (uint16_t)frequency_step_tmp);
  3800. //5[0x71][0x13][0x71][0x14]channel number
  3801. PAN312x_Set_PropertyB2(PROPERTY_ADDR_R193, channel_number);
  3802. //[0x74][0x40]
  3803. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R236);
  3804. tmp |= PROPERTY_MSK_R236_HI_LO_SET;
  3805. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R236, tmp);
  3806. //7[0x71][0x19][0x71][0x1a][0x71][0x1b](:500khz)
  3807. PAN312x_Set_PropertyB3(PROPERTY_ADDR_R199, (uint32_t)mid_frequency_tmp);
  3808. //8reg_ppm_enable([74][0x22][6]),
  3809. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R322);
  3810. if((tmp & 0x40) == 0x40){
  3811. carrier_frequency_tmp = base_frequency + channel_number * frequency_step;
  3812. carrier_frequency = (int)(ref_freq * 1.0f * (1 << 10) / carrier_frequency_tmp);
  3813. tmpBuffer[0] = (carrier_frequency & 0xff);
  3814. tmpBuffer[1] = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14B);
  3815. tmpBuffer[1] |= ((carrier_frequency >> 8) & 0xff);
  3816. PAN312x_Set_Property(PROPERTY_ADDR_R14A, 2, tmpBuffer);
  3817. }
  3818. s_freq_afe_seg = PAN312x_Get_FrequencyAfeSegment(final_frequency);
  3819. s_freq_afe_valid = 1u;
  3820. }
  3821. /**
  3822. * @简介:跳频友好的频率更新
  3823. * 仅当目标频点跨过 LO/VCO 模拟前端分段时,才调用完整 PAN312x_Set_Frequency;
  3824. * 同段内跳频跳过全量配置,由随后 Enter_Tx/Rx(..., START_COND_ENABLE_CHANNEL, ...) 切换信道
  3825. * @参数:base_frequency(hz):
  3826. * frequency_step(hz):
  3827. * channel_number
  3828. * @返回值: 1-执行了全量 Set_Frequency,0-同段跳过
  3829. */
  3830. int PAN312x_Set_Frequency_ForHop(uint32_t base_frequency, uint32_t frequency_step, uint16_t channel_number)
  3831. {
  3832. uint32_t final_hz;
  3833. uint16_t seg;
  3834. final_hz = base_frequency + frequency_step * (uint32_t)channel_number;
  3835. seg = PAN312x_Get_FrequencyAfeSegment(final_hz);
  3836. if ((s_freq_afe_valid == 0u) || (seg != s_freq_afe_seg) || (seg == 0xFFFFu)) {
  3837. PAN312x_Set_Frequency(base_frequency, frequency_step, channel_number);
  3838. return 1;
  3839. }
  3840. return 0;
  3841. }
  3842. /**
  3843. * @简介:设置PAN312x的Frequency_Channel_Number
  3844. * @参数:channel_number:
  3845. * @返回值:无
  3846. */
  3847. void PAN312x_Set_Frequency_Channel_Number(uint16_t channel_number)
  3848. {
  3849. PAN312x_Set_PropertyB2(PROPERTY_ADDR_R193, channel_number);
  3850. }
  3851. /**
  3852. * @简介:设置PAN312x的发射功率(dBm)
  3853. * @参数:PAN312xPowerdBm:(-20dBm ~ 21dBm,step:1dBm)
  3854. * @返回值:无
  3855. */
  3856. void PAN312x_Set_Power_Ldo(uint16_t Power)
  3857. {
  3858. uint8_t tmp;
  3859. uint8_t vdd_pa_trim ;
  3860. uint8_t pa_2nd_ramp ;
  3861. uint8_t pa_bias_trim ;
  3862. uint8_t lp_en;
  3863. vdd_pa_trim = PAN31XX_LDO_POWER_GET_VDD_PA_TRIM(Power);
  3864. pa_2nd_ramp = PAN31XX_LDO_POWER_GET_PA_2ND_RAMP(Power);
  3865. pa_bias_trim = PAN31XX_LDO_POWER_GET_PA_BIAS_TRIM(Power);
  3866. lp_en = PAN31XX_LDO_POWER_GET_LP_EN(Power);
  3867. //VDD_PA_TRIM[0x73][0x32][7:3]
  3868. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2B2);
  3869. tmp &= ~PROPERTY_MSK_R2B2_VDD_PA_TRIM;
  3870. tmp |= (vdd_pa_trim << PROPERTY_POS_R2B2_VDD_PA_TRIM);
  3871. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2B2, tmp);
  3872. //PA_2ND_RAMP[0x70][0x4e][5:0]
  3873. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14E);
  3874. tmp &= ~PROPERTY_MSK_R14E_PA_2ND_RAMP;
  3875. tmp |= (pa_2nd_ramp << PROPERTY_POS_R14E_PA_2ND_RAMP);
  3876. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14E, tmp);
  3877. //PA_BIAS_TRIM[0x73][0x57][7:4]
  3878. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D7);
  3879. tmp &= ~PROPERTY_MSK_R2D7_PA_BIAS_TRIM;
  3880. tmp |= (pa_bias_trim << PROPERTY_POS_R2D7_PA_BIAS_TRIM);
  3881. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D7, tmp);
  3882. //lp en[0x73][0x46][7]
  3883. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C6);
  3884. tmp &= ~PROPERTY_MSK_R2C6_PA_LP_SEL;
  3885. tmp |= (lp_en << PROPERTY_POS_R2C6_PA_LP_SEL);
  3886. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C6, tmp);
  3887. }
  3888. /**
  3889. * @简介:按DCDC校准码设置PAN312x发射功率
  3890. * @参数:Power:DCDC功率校准码
  3891. * @返回值: 无
  3892. */
  3893. void PAN312x_Set_Power_Dcdc(uint32_t Power)
  3894. {
  3895. uint8_t tmp;
  3896. uint8_t vdd_pa_trim ;
  3897. uint8_t pa_2nd_ramp ;
  3898. uint8_t pa_bias_trim ;
  3899. uint8_t lp_en;
  3900. uint8_t dcdc_en;
  3901. uint8_t dcdc_vout_trim;
  3902. vdd_pa_trim = PAN31XX_DCDC_POWER_GET_VDD_PA_TRIM(Power);
  3903. pa_2nd_ramp = PAN31XX_DCDC_POWER_GET_PA_2ND_RAMP(Power);
  3904. pa_bias_trim = PAN31XX_DCDC_POWER_GET_PA_BIAS_TRIM(Power);
  3905. lp_en = PAN31XX_DCDC_POWER_GET_LP_EN(Power);
  3906. dcdc_en = PAN31XX_DCDC_POWER_GET_DCDC_EN(Power);
  3907. dcdc_vout_trim = PAN31XX_DCDC_POWER_GET_DCDC_VOUT_TRIM(Power);
  3908. //VDD_PA_TRIM[0x73][0x32][7:3]
  3909. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2B2);
  3910. tmp &= ~PROPERTY_MSK_R2B2_VDD_PA_TRIM;
  3911. tmp |= (vdd_pa_trim << PROPERTY_POS_R2B2_VDD_PA_TRIM);
  3912. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2B2, tmp);
  3913. //PA_2ND_RAMP[0x70][0x4e][5:0]
  3914. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14E);
  3915. tmp &= ~PROPERTY_MSK_R14E_PA_2ND_RAMP;
  3916. tmp |= (pa_2nd_ramp << PROPERTY_POS_R14E_PA_2ND_RAMP);
  3917. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14E, tmp);
  3918. //PA_BIAS_TRIM[0x73][0x57][7:4]
  3919. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D7);
  3920. tmp &= ~PROPERTY_MSK_R2D7_PA_BIAS_TRIM;
  3921. tmp |= (pa_bias_trim << PROPERTY_POS_R2D7_PA_BIAS_TRIM);
  3922. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D7, tmp);
  3923. //lp en[0x73][0x46][7]
  3924. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C6);
  3925. tmp &= ~PROPERTY_MSK_R2C6_PA_LP_SEL;
  3926. tmp |= (lp_en << PROPERTY_POS_R2C6_PA_LP_SEL);
  3927. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C6, tmp);
  3928. //dcdc en[0x60][0x06][7]
  3929. PAN312x_Get_OP_Reg(R006, 1, &tmp);
  3930. tmp &= ~R006_EN_DCDC_Msk;
  3931. tmp |= (dcdc_en << R006_EN_DCDC_Pos);
  3932. PAN312x_Set_OP_Reg(R006, 1, &tmp);
  3933. //dcdc vout trim[0x73][0x34][4:0]
  3934. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2B4);
  3935. tmp &= ~PROPERTY_MSK_R2B4_DCDC_VOUT_TRIM;
  3936. tmp |= (dcdc_vout_trim << PROPERTY_POS_R2B4_DCDC_VOUT_TRIM);
  3937. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2B4, tmp);
  3938. }
  3939. /**
  3940. * @简介:设置PAN312x的发射功率(dBm)
  3941. * @参数:PowerdBm:(-20dBm ~ 21dBm,step:1dBm)
  3942. * @返回值: 无
  3943. */
  3944. void PAN312x_Set_Power(uint32_t Frequency, uint32_t FrequencyStep, uint16_t ChannelNumber, PAN312xPowerSelect PowerSelect, PAN312xPowerdBm PowerdBm)
  3945. {
  3946. int power;
  3947. power = (int)(PowerdBm & 0xff) - 20;
  3948. if((PowerSelect == POWER_LDO_0603) || (PowerSelect == POWER_LDO_0402)){
  3949. if((power > 20) || (power < -20)){
  3950. while(1);
  3951. }
  3952. }else if((PowerSelect == POWER_DCDC_0603) || (PowerSelect == POWER_DCDC_0402)){
  3953. if((power > 13) || (power < -20)){
  3954. while(1);
  3955. }
  3956. }
  3957. uint32_t freq_tmp = Frequency + ChannelNumber * FrequencyStep;
  3958. if(freq_tmp >= 127000000 && (freq_tmp <= 183000000)){
  3959. if(PowerSelect == POWER_LDO_0603){
  3960. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0603_420_445mhz[PowerdBm]);
  3961. }else if(PowerSelect == POWER_LDO_0402){
  3962. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0402_420_445mhz[PowerdBm]);
  3963. }else if(PowerSelect == POWER_DCDC_0603){
  3964. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0603_420_445mhz[PowerdBm]);
  3965. }else if(PowerSelect == POWER_DCDC_0402){
  3966. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0402_420_445mhz[PowerdBm]);
  3967. }
  3968. }else if(freq_tmp >= 420000000 && (freq_tmp <= 445000000)){
  3969. if(PowerSelect == POWER_LDO_0603){
  3970. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0603_420_445mhz[PowerdBm]);
  3971. }else if(PowerSelect == POWER_LDO_0402){
  3972. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0402_420_445mhz[PowerdBm]);
  3973. }else if(PowerSelect == POWER_DCDC_0603){
  3974. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0603_420_445mhz[PowerdBm]);
  3975. }else if(PowerSelect == POWER_DCDC_0402){
  3976. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0402_420_445mhz[PowerdBm]);
  3977. }
  3978. }else if(freq_tmp >= 470000000 && (freq_tmp <= 510000000)){
  3979. if(PowerSelect == POWER_LDO_0603){
  3980. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0603_470_510mhz[PowerdBm]);
  3981. }else if(PowerSelect == POWER_LDO_0402){
  3982. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0402_470_510mhz[PowerdBm]);
  3983. }else if(PowerSelect == POWER_DCDC_0603){
  3984. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0603_470_510mhz[PowerdBm]);
  3985. }else if(PowerSelect == POWER_DCDC_0402){
  3986. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0402_470_510mhz[PowerdBm]);
  3987. }
  3988. }else if(freq_tmp >= 860000000 && (freq_tmp <= 870000000)){
  3989. if(PowerSelect == POWER_LDO_0603){
  3990. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0603_860_870mhz[PowerdBm]);
  3991. }else if(PowerSelect == POWER_LDO_0402){
  3992. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0402_860_870mhz[PowerdBm]);
  3993. }else if(PowerSelect == POWER_DCDC_0603){
  3994. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0603_860_870mhz[PowerdBm]);
  3995. }else if(PowerSelect == POWER_DCDC_0402){
  3996. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0402_860_870mhz[PowerdBm]);
  3997. }
  3998. }else if(freq_tmp >= 902000000 && (freq_tmp <= 928000000)){
  3999. if(PowerSelect == POWER_LDO_0603){
  4000. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0603_902_928mhz[PowerdBm]);
  4001. }else if(PowerSelect == POWER_LDO_0402){
  4002. PAN312x_Set_Power_Ldo(pan31xx_ldo_power_0402_902_928mhz[PowerdBm]);
  4003. }else if(PowerSelect == POWER_DCDC_0603){
  4004. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0603_902_928mhz[PowerdBm]);
  4005. }else if(PowerSelect == POWER_DCDC_0402){
  4006. PAN312x_Set_Power_Dcdc(pan31xx_dcdc_power_0402_902_928mhz[PowerdBm]);
  4007. }
  4008. }
  4009. }
  4010. /**
  4011. * @简介:获取PAN312x的接收信号的RSSI值
  4012. * 芯片收取到数据时,芯片内部逻辑会统计当前数据包的信号强度。
  4013. * @参数:无
  4014. * @返回值:RSSI值
  4015. */
  4016. int PAN312x_GetRSSI(void)
  4017. {
  4018. uint8_t tmp;
  4019. uint8_t rate_tmp;
  4020. uint16_t data_rate_a;
  4021. uint8_t rssi_offset = 0;
  4022. uint16_t fw_id;
  4023. uint8_t lo_mux_tmp;
  4024. uint8_t vco_tmp;
  4025. int cRssi;
  4026. //[0x71][0x06]
  4027. rate_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R186);
  4028. if((rate_tmp & PROPERTY_MSK_R186_REG_SYMB_AB_SEL) == PROPERTY_MSK_R186_REG_SYMB_AB_SEL){
  4029. rate_tmp = (rate_tmp & PROPERTY_MSK_R186_REG_SYMBRATE_B) >> 4;
  4030. if((rate_tmp == 0x00) || (rate_tmp == 0x03) || (rate_tmp == 0x05) || (rate_tmp == 0x07)){
  4031. //50kbps100kbps200kbps400kbps
  4032. rssi_offset = 5;
  4033. }else if(rate_tmp == 0x02){
  4034. //80kbps
  4035. rssi_offset = 3;
  4036. }else{
  4037. rssi_offset = 0;
  4038. }
  4039. }else{
  4040. //data rate <= 40kbps
  4041. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R187);
  4042. data_rate_a = tmp;
  4043. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R188);
  4044. data_rate_a |= ((tmp & PROPERTY_MSK_R188_REG_SYMBRATE_A_H) << 8);
  4045. if(data_rate_a == 400){
  4046. //40kbps
  4047. rssi_offset = 3;
  4048. }else{
  4049. rssi_offset = 0;
  4050. }
  4051. }
  4052. PAN312x_Get_FwId(&fw_id);
  4053. if(fw_id == 0x0003){
  4054. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1BD);
  4055. }else{
  4056. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_RSSI_RBW_HOLD);
  4057. }
  4058. cRssi = (int)tmp;
  4059. if(cRssi > 0x7f){
  4060. cRssi = (0x100 - cRssi - rssi_offset);
  4061. }else{
  4062. cRssi -= rssi_offset;
  4063. }
  4064. lo_mux_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1B3);
  4065. vco_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D2);
  4066. if(((lo_mux_tmp & 0x07) == 0x01) && (((vco_tmp&0x38) >> 3) == 0x3)){
  4067. cRssi -= 3;
  4068. }else if(((lo_mux_tmp & 0x07) == 0x01) && (((vco_tmp&0x38) >> 3) == 0x4)){
  4069. cRssi -= 5;
  4070. }else if(((lo_mux_tmp & 0x07) == 0x01) && (((vco_tmp&0x38) >> 3) == 0x5)){
  4071. cRssi += 1;
  4072. }else if(((lo_mux_tmp & 0x07) == 0x00) && (((vco_tmp&0x38) >> 3) == 0x4)){
  4073. cRssi -= 7;
  4074. }else if(((lo_mux_tmp & 0x07) == 0x00) && (((vco_tmp&0x38) >> 3) == 0x5)){
  4075. cRssi -= 7;
  4076. }
  4077. return cRssi;
  4078. }
  4079. /**
  4080. * PAN312x RF Team
  4081. * @RSSI
  4082. * @
  4083. * @RSSI
  4084. */
  4085. int PAN312x_GetChannelCheckRssi(void)
  4086. {
  4087. uint8_t tmp;
  4088. int cRssi;
  4089. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1BF);
  4090. cRssi = (int)tmp;
  4091. if(cRssi > 0x7f){
  4092. cRssi = (0x100 - cRssi);
  4093. }
  4094. return cRssi;
  4095. }
  4096. /**
  4097. * @简介:获取PAN312x接收信号的LQI
  4098. * @参数:无
  4099. * @返回值: LQI值(低12位有效)
  4100. */
  4101. int PAN312x_GetLqi(void)
  4102. {
  4103. return (PAN312x_Get_PropertyB2(PROPERTY_ADDR_NOISE_PWR) & 0xfff);
  4104. }
  4105. /**
  4106. * @简介:PAN312x的两点式校准
  4107. * @参数:symbol_rate:速率
  4108. * tx_deviation:发送 deviation
  4109. * ref_diff:参考值
  4110. * @返回值:无
  4111. * 备注:
  4112. * 1、当速率大于等于200kbps时,需要进行两点式校准
  4113. */
  4114. void PAN312x_Two_Point_Calibration(uint8_t symbol_rate, uint32_t tx_deviation, uint16_t ref_diff)
  4115. {
  4116. uint8_t tmp;
  4117. //[0x70][0x59][4:3],设置0,表示使用第一组两点式校准code
  4118. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R159);
  4119. tmp &= ~PROPERTY_MSK_R159_TP_CODE_GROUP_SEL;
  4120. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R159, tmp);
  4121. /*
  4122. * 2 780~1110 [0x73][0x42][1] 0
  4123. //5[0x73][0x4f][5:0]RCCAL_CAPTUNE,
  4124. //5[0x73][0x4f][5:0]RCCAL_CAPTUNE,
  4125. */
  4126. //[0x73][0x42][1]
  4127. uint8_t lo_tmp;
  4128. lo_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1B3);
  4129. lo_tmp &= PROPERTY_MSK_R1B3_LO_MUX_SEL;
  4130. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C2);
  4131. if(lo_tmp == 0x00){
  4132. //2
  4133. tmp &= ~PROPERTY_MSK_R2C2_DAC_SG_SEL;
  4134. }else if(lo_tmp == 0x01){
  4135. //4
  4136. tmp |= PROPERTY_MSK_R2C2_DAC_SG_SEL;
  4137. }else if(lo_tmp == 0x02){
  4138. //6
  4139. tmp |= PROPERTY_MSK_R2C2_DAC_SG_SEL;
  4140. }
  4141. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C2, tmp);
  4142. if(symbol_rate == 0x0a){
  4143. //2M
  4144. //[0x70][0x4d]
  4145. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14D);
  4146. tmp &= ~PROPERTY_MSK_R14D_PLL_VCO_TXCTK;
  4147. tmp |= 0x01;//tmp |= 0x03;
  4148. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14D, tmp);
  4149. //[0x73][0x42]
  4150. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C2);
  4151. tmp &= ~PROPERTY_MSK_R2C2_DAC_SEL_SW;
  4152. tmp |= (0x01 << 2);//tmp |= (0x03 << 2);
  4153. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C2, tmp);
  4154. }else{
  4155. //[0x70][0x4d]
  4156. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14D);
  4157. tmp &= ~PROPERTY_MSK_R14D_PLL_VCO_TXCTK;
  4158. tmp |= 0x01;
  4159. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14D, tmp);
  4160. //[0x73][0x42]
  4161. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C2);
  4162. tmp &= ~PROPERTY_MSK_R2C2_DAC_SEL_SW;
  4163. tmp |= (0x01 << 2);
  4164. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C2, tmp);
  4165. }
  4166. if((symbol_rate == 0x0a) || ((symbol_rate == 0x09) && tx_deviation == 500000)){
  4167. //2M
  4168. //1M & tx_deviation = 500000hz
  4169. //[0x73][0x58]
  4170. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D8);
  4171. tmp &= ~PROPERTY_MSK_R2D8_DAC_ISEL;
  4172. tmp |= (0x07 << 4);
  4173. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D8, tmp);
  4174. }else{
  4175. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D8);
  4176. tmp &= ~PROPERTY_MSK_R2D8_DAC_ISEL;
  4177. tmp |= (0x02 << 4);
  4178. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D8, tmp);
  4179. }
  4180. //[0x71][0x24]
  4181. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1A4);
  4182. tmp |= 0x01;
  4183. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1A4, tmp);
  4184. //enter tx
  4185. tmp = 0x10;
  4186. PAN312x_Set_OP_Reg(R003, 1, &tmp);
  4187. tmp = 0x20;
  4188. PAN312x_Set_OP_Reg(R003, 1, &tmp);
  4189. delay1ms(200);
  4190. //[0x70][0x63]
  4191. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R163);
  4192. vcol_cal_code = (tmp & 0x3f);
  4193. //[0x70][0x69]
  4194. PAN312x_Set_PropertyB2(PROPERTY_ADDR_R169, ref_diff);
  4195. //[0x73][0x4b]
  4196. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2CB);
  4197. tmp |= (0x01 << 2);
  4198. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2CB, tmp);
  4199. //[0x70][0x57]
  4200. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R157);
  4201. tmp &= 0x7f;
  4202. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R157, tmp);
  4203. //[70][0x64]
  4204. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R164);
  4205. tmp |= (0x01 << 6);
  4206. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R164, tmp);
  4207. delay10us(200);
  4208. tmp |= (0x01 << 7);
  4209. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R164, tmp);
  4210. delay10us(200);
  4211. tmp |= (0x01 << 4);
  4212. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R164, tmp);
  4213. delay10us(200);
  4214. tmp &= 0xef;
  4215. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R164, tmp);
  4216. delay1ms(200);
  4217. //[0x70][0x5e]
  4218. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R15E);
  4219. tp_auto_code = tmp;
  4220. //tp_auto_code = 0x77;
  4221. //[0x70][0x64]
  4222. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R164);
  4223. tmp |= 0x7f;
  4224. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R164, tmp);
  4225. tmp &= 0xbf;
  4226. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R164, tmp);
  4227. //[0x70][0x67]
  4228. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R167);
  4229. tmp &= 0xe0;
  4230. tmp |= (tp_auto_code & 0x1f);
  4231. #if 0
  4232. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R167, tmp);
  4233. #else
  4234. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R165, tmp);
  4235. // PAN312x_Set_PropertyB1(PROPERTY_ADDR_R166, tmp);
  4236. // PAN312x_Set_PropertyB1(PROPERTY_ADDR_R167, tmp);
  4237. // PAN312x_Set_PropertyB1(PROPERTY_ADDR_R168, tmp);
  4238. #endif
  4239. //[0x73][0x4b]
  4240. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2CB);
  4241. tmp &= 0xfb;
  4242. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2CB, tmp);
  4243. //[0x71][0x24]
  4244. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1A4);
  4245. tmp &= 0xfe;
  4246. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1A4, tmp);
  4247. delay10us(120);
  4248. //[0x70][0x42]
  4249. // tmp = 0x80;
  4250. // PAN312x_Set_PropertyB1(PROPERTY_ADDR_R142, tmp);
  4251. //7ready
  4252. tmp = 0x10;
  4253. PAN312x_Set_OP_Reg(R003, 1, &tmp);
  4254. }
  4255. /**
  4256. * @简介:PAN312x的RC校准
  4257. * @参数:无
  4258. * @返回值:无
  4259. */
  4260. void PAN312x_RC_Calibration(void)
  4261. {
  4262. uint8_t tmp;
  4263. //1rx
  4264. tmp = 0x40;
  4265. PAN312x_Set_OP_Reg(R003, 1, &tmp);
  4266. //[0x74][0x40]
  4267. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D9);
  4268. tmp |= PROPERTY_MSK_R2D9_EN_RX_RCCAL;
  4269. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D9, tmp);
  4270. delay10us(10);
  4271. //[0x74][0x40]
  4272. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D9);
  4273. tmp |= PROPERTY_MSK_R2D9_RX_RCCAL_RST;
  4274. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D9, tmp);
  4275. delay10us(10);
  4276. //[0x74][0x40]
  4277. do{
  4278. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2CF);
  4279. }while(!((tmp & PROPERTY_MSK_R2CF_RCCAL_DONE) == PROPERTY_MSK_R2CF_RCCAL_DONE));
  4280. //5[0x73][0x4f][5:0]RCCAL_CAPTUNE,
  4281. //[0x74][0x40]
  4282. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2CF);
  4283. tmp &= PROPERTY_MSK_R2CF_RCCAL_CAPTUNE;
  4284. rc_code = tmp;
  4285. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14F, tmp);
  4286. //6[0x73][0x59][1]0
  4287. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D9);
  4288. tmp &= ~PROPERTY_MSK_R2D9_RX_RCCAL_RST;
  4289. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D9, tmp);
  4290. //7ready
  4291. tmp = 0x10;
  4292. PAN312x_Set_OP_Reg(R003, 1, &tmp);
  4293. }
  4294. /**
  4295. * @简介:使能PAN312x的DCDC
  4296. * @参数:无
  4297. * @返回值: 无
  4298. * 备注:
  4299. * 1、rx若需要用dcdc模式,需在初始化中调用该函数;
  4300. * 2、tx若需要用dcdc模式,只需要配置功率就可以了(PAN312x_Set_Power),
  4301. * 因为在PAN312x_Set_Power中已经使能dcdc,需要注意tx如果使能dcdc,发射功率最大只支持到14dBm。
  4302. */
  4303. void PAN312x_DCDC_Enable(void)
  4304. {
  4305. uint8_t tmp;
  4306. //[0x60][06]
  4307. PAN312x_Get_OP_Reg(R006, 1, &tmp);
  4308. tmp |= R006_EN_DCDC_Msk;
  4309. PAN312x_Set_OP_Reg(R006, 1, &tmp);
  4310. //[0x73][0x44]
  4311. ////regmap inittx rx
  4312. // PAN312x_Get_OP_Reg(R2C4, 1, &tmp);
  4313. // //DCDC_BUFSEL:[0x73][0x44][7:5] = 000b
  4314. // tmp &= ~R2C4_DCDC_BUFSEL_Msk;
  4315. // //DCDC_RESSEL:[0x73][0x44][4:2] = 010b
  4316. // tmp &= ~R2C4_DCDC_RESSEL_Msk;
  4317. // tmp |= (0x02 << R2C4_DCDC_RESSEL_Pos);
  4318. // PAN312x_Set_OP_Reg(R2C4, 1, &tmp);
  4319. //[0x73][0x45]
  4320. //PAN312x_Get_OP_Reg(R2C5, 1, &tmp);
  4321. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C5);
  4322. //DCDC_CAL_EN: [0x73][0x45][7:6] =00b dcdc自动校准关闭
  4323. tmp &= ~PROPERTY_MSK_R2C5_DCDC_CAL_EN;
  4324. //DCDC_CAL_EN: [0x73][0x45][5:3] =111b dcdc
  4325. //regmap inittx rx
  4326. // tmp &= ~R2C5_DCDC_IMAX_Msk;
  4327. // tmp |= (0x07 << R2C5_DCDC_IMAX_Pos);
  4328. //test begin
  4329. //tmp |= R2C5_DCDC_SSEN_Msk;
  4330. //test end
  4331. //PAN312x_Set_OP_Reg(R2C5, 1, &tmp);
  4332. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C5, tmp);
  4333. }
  4334. void PAN312x_DCDC_Disable(void)
  4335. {
  4336. uint8_t tmp;
  4337. //[0x60][06]
  4338. PAN312x_Get_OP_Reg(R006, 1, &tmp);
  4339. tmp &= ~R006_EN_DCDC_Msk;
  4340. PAN312x_Set_OP_Reg(R006, 1, &tmp);
  4341. }
  4342. /**
  4343. //GPIO Direct Rx寄存器初始化
  4344. * @
  4345. * @:
  4346. */
  4347. //同步模式
  4348. void PAN312x_SynchoronousMode_GpioDirectTxInit(void)
  4349. {
  4350. //GPIO Direct Rx寄存器初始化
  4351. // PAN312x_Iomux_Gpio(IOMUX_GPIO0_AS_DIRECT_TX);
  4352. // PAN312x_Set_Gpio_Mode(GPIO_PIN_0, GPIO_INPUT_MODE);
  4353. //
  4354. // //GPIO1
  4355. // PAN312x_Iomux_Gpio(IOMUX_GPIO1_AS_DIRECT_CLK);
  4356. // PAN312x_Set_Gpio_Mode(GPIO_PIN_1, GPIO_OUTPUT_MODE);
  4357. //GPIO Direct Tx
  4358. PAN312x_GPIO_Direct_Tx_Enable();
  4359. //
  4360. PAN312x_Gpio_Direct_Synchronous_Mode();
  4361. }
  4362. void PAN312x_AsynchoronousMode_GpioDirectTxInit(void)
  4363. {
  4364. //GPIO Direct Tx
  4365. PAN312x_GPIO_Direct_Tx_Enable();
  4366. //
  4367. PAN312x_Gpio_Direct_Asynchronous_Mode();
  4368. }
  4369. /**
  4370. //GPIO Direct Rx寄存器初始化
  4371. * @
  4372. * @:
  4373. */
  4374. //void EXTI9_5_IRQHandler(void)
  4375. //{
  4376. // HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  4377. //}
  4378. void PAN312x_Gpio_Direct_RxByPass_Enable(void)
  4379. {
  4380. uint8_t tmp;
  4381. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R30E);
  4382. tmp |= PROPERTY_MSK_R30E_DIRECT_BYPASS_MODE;
  4383. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R30E, tmp);
  4384. }
  4385. void PAN312x_Gpio_Direct_RxByPass_Disnable(void)
  4386. {
  4387. uint8_t tmp;
  4388. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R30E);
  4389. tmp &= ~PROPERTY_MSK_R30E_DIRECT_BYPASS_MODE;
  4390. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R30E, tmp);
  4391. }
  4392. //
  4393. /**
  4394. * @简介:初始化同步模式GPIO Direct Rx
  4395. * @参数:无
  4396. * @返回值: 无
  4397. */
  4398. void PAN312x_SynchoronousMode_GpioDirectRxInit(void)
  4399. {
  4400. // PAN312x_Enter_Ready();
  4401. //GPIO Direct Rx
  4402. PAN312x_GPIO_Direct_Rx_Enable();
  4403. //GPIO Direct Rx寄存器初始化
  4404. PAN312x_Gpio_Direct_Rx_Regmap_Init();
  4405. //
  4406. PAN312x_Gpio_Direct_Synchronous_Mode();
  4407. }
  4408. //
  4409. /**
  4410. * @简介:初始化异步模式GPIO Direct Rx
  4411. * @参数:无
  4412. * @返回值: 无
  4413. */
  4414. void PAN312x_AsynchoronousMode_GpioDirectRxInit(void)
  4415. {
  4416. // PAN312x_Iomux_Gpio(IOMUX_GPIO0_AS_DIRECT_RX);
  4417. // PAN312x_Set_Gpio_Mode(PAN312x_GPIO_PIN_0, GPIO_OUTPUT_MODE);
  4418. //
  4419. // PAN312x_Iomux_Gpio(IOMUX_GPIO1_AS_DIRECT_RX);
  4420. // PAN312x_Set_Gpio_Mode(PAN312x_GPIO_PIN_1, GPIO_OUTPUT_MODE);
  4421. // PAN312x_Iomux_Gpio(IOMUX_GPIO2_AS_DIRECT_RX);
  4422. // PAN312x_Set_Gpio_Mode(PAN312x_GPIO_PIN_2, GPIO_OUTPUT_MODE);
  4423. //GPIO Direct Rx
  4424. PAN312x_GPIO_Direct_Rx_Enable();
  4425. //GPIO Direct Rx寄存器初始化
  4426. PAN312x_Gpio_Direct_Rx_Regmap_Init();
  4427. PAN312x_Gpio_Direct_Asynchronous_Mode();
  4428. //agc_manu_en
  4429. // PAN312x_Get_OP_Reg(R206, 1, &tmp);
  4430. // tmp |= R206_REG_AGC_MANU_EN_Msk;
  4431. // PAN312x_Set_OP_Reg(R206, 1, &tmp);
  4432. //
  4433. // //[0x74][0x16][1]:dagc_manu_en
  4434. // PAN312x_Get_OP_Reg(R316, 1, &tmp);
  4435. // tmp |= R316_REG_DAGC_MANU_EN_Msk;
  4436. // PAN312x_Set_OP_Reg(R316, 1, &tmp);
  4437. //[0x74][0x1a]
  4438. //Direct rx bypass mode
  4439. PAN312x_Gpio_Direct_RxByPass_Enable();
  4440. }
  4441. /**
  4442. * @简介:PAN312x的GPIO Direct Rx寄存器初始化
  4443. * @参数:无
  4444. * @返回值: 无
  4445. */
  4446. void PAN312x_Gpio_Direct_Rx_Regmap_Init(void)
  4447. {
  4448. uint8_t tmp;
  4449. //[0x74][0x0b]:盲同步纠频偏快慢阈值
  4450. tmp = 0xcf;
  4451. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R30B, tmp);
  4452. //[0x74][0x0c]:盲同步PPM计算快慢阈值
  4453. tmp = 0x6b;
  4454. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R30C, tmp);
  4455. //[0x74][0x0e]:打开盲同步使能,盲同步频偏计算使能
  4456. tmp = 0x50;
  4457. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R30E, tmp);
  4458. //[0x74][0x18]:配置dagc的alpha belta系数
  4459. tmp = 0xa7;
  4460. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R318, tmp);
  4461. }
  4462. /**
  4463. * @简介:Iomux PAN312x的GPIO功能
  4464. * @参数:IomuxGpio
  4465. * @返回值: 无
  4466. */
  4467. void PAN312x_Iomux_Gpio(uint32_t IomuxGpio)
  4468. {
  4469. uint8_t tmp;
  4470. uint16_t reg_addr;
  4471. reg_addr = (uint16_t)(IomuxGpio & 0x7ff);
  4472. PAN312x_Get_OP_Reg(reg_addr, 1, &tmp);
  4473. tmp &= ~((uint8_t)(IomuxGpio >> 16));
  4474. tmp |= ((uint8_t)(IomuxGpio >> 24));
  4475. PAN312x_Set_OP_Reg(reg_addr, 1, &tmp);
  4476. }
  4477. /**
  4478. * @简介:设置PAN312x的GPIO模式
  4479. * @参数:GpioPin:
  4480. * Mode:
  4481. * 0x01: 输出模式
  4482. * 0x00: 输入模式
  4483. * @返回值: 无
  4484. */
  4485. void PAN312x_Set_Gpio_Mode(uint16_t GpioPin, uint8_t Mode)
  4486. {
  4487. uint8_t tmp;
  4488. uint8_t GpioPin0_2_11 = 0x00,GpioPin3_10 = 0x00;
  4489. GpioPin0_2_11 = (uint8_t)GpioPin;
  4490. GpioPin3_10 = (uint8_t)(GpioPin >> 8);
  4491. if(GpioPin0_2_11 != 0x00){
  4492. //[0x71][0x30]
  4493. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1B0);
  4494. if(Mode == GPIO_INPUT_MODE) {
  4495. tmp &= ~(GpioPin0_2_11 << 4);
  4496. tmp |= GpioPin0_2_11;
  4497. }
  4498. else if(Mode == GPIO_OUTPUT_MODE){
  4499. tmp |= (GpioPin0_2_11 << 4);
  4500. }
  4501. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1B0, tmp);
  4502. }
  4503. if(GpioPin3_10 != 0x00){
  4504. //[0x60][0x19]
  4505. PAN312x_Get_OP_Reg(R019, 1, &tmp);
  4506. if(Mode == GPIO_INPUT_MODE) {
  4507. tmp &= ~GpioPin3_10;
  4508. PAN312x_Set_OP_Reg(R019, 1, &tmp);
  4509. PAN312x_Get_OP_Reg(R018, 1, &tmp);
  4510. tmp |= GpioPin3_10;
  4511. PAN312x_Set_OP_Reg(R018, 1, &tmp);
  4512. }
  4513. else if(Mode == GPIO_OUTPUT_MODE){
  4514. tmp |= GpioPin3_10;
  4515. PAN312x_Set_OP_Reg(R019, 1, &tmp);
  4516. }
  4517. }
  4518. }
  4519. void PAN312x_Gpio_Write_Pin(uint16_t GpioPin, uint8_t PinState)
  4520. {
  4521. uint8_t tmp;
  4522. uint8_t GpioPin0_2_11 = 0x00,GpioPin3_10 = 0x00;
  4523. GpioPin0_2_11 = (uint8_t)GpioPin;
  4524. GpioPin3_10 = (uint8_t)(GpioPin >> 8);
  4525. if(GpioPin0_2_11 != 0x00){
  4526. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1B2);
  4527. if(PinState == 0) {
  4528. tmp &= ~GpioPin0_2_11;
  4529. }
  4530. else if(PinState == 1){
  4531. tmp |= GpioPin0_2_11;
  4532. }
  4533. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1B2, tmp);
  4534. }
  4535. if(GpioPin3_10 != 0x00){
  4536. PAN312x_Get_OP_Reg(R017, 1, &tmp);
  4537. if(PinState == 0) {
  4538. tmp &= ~GpioPin3_10;
  4539. }
  4540. else if(PinState == 1){
  4541. tmp |= GpioPin3_10;
  4542. }
  4543. PAN312x_Set_OP_Reg(R017, 1, &tmp);
  4544. }
  4545. }
  4546. /**
  4547. * @简介:设置PAN312x的gpio输出系统时钟
  4548. * @参数:IomuxGpio:时钟输出的gpio(gpio0、gpio1、gpio2、gpio9、gpio10)
  4549. * OclkFrequency:
  4550. * 0: 16Mhz
  4551. * 1: 8Mhz
  4552. * 2: 4Mhz
  4553. * 3: 2Mhz
  4554. * 4: 2Mhz
  4555. * 5: 500Khz
  4556. * @返回值:无
  4557. */
  4558. void PAN312x_GpioOutputOclk(uint32_t IomuxGpio, PAN312xGpioOutputClk ClkFrequency)
  4559. {
  4560. uint8_t clk_select,clk_set;
  4561. clk_select = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14D);
  4562. clk_set = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R150);
  4563. clk_set |= (PROPERTY_MSK_R150_OCLK_EN | PROPERTY_MSK_R150_OCLK_SRC_SEL);
  4564. if(ClkFrequency <4){
  4565. //16Mhz8Mhz4Mhz2Mhz
  4566. clk_select &= ~PROPERTY_MSK_R14D_OCLK_500K_SEL;
  4567. clk_set &= ~PROPERTY_MSK_R150_OCLK_DIV_SEL;
  4568. clk_set |=(ClkFrequency << PROPERTY_POS_R150_OCLK_DIV_SEL);
  4569. }else if(ClkFrequency == 4){
  4570. //500Khzclk
  4571. clk_select |= PROPERTY_MSK_R14D_OCLK_500K_SEL;
  4572. }
  4573. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14D,clk_select);
  4574. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R150,clk_set);
  4575. PAN312x_Iomux_Gpio(IomuxGpio);
  4576. }
  4577. /**
  4578. * @简介:设置PAN312x进入单载波模式
  4579. * @参数:frequency:频点
  4580. * power:发射功率
  4581. * @返回值:无
  4582. */
  4583. void PAN312x_Enter_Carrier(uint32_t Frequency, uint32_t FrequencyStep, uint16_t ChannelNumber, PAN312xPowerSelect PowerSelect, PAN312xPowerdBm PowerdBm)
  4584. {
  4585. uint8_t tmp;
  4586. // tmp = 0x10;
  4587. // PAN312x_Set_OP_Reg(R003, 1, &tmp);
  4588. PAN312x_Enter_Ready();
  4589. //1tx
  4590. tmp = 0x20;
  4591. PAN312x_Set_OP_Reg(R003, 1, &tmp);
  4592. //2
  4593. PAN312x_Set_Frequency(Frequency, FrequencyStep, ChannelNumber);
  4594. //3
  4595. PAN312x_Set_Power(Frequency, FrequencyStep, ChannelNumber, PowerSelect, PowerdBm);
  4596. //4tx
  4597. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R153);
  4598. tmp |= PROPERTY_MSK_R153_REG_TX_CFG_MODE;
  4599. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R153, tmp);
  4600. //5
  4601. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1A4);
  4602. tmp |= PROPERTY_MSK_R1A4_REG_TX_FIFO_FULL;
  4603. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1A4, tmp);
  4604. }
  4605. /**
  4606. * @简介:通过spi命令唤醒PAN312x
  4607. * @参数:无
  4608. * @返回值:无
  4609. */
  4610. void PAN312x_WakeUp_BySpi(void)
  4611. {
  4612. uint8_t tmp;
  4613. //rch_en改为用状态机控制
  4614. PAN312x_Read(R004, &tmp);
  4615. tmp &= ~R004_REG_ENRCH_SEL_Msk;
  4616. PAN312x_Write(R004, tmp);
  4617. PAN312x_Write(R005, 0x60);
  4618. PAN312x_Read(R007, &tmp);
  4619. tmp |= (R007_SPI_WKEN_Msk | R007_SPI_WKTRIG_Msk);
  4620. PAN312x_Write(R007, tmp);
  4621. //31.25us, 3rcl 100us
  4622. delay10us(100);
  4623. tmp &= ~R007_SPI_WKTRIG_Msk;
  4624. PAN312x_Write(R007, tmp);
  4625. tmp = 0x00;
  4626. PAN312x_Write(R005, tmp);
  4627. }
  4628. /**
  4629. * @简介:使能PAN312x的rcl时钟
  4630. * @参数:无
  4631. * @返回值:无
  4632. */
  4633. void PAN312x_ClkRcl_Enable(void)
  4634. {
  4635. uint8_t tmp;
  4636. PAN312x_Write(R005, 0x60);
  4637. PAN312x_Read(R00E, &tmp);
  4638. tmp |= R00E_EN_RCL_3V_Msk;
  4639. PAN312x_Write(R00E, tmp);
  4640. PAN312x_Write(R005, 0x00);
  4641. }
  4642. /**
  4643. * @简介:失能PAN312x的rcl时钟
  4644. * @参数:无
  4645. * @返回值:无
  4646. */
  4647. void PAN312x_ClkRcl_Disable(void)
  4648. {
  4649. uint8_t tmp;
  4650. PAN312x_Write(R005, 0x60);
  4651. PAN312x_Read(R00E, &tmp);
  4652. tmp &= ~R00E_EN_RCL_3V_Msk;
  4653. PAN312x_Write(R00E, tmp);
  4654. PAN312x_Write(R005, 0x00);
  4655. }
  4656. /**
  4657. * @简介:设置PAN312x 的SymbolRate(SymbolRate <= 40kbps)
  4658. * @参数:symbol_rate_a:
  4659. * example:200(设置的值) 实际对应的速率 20kbps
  4660. * @返回值:无
  4661. */
  4662. void PAN312x_Set_Symbol_RateA(uint16_t symbol_rate_a)
  4663. {
  4664. uint8_t tmp, tmpBuffer[3];
  4665. uint32_t IntermediateFrequency;
  4666. uint8_t lo_tmp;
  4667. //agc config for 760Mhz ~ 1110Mhz
  4668. uint8_t Agc2_500Kbps_LoDiv2[37] = {0x06, 0x5f, 0x05, 0x35, 0x66, 0x23, 0x05, 0x00,
  4669. 0x5d, 0x23, 0x05, 0x00, 0x5d, 0x23, 0x05, 0x00,
  4670. 0x5d, 0x23, 0x05, 0x00, 0x5d, 0x23, 0x05, 0x00,
  4671. 0x4e, 0x37, 0x05, 0x10, 0x3F, 0x57, 0x05, 0x20,
  4672. 0x30, 0x6f, 0x05, 0x2e, 0x0c};
  4673. //agc config for 380Mhz ~ 550Mhz
  4674. uint8_t Agc2_500Kbps_LoDiv4[37] = {0x06, 0x5f, 0x05, 0x35, 0x66, 0x23, 0x05, 0x05,
  4675. 0x56, 0x23, 0x05, 0x05, 0x56, 0x23, 0x05, 0x05,
  4676. 0x56, 0x23, 0x05, 0x05, 0x56, 0x23, 0x05, 0x05,
  4677. 0x56, 0x37, 0x05, 0x18, 0x3F, 0x3f, 0x05, 0x25,
  4678. 0x33, 0x5f, 0x05, 0x36, 0x0c};
  4679. //page71, 0x06
  4680. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R186);
  4681. tmp &= ~PROPERTY_MSK_R186_REG_SYMB_AB_SEL;
  4682. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R186, tmp);
  4683. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R187);
  4684. tmp = symbol_rate_a;
  4685. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R187, tmp);
  4686. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R188);
  4687. tmp &= ~PROPERTY_MSK_R188_REG_SYMBRATE_A_H;
  4688. tmp = (symbol_rate_a >> 8);
  4689. tmp &= PROPERTY_MSK_R188_REG_SYMBRATE_A_H;
  4690. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R188, tmp);
  4691. //page70, 0x50 chf_sel
  4692. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R150);
  4693. tmp &= ~PROPERTY_MSK_R150_REG_CHF_SEL;
  4694. if(symbol_rate_a == 400){
  4695. //40k
  4696. tmp |= (0x0b << 4);
  4697. }else if(symbol_rate_a >= 100 && symbol_rate_a < 400){
  4698. tmp |= (0x0c << 4);
  4699. //}else if(symbol_rate_a >= 20 && symbol_rate_a < 100){
  4700. }else if(symbol_rate_a >= 2 && symbol_rate_a < 100){
  4701. tmp |= (0x0d << 4);
  4702. }
  4703. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R150, tmp);
  4704. IntermediateFrequency = 0x004000;
  4705. tmpBuffer[0] = (uint8_t)IntermediateFrequency;
  4706. tmpBuffer[1] = (uint8_t)((uint32_t)IntermediateFrequency >> 8);
  4707. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R153);
  4708. tmp &= ~PROPERTY_MSK_R153_IF_H;
  4709. tmp |= (uint8_t)(((uint32_t)IntermediateFrequency >> 16) & 0x0f);
  4710. tmpBuffer[2] = tmp;
  4711. PAN312x_Set_Property(PROPERTY_ADDR_R151, 3, tmpBuffer);
  4712. //[0x70][0x4e][0x14e] RX_ADC_BWSEL
  4713. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14E);
  4714. tmp &= ~PROPERTY_MSK_R14E_RX_ADC_BWSEL;
  4715. tmp |= (0x01 << 6);
  4716. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14E, tmp);
  4717. //[0x70][0x4d][0x14d] RX_ADC_IFSEL
  4718. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14D);
  4719. tmp &= ~PROPERTY_MSK_R14D_RX_ADC_IFSEL;
  4720. tmp |= (0x01 << 5);
  4721. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14D, tmp);
  4722. //[0x73][0x52][0x2d2] RX_ADC_IBSEL
  4723. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D2);
  4724. tmp &= ~PROPERTY_MSK_R2D2_RX_ADC_IBSEL;
  4725. tmp |= (0x01 << 6);
  4726. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D2, tmp);
  4727. //[0x73][0x46] RX_TIA_BWSEL
  4728. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C6);
  4729. tmp &= ~PROPERTY_MSK_R2C6_RX_TIA_BWSEL;
  4730. tmp |= (0x02 << 4);
  4731. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C6, tmp);
  4732. //[0x73][0x43][0x2c3] RX_TIA_DCOC_BWSEL
  4733. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C3);
  4734. tmp &= ~PROPERTY_MSK_R2C3_RX_TIA_DCOC_BWSEL;
  4735. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C3, tmp);
  4736. //[0x73][0x51][0x2D1] RX_TIA_IBIAS(2Mbps)
  4737. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D1);
  4738. tmp &= ~PROPERTY_MSK_R2D1_RX_TIA_IBIAS;
  4739. tmp |= (0x04 << 3);
  4740. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D1, tmp);
  4741. //bit[7]不用管,用默认值1,[6:1]等于rc_code
  4742. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D0);
  4743. tmp &= 0x81;
  4744. tmp |= (rc_code << 1);
  4745. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D0, tmp);
  4746. //Rx AdjustFrequency
  4747. PAN312x_Set_RxAdjustFrequency(500000);
  4748. //AGC & RSSI
  4749. lo_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1B3);
  4750. lo_tmp &= 0x07;
  4751. if(lo_tmp == 0x00){
  4752. //[0x72][0x06 ~ 0x1d]
  4753. PAN312x_Set_Property(PROPERTY_ADDR_R206, 24, &Agc2_500Kbps_LoDiv2);
  4754. //[0x72][0x1e ~ 0x2a]
  4755. PAN312x_Set_Property(PROPERTY_ADDR_R21E, 13, &Agc2_500Kbps_LoDiv2[24]);
  4756. }else if(lo_tmp == 0x01){
  4757. //[0x72][0x06 ~ 0x1d]
  4758. PAN312x_Set_Property(PROPERTY_ADDR_R206, 24, &Agc2_500Kbps_LoDiv4);
  4759. //[0x72][0x1e ~ 0x2a]
  4760. PAN312x_Set_Property(PROPERTY_ADDR_R21E, 13, &Agc2_500Kbps_LoDiv4[24]);
  4761. }
  4762. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R30E);
  4763. tmp |= PROPERTY_MSK_R30E_REG_SLOPE_FREQ_VLD;
  4764. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R30E, tmp);
  4765. tmp = 0x7d;
  4766. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R231, tmp);
  4767. }
  4768. /**
  4769. * @简介:设置PAN312x 的SymbolRate(SymbolRate >= 50kbps)
  4770. * @参数:symbol_rate_b:
  4771. * index symbol_rate fs
  4772. * 0x00: 50k 4M
  4773. * 0x01: 62.5k 4M
  4774. * 0x02: 80k 6.4M
  4775. * 0x03: 100k 6.4M
  4776. * 0x04: 125k 8M
  4777. * 0x05: 200k 16M
  4778. * 0x06: 250k 16M
  4779. * 0x07: 400k 16M
  4780. * 0x08: 500k 16M
  4781. * 0x09: 1M
  4782. * 0x0a: 2M
  4783. * IF = symbol_rate / fs *2^20
  4784. * @返回值:无
  4785. */
  4786. void PAN312x_Set_Symbol_RateB(uint32_t DataRate, uint32_t TxDeviation)
  4787. {
  4788. uint8_t tmp, tmpBuffer[4];
  4789. //agc config for 760Mhz ~ 1110Mhz
  4790. uint8_t Agc2_500Kbps_LoDiv2[37] = {0x06, 0x5f, 0x05, 0x35, 0x66, 0x23, 0x05, 0x00,
  4791. 0x5d, 0x23, 0x05, 0x00, 0x5d, 0x23, 0x05, 0x00,
  4792. 0x5d, 0x23, 0x05, 0x00, 0x5d, 0x23, 0x05, 0x00,
  4793. 0x4e, 0x37, 0x05, 0x10, 0x3F, 0x57, 0x05, 0x20,
  4794. 0x30, 0x6f, 0x05, 0x2e, 0x0c};
  4795. uint8_t Agc1Mbps_LoDiv2[37] = {0x06, 0x57, 0x05, 0x1f, 0x66, 0x23, 0x05, 0x00,
  4796. 0x61, 0x23, 0x05, 0x00, 0x61, 0x23, 0x05, 0x00,
  4797. 0x61, 0x23, 0x05, 0x00, 0x61, 0x23, 0x05, 0x00,
  4798. 0x51, 0x37, 0x05, 0x10, 0x42, 0x57, 0x05, 0x1f,
  4799. 0x33, 0x6f, 0x05, 0x2e, 0x0e};
  4800. uint8_t Agc2Mbps_LoDiv2[37] = {0x06, 0x23, 0x05, 0x00, 0x66, 0x23, 0x05, 0x00,
  4801. 0x4c, 0x23, 0x05, 0x00, 0x4c, 0x23, 0x05, 0x00,
  4802. 0x4c, 0x23, 0x05, 0x00, 0x4c, 0x23, 0x05, 0x00,
  4803. 0x40, 0x37, 0x05, 0x10, 0x2f, 0x57, 0x05, 0x1f,
  4804. 0x1d, 0x7f, 0x05, 0x33, 0x0e};
  4805. //agc config for 380Mhz ~ 550Mhz
  4806. uint8_t Agc2_500Kbps_LoDiv4[37] = {0x06, 0x5f, 0x05, 0x35, 0x66, 0x23, 0x05, 0x05,
  4807. 0x56, 0x23, 0x05, 0x05, 0x56, 0x23, 0x05, 0x05,
  4808. 0x56, 0x23, 0x05, 0x05, 0x56, 0x23, 0x05, 0x05,
  4809. 0x56, 0x37, 0x05, 0x18, 0x3F, 0x3f, 0x05, 0x25,
  4810. 0x33, 0x5f, 0x05, 0x36, 0x0c};
  4811. uint8_t Agc1Mbps_LoDiv4[37] = {0x06, 0x23, 0x05, 0x03, 0x66, 0x23, 0x05, 0x06,
  4812. 0x57, 0x23, 0x05, 0x06, 0x57, 0x23, 0x05, 0x06,
  4813. 0x57, 0x23, 0x05, 0x06, 0x57, 0x23, 0x05, 0x06,
  4814. 0x55, 0x37, 0x05, 0x18, 0x3f, 0x3f, 0x05, 0x25,
  4815. 0x2d, 0xff, 0x05, 0x3e, 0x0c};
  4816. uint8_t Agc2Mbps_LoDiv4[37] = {0x07, 0xff, 0x05, 0x03, 0x66, 0x23, 0x05, 0x03,
  4817. 0x3c, 0x23, 0x05, 0x03, 0x3c, 0x23, 0x05, 0x03,
  4818. 0x3c, 0x23, 0x05, 0x03, 0x3c, 0x23, 0x05, 0x03,
  4819. 0x3c, 0x37, 0x05, 0x15, 0x24, 0x3f, 0x05, 0x22,
  4820. 0x18, 0xff, 0x05, 0x3b, 0x0c};
  4821. uint32_t IntermediateFrequency;
  4822. uint8_t symbol_rate_b;
  4823. uint8_t lo_tmp;
  4824. float h;
  4825. h = 2.0f * TxDeviation / DataRate;
  4826. if(DataRate == 50000){
  4827. symbol_rate_b = 0x00;
  4828. }else if(DataRate == 62500){
  4829. symbol_rate_b = 0x01;
  4830. }else if(DataRate == 80000){
  4831. symbol_rate_b = 0x02;
  4832. }else if(DataRate == 100000){
  4833. symbol_rate_b = 0x03;
  4834. }else if(DataRate == 125000){
  4835. symbol_rate_b = 0x04;
  4836. }else if(DataRate == 200000){
  4837. symbol_rate_b = 0x05;
  4838. }else if(DataRate == 250000){
  4839. symbol_rate_b = 0x06;
  4840. }else if(DataRate == 400000){
  4841. symbol_rate_b = 0x07;
  4842. }else if(DataRate == 500000){
  4843. symbol_rate_b = 0x08;
  4844. }else if(DataRate == 1000000){
  4845. symbol_rate_b = 0x09;
  4846. }else if(DataRate == 2000000){
  4847. symbol_rate_b = 0x0a;
  4848. }
  4849. //Page71 0x06: 0x186 data_rate
  4850. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R186);
  4851. tmp &= ~(PROPERTY_MSK_R186_REG_SYMBRATE_B | PROPERTY_MSK_R186_REG_SYMB_AB_SEL);
  4852. tmp |= ((symbol_rate_b << 4) | (PROPERTY_MSK_R186_REG_SYMB_AB_SEL));
  4853. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R186, tmp);
  4854. // //page70, 0x50 chf_sel
  4855. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R150);
  4856. tmp &= ~PROPERTY_MSK_R150_REG_CHF_SEL;
  4857. switch(symbol_rate_b){
  4858. case 0x00:
  4859. //50kbps
  4860. tmp |= (0x0a << 4);
  4861. break;
  4862. case 0x01:
  4863. //62.5kbps
  4864. tmp |= (0x09 << 4);
  4865. break;
  4866. case 0x02:
  4867. //80kbps
  4868. tmp |= (0x08 << 4);
  4869. break;
  4870. case 0x03:
  4871. //100kbps
  4872. tmp |= (0x07 << 4);
  4873. break;
  4874. case 0x04:
  4875. //125kbps
  4876. tmp |= (0x06 << 4);
  4877. break;
  4878. case 0x05:
  4879. //200kbps
  4880. tmp |= (0x05 << 4);
  4881. break;
  4882. case 0x06:
  4883. //250kbps
  4884. tmp |= (0x04 << 4);
  4885. break;
  4886. case 0x07:
  4887. //400kbps
  4888. tmp |= (0x03 << 4);
  4889. break;
  4890. case 0x08:
  4891. //500kbps
  4892. tmp |= (0x02 << 4);
  4893. break;
  4894. case 0x09:
  4895. //1Mbps
  4896. tmp |= (0x01 << 4);
  4897. break;
  4898. case 0x0a:
  4899. //2Mbps
  4900. tmp |= (0x00 << 4);
  4901. break;
  4902. }
  4903. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R150, tmp);
  4904. //[0x70][0x51~0x53] 数字中频:500Khz
  4905. if(symbol_rate_b == 0x09){
  4906. //DataRate1Mbps
  4907. IntermediateFrequency = 0x008000;
  4908. }else if(symbol_rate_b == 0x0a){
  4909. //DataRate2Mbps
  4910. IntermediateFrequency = 0x010000;
  4911. }else{
  4912. //DataRate2kbps ~ 500kbps
  4913. IntermediateFrequency = 0x004000;
  4914. }
  4915. tmpBuffer[0] = (uint8_t)IntermediateFrequency;
  4916. tmpBuffer[1] = (uint8_t)((uint32_t)IntermediateFrequency >> 8);
  4917. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R153);
  4918. tmp &= ~PROPERTY_MSK_R153_IF_H;
  4919. tmp |= (uint8_t)(((uint32_t)IntermediateFrequency >> 16) & 0x0f);
  4920. tmpBuffer[2] = tmp;
  4921. PAN312x_Set_Property(PROPERTY_ADDR_R151, 3, tmpBuffer);
  4922. //[0x70][0x4e][0x14e] RX_ADC_BWSEL
  4923. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14E);
  4924. tmp &= ~PROPERTY_MSK_R14E_RX_ADC_BWSEL;
  4925. if(symbol_rate_b == 0x09){
  4926. //DataRate1Mbps
  4927. //ADC带宽选择:±1Mhz
  4928. tmp |= (0x02 << 6);
  4929. }else if(symbol_rate_b == 0x0a){
  4930. //DataRate2Mbps
  4931. //ADC带宽选择:±1Mhz
  4932. tmp |= (0x03 << 6);
  4933. }else{
  4934. //DataRate2kbps ~ 500kbps
  4935. //ADC带宽选择:±1Mhz
  4936. tmp |= (0x01 << 6);
  4937. }
  4938. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14E, tmp);
  4939. //[0x70][0x4d][0x14d] RX_ADC_IFSEL
  4940. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R14D);
  4941. tmp &= ~PROPERTY_MSK_R14D_RX_ADC_IFSEL;
  4942. if(symbol_rate_b == 0x09){
  4943. //DataRate1Mbps
  4944. //ADC带宽选择:±1Mhz
  4945. tmp |= (0x02 << 5);
  4946. }else if(symbol_rate_b == 0x0a){
  4947. //DataRate2Mbps
  4948. //ADC带宽选择:±1Mhz
  4949. tmp |= (0x03 << 5);
  4950. }else{
  4951. //DataRate2kbps ~ 500kbps
  4952. //ADC带宽选择:±1Mhz
  4953. tmp |= (0x01 << 5);
  4954. }
  4955. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R14D, tmp);
  4956. //[0x73][0x52][0x2d2] RX_ADC_IBSEL
  4957. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D2);
  4958. tmp &= ~PROPERTY_MSK_R2D2_RX_ADC_IBSEL;
  4959. if(symbol_rate_b == 0x0a){
  4960. //DataRate2Mbps
  4961. tmp |= (0x03 << 6);
  4962. }else{
  4963. //DataRate2kbps ~ 500kbps, 1mbps
  4964. tmp |= (0x01 << 6);
  4965. }
  4966. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D2, tmp);
  4967. //[0x73][0x46] RX_TIA_BWSEL
  4968. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C6);
  4969. tmp &= ~PROPERTY_MSK_R2C6_RX_TIA_BWSEL;
  4970. if(symbol_rate_b == 0x09){
  4971. //DataRate1Mbps
  4972. //ADC带宽选择:±1Mhz
  4973. tmp |= (0x01 << 4);
  4974. }else if(symbol_rate_b == 0x0a){
  4975. //DataRate2Mbps
  4976. //ADC带宽选择:±1Mhz
  4977. tmp |= (0x00 << 4);
  4978. }else{
  4979. //DataRate2kbps ~ 500kbps
  4980. tmp |= (0x02 << 4);
  4981. }
  4982. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C6, tmp);
  4983. //[0x73][0x43][0x2c3] RX_TIA_DCOC_BWSEL
  4984. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C3);
  4985. tmp &= ~PROPERTY_MSK_R2C3_RX_TIA_DCOC_BWSEL;
  4986. if(symbol_rate_b == 0x0a){
  4987. //DataRate2Mbps
  4988. tmp |= (0x01 << 2);
  4989. }
  4990. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C3, tmp);
  4991. //[0x73][0x51][0x2D1] RX_TIA_IBIAS(2Mbps)
  4992. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D1);
  4993. tmp &= ~PROPERTY_MSK_R2D1_RX_TIA_IBIAS;
  4994. if(symbol_rate_b == 0x0a){
  4995. //DataRate2Mbps
  4996. tmp |= (0x07 << 3);
  4997. }else{
  4998. //DataRate2kbps ~ 500kbps, 1mbps
  4999. tmp |= (0x04 << 3);
  5000. }
  5001. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D1, tmp);
  5002. //bit[7]不用管,用默认值1,[6:1]等于rc_code
  5003. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2D0);
  5004. if(symbol_rate_b == 0x0a){
  5005. //DataRate2Mbps
  5006. tmp |= (0x7f << 1);
  5007. }else{
  5008. tmp &= 0x81;
  5009. tmp |= (rc_code << 1);
  5010. }
  5011. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2D0, tmp);
  5012. if(symbol_rate_b == 0x0a){
  5013. //DataRate2Mbps
  5014. tmp = 0xa3;
  5015. }else if(symbol_rate_b == 0x09){
  5016. //DataRate1Mbps
  5017. tmp = 0x8f;
  5018. }else{
  5019. //DataRate2kbps ~ 500kbps
  5020. tmp =0x7d;
  5021. }
  5022. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R231, tmp);
  5023. lo_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1B3);
  5024. lo_tmp &= 0x07;
  5025. //Rx AdjustFrequency
  5026. if(symbol_rate_b == 0x09){
  5027. //DataRate1Mbps, A
  5028. PAN312x_Set_RxAdjustFrequency(1000000);
  5029. //printf("agc1M\r\n");
  5030. if(lo_tmp == 0x00){
  5031. //[0x72][0x06 ~ 0x1d]
  5032. PAN312x_Set_Property(PROPERTY_ADDR_R206, 24, &Agc1Mbps_LoDiv2);
  5033. //[0x72][0x1e ~ 0x2a]
  5034. PAN312x_Set_Property(PROPERTY_ADDR_R21E, 13, &Agc1Mbps_LoDiv2[24]);
  5035. }else if(lo_tmp == 0x01){
  5036. //[0x72][0x06 ~ 0x1d]
  5037. PAN312x_Set_Property(PROPERTY_ADDR_R206, 24, &Agc1Mbps_LoDiv4);
  5038. //[0x72][0x1e ~ 0x2a]
  5039. PAN312x_Set_Property(PROPERTY_ADDR_R21E, 13, &Agc1Mbps_LoDiv4[24]);
  5040. }
  5041. }else if(symbol_rate_b == 0x0a){
  5042. //DataRate2Mbps
  5043. PAN312x_Set_RxAdjustFrequency(2000000);
  5044. //printf("agc2M\r\n");
  5045. if(lo_tmp == 0x00){
  5046. //[0x72][0x06 ~ 0x1d]
  5047. PAN312x_Set_Property(PROPERTY_ADDR_R206, 24, &Agc2Mbps_LoDiv2);
  5048. //[0x72][0x1e ~ 0x2a]
  5049. PAN312x_Set_Property(PROPERTY_ADDR_R21E, 13, &Agc2Mbps_LoDiv2[24]);
  5050. }else if(lo_tmp == 0x01){
  5051. //[0x72][0x06 ~ 0x1d]
  5052. PAN312x_Set_Property(PROPERTY_ADDR_R206, 24, &Agc2Mbps_LoDiv4);
  5053. //[0x72][0x1e ~ 0x2a]
  5054. PAN312x_Set_Property(PROPERTY_ADDR_R21E, 13, &Agc2Mbps_LoDiv4[24]);
  5055. }
  5056. }else{
  5057. //DataRate2kbps ~ 500kbps
  5058. PAN312x_Set_RxAdjustFrequency(500000);
  5059. //printf("agc1_500kbps\r\n");
  5060. if(lo_tmp == 0x00){
  5061. //[0x72][0x06 ~ 0x1d]
  5062. PAN312x_Set_Property(PROPERTY_ADDR_R206, 24, &Agc2_500Kbps_LoDiv2);
  5063. //[0x72][0x1e ~ 0x2a]
  5064. PAN312x_Set_Property(PROPERTY_ADDR_R21E, 13, &Agc2_500Kbps_LoDiv2[24]);
  5065. }else if(lo_tmp == 0x01){
  5066. //[0x72][0x06 ~ 0x1d]
  5067. PAN312x_Set_Property(PROPERTY_ADDR_R206, 24, &Agc2_500Kbps_LoDiv4);
  5068. //[0x72][0x1e ~ 0x2a]
  5069. PAN312x_Set_Property(PROPERTY_ADDR_R21E, 13, &Agc2_500Kbps_LoDiv4[24]);
  5070. }
  5071. }
  5072. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R30E);
  5073. if(symbol_rate_b <= 0x07){
  5074. //500kbps
  5075. tmp |= PROPERTY_MSK_R30E_REG_SLOPE_FREQ_VLD;
  5076. }else if((symbol_rate_b >= 0x08) && (symbol_rate_b <= 0x0a)){
  5077. //500kbps
  5078. tmp &= ~PROPERTY_MSK_R30E_REG_SLOPE_FREQ_VLD;
  5079. }
  5080. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R30E, tmp);
  5081. //diff
  5082. if(symbol_rate_b >= 0x05){
  5083. //200Khz
  5084. //[0x70][0x57][8] 0:带内带外都有 1:单带内模式
  5085. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R157);
  5086. tmp &= ~PROPERTY_MSK_R157_IB_ONLY;
  5087. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R157, tmp);
  5088. uint32_t tx_dev;
  5089. uint16_t ref_diff;
  5090. uint8_t lo_tmp;
  5091. lo_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1B3);
  5092. lo_tmp &= PROPERTY_MSK_R1B3_LO_MUX_SEL;
  5093. if(((symbol_rate_b == 0x05) &&(h == 1.0)) || (((symbol_rate_b == 0x07) &&(h == 0.5)) )){
  5094. //datarate = 200kbps deviation = 100khz, h = 1
  5095. //datarate = 400kbps deviation = 100khz, h = 0.5
  5096. tx_dev = 100000;
  5097. if(lo_tmp == 0x00){
  5098. //2:760Mhz ~ 1110Mhz
  5099. ref_diff = 205;
  5100. }else if(lo_tmp == 0x01){
  5101. //4:380Mhz ~ 550Mhz
  5102. ref_diff = 410;
  5103. }else if(lo_tmp == 0x02){
  5104. //6:253Mhz ~ 380Mhz
  5105. ref_diff = 614;
  5106. }else if(lo_tmp == 0x03){
  5107. //8:190Mhz ~ 280Mhz
  5108. ref_diff = 819;
  5109. }else if(lo_tmp == 0x04){
  5110. //16Mhz8Mhz4Mhz2Mhz
  5111. ref_diff = 1229;
  5112. }
  5113. }else if((symbol_rate_b == 0x05) &&(h == 0.5)){
  5114. //datarate = 200kbps deviation = 50khz, h = 0.5
  5115. tx_dev = 50000;
  5116. if(lo_tmp == 0x00){
  5117. //2:760Mhz ~ 1110Mhz
  5118. ref_diff = 102;
  5119. }else if(lo_tmp == 0x01){
  5120. //4:380Mhz ~ 550Mhz
  5121. ref_diff = 205;
  5122. }else if(lo_tmp == 0x02){
  5123. //6:253Mhz ~ 380Mhz
  5124. ref_diff = 307;
  5125. }else if(lo_tmp == 0x03){
  5126. //8:190Mhz ~ 280Mhz
  5127. ref_diff = 410;
  5128. }else if(lo_tmp == 0x04){
  5129. //16Mhz8Mhz4Mhz2Mhz
  5130. ref_diff = 614;
  5131. }
  5132. }
  5133. else if((symbol_rate_b == 0x06) &&(h == 0.5)){
  5134. //datarate = 250kbps deviation = 62.5khz, h = 0.5
  5135. tx_dev = 62500;
  5136. if(lo_tmp == 0x00){
  5137. //2:760Mhz ~ 1110Mhz
  5138. ref_diff = 128;
  5139. }else if(lo_tmp == 0x01){
  5140. //4:380Mhz ~ 550Mhz
  5141. ref_diff = 256;
  5142. }else if(lo_tmp == 0x02){
  5143. //6:253Mhz ~ 380Mhz
  5144. ref_diff = 384;
  5145. }else if(lo_tmp == 0x03){
  5146. //8:190Mhz ~ 280Mhz
  5147. ref_diff = 512;
  5148. }else if(lo_tmp == 0x04){
  5149. //16Mhz8Mhz4Mhz2Mhz
  5150. ref_diff = 768;
  5151. }
  5152. }
  5153. else if(((symbol_rate_b == 0x06) &&(h == 1.0)) || (((symbol_rate_b == 0x08) &&(h == 0.5)))){
  5154. //250kbps
  5155. //datarate = 250kbps deviation = 125khz, h = 1
  5156. //datarate = 500kbps deviation = 125khz, h = 0.5
  5157. tx_dev = 125000;
  5158. if(lo_tmp == 0x00){
  5159. //2:760Mhz ~ 1110Mhz
  5160. ref_diff = 256;
  5161. }else if(lo_tmp == 0x01){
  5162. //4:380Mhz ~ 550Mhz
  5163. ref_diff = 512;
  5164. }else if(lo_tmp == 0x02){
  5165. //6:253Mhz ~ 380Mhz
  5166. ref_diff = 768;
  5167. }else if(lo_tmp == 0x03){
  5168. //8:190Mhz ~ 280Mhz
  5169. ref_diff = 1024;
  5170. }else if(lo_tmp == 0x04){
  5171. //16Mhz8Mhz4Mhz2Mhz
  5172. ref_diff = 1536;
  5173. }
  5174. }else if((symbol_rate_b == 0x07) &&(h == 1.0)){
  5175. //400kbps
  5176. //datarate = 400kbps deviation = 200khz, h = 1
  5177. tx_dev = 200000;
  5178. if(lo_tmp == 0x00){
  5179. //2:760Mhz ~ 1110Mhz
  5180. ref_diff = 410;
  5181. }else if(lo_tmp == 0x01){
  5182. //4:380Mhz ~ 550Mhz
  5183. ref_diff = 819;
  5184. }else if(lo_tmp == 0x02){
  5185. //6:253Mhz ~ 380Mhz
  5186. ref_diff = 1229;
  5187. }else if(lo_tmp == 0x03){
  5188. //8:190Mhz ~ 280Mhz
  5189. ref_diff = 1638;
  5190. }else if(lo_tmp == 0x04){
  5191. //16Mhz8Mhz4Mhz2Mhz
  5192. ref_diff = 2458;
  5193. }
  5194. }else if(((symbol_rate_b == 0x08) &&(h == 1.0)) || ((symbol_rate_b == 0x09) && (h == 0.5))){
  5195. //datarate = 500kbps deviation = 250khz, h = 1
  5196. //datarate = 1Mbps deviation = 250khz, h = 0.5
  5197. tx_dev = 250000;
  5198. if(lo_tmp == 0x00){
  5199. //2:760Mhz ~ 1110Mhz
  5200. ref_diff = 512;
  5201. }else if(lo_tmp == 0x01){
  5202. //4:380Mhz ~ 550Mhz
  5203. ref_diff = 1024;
  5204. }else if(lo_tmp == 0x02){
  5205. //6:253Mhz ~ 380Mhz
  5206. ref_diff = 1536;
  5207. }else if(lo_tmp == 0x03){
  5208. //8:190Mhz ~ 280Mhz
  5209. ref_diff = 2048;
  5210. }else if(lo_tmp == 0x04){
  5211. //16Mhz8Mhz4Mhz2Mhz
  5212. ref_diff = 3072;
  5213. }
  5214. }else if(((symbol_rate_b == 0x09) &&(h == 1.0)) || ((symbol_rate_b == 0x0a) && (h == 0.5))){
  5215. //datarate = 1Mbps deviation = 500khz, h = 1
  5216. //datarate = 2Mbps deviation = 500khz, h = 0.5
  5217. tx_dev = 500000;
  5218. if(lo_tmp == 0x00){
  5219. //2:760Mhz ~ 1110Mhz
  5220. ref_diff = 1024;
  5221. }else if(lo_tmp == 0x01){
  5222. //4:380Mhz ~ 550Mhz
  5223. ref_diff = 2048;
  5224. }else if(lo_tmp == 0x02){
  5225. //6:253Mhz ~ 380Mhz
  5226. ref_diff = 3072;
  5227. }else if(lo_tmp == 0x03){
  5228. //8:190Mhz ~ 280Mhz
  5229. ref_diff = 4096;
  5230. }
  5231. }else if((symbol_rate_b == 0x0a) &&(h == 1.0)){
  5232. //datarate = 2Mbps deviation = 1Mhz, h = 1
  5233. tx_dev = 1000000;
  5234. if(lo_tmp == 0x00){
  5235. //2:760Mhz ~ 1110Mhz
  5236. ref_diff = 2048;
  5237. }else if(lo_tmp == 0x01){
  5238. //4:380Mhz ~ 550Mhz
  5239. ref_diff = 4096;
  5240. }
  5241. }
  5242. PAN312x_Two_Point_Calibration(symbol_rate_b, tx_dev, ref_diff);
  5243. }else{
  5244. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R157);
  5245. tmp |= PROPERTY_MSK_R157_IB_ONLY;
  5246. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R157, tmp);
  5247. }
  5248. }
  5249. void PAN312x_SyncwordLastByteIgnoreEnable(uint8_t SyncwordMask)
  5250. {
  5251. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1D5, SyncwordMask);
  5252. }
  5253. void PAN312x_PreambleLastByteIgnoreEnable(uint8_t PreambleMask)
  5254. {
  5255. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1D6, PreambleMask);
  5256. }
  5257. uint8_t PAN312x_GetRealSyncwordLastByte(void)
  5258. {
  5259. return PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1D7);
  5260. }
  5261. uint8_t PAN312x_GetRealPreambleLastByte(void)
  5262. {
  5263. return PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1D8);
  5264. }
  5265. /**
  5266. * @简介:关闭接收最大净荷限制
  5267. * @参数:无
  5268. * @返回值: 无
  5269. */
  5270. void PAN312x_RxMaxPayloadLimitDisable(void)
  5271. {
  5272. uint8_t tmp;
  5273. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R31C);
  5274. tmp &= ~PROPERTY_MSK_R31C_REG_MAX_VLD;
  5275. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R31C, tmp);
  5276. }
  5277. void PAN312x_RxMaxPayloadLimitEnable(void)
  5278. {
  5279. uint8_t tmp;
  5280. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R31C);
  5281. tmp |= PROPERTY_MSK_R31C_REG_MAX_VLD;
  5282. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R31C, tmp);
  5283. }
  5284. void PAN312x_Reset_Modem(void)
  5285. {
  5286. uint8_t tmp = 0;
  5287. tmp |= R100_REG_SOFT_RST_Msk;
  5288. PAN312x_Set_OP_Reg(R100, 1, &tmp);
  5289. tmp &= ~R100_REG_SOFT_RST_Msk;
  5290. PAN312x_Set_OP_Reg(R100, 1, &tmp);
  5291. }
  5292. void PAN312x_SoftReset(void)
  5293. {
  5294. uint8_t tmp;
  5295. PAN312x_Write(R005, 0x60);
  5296. PAN312x_Read(R004, &tmp);
  5297. tmp &= ~R004_REG_NRST_L_Msk;
  5298. PAN312x_Write(R004, tmp);
  5299. tmp |= R004_REG_NRST_L_Msk;
  5300. PAN312x_Write(R005, 0x00);
  5301. }
  5302. void PAN312x_Flush_RxFifo(void)
  5303. {
  5304. uint8_t tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1C1);
  5305. tmp |= (PROPERTY_MSK_R1C1_FIFO1_WADDR_CLR | PROPERTY_MSK_R1C1_FIFO1_RADDR_CLR);
  5306. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1C1, tmp);
  5307. tmp &= ~(PROPERTY_MSK_R1C1_FIFO1_WADDR_CLR | PROPERTY_MSK_R1C1_FIFO1_RADDR_CLR);
  5308. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1C1, tmp);
  5309. }
  5310. void PAN312x_Flush_TxFifo(void)
  5311. {
  5312. uint8_t tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1C0);
  5313. tmp |= (PROPERTY_MSK_R1C0_FIFO0_WADDR_CLR | PROPERTY_MSK_R1C0_FIFO0_RADDR_CLR);
  5314. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1C0, tmp);
  5315. tmp &= ~(PROPERTY_MSK_R1C0_FIFO0_WADDR_CLR | PROPERTY_MSK_R1C0_FIFO0_RADDR_CLR);
  5316. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1C0, tmp);
  5317. }
  5318. void PAN312x_RadioInit(PAN312xRadioInit* pRadioInitStruct)
  5319. {
  5320. // ready ;
  5321. PAN312x_Enter_Ready();
  5322. PAN312x_Set_ModulationType(pRadioInitStruct->ModulationSelect);//调制方式
  5323. //
  5324. PAN312x_Set_Frequency(pRadioInitStruct->FrequencyBase, pRadioInitStruct->FrequencyStep, pRadioInitStruct->FrequencyChannelNumber);
  5325. //tx deviation
  5326. PAN312x_Set_Tx_Deviation(pRadioInitStruct->TxDeviation);
  5327. //
  5328. if(pRadioInitStruct->DataRate > 40000){
  5329. PAN312x_Set_Symbol_RateB(pRadioInitStruct->DataRate, pRadioInitStruct->TxDeviation);
  5330. }else if(pRadioInitStruct->DataRate <= 40000){
  5331. PAN312x_Set_Symbol_RateA(pRadioInitStruct->DataRate / 100);
  5332. }
  5333. //rx deviation
  5334. PAN312x_Set_Rx_Deviation(pRadioInitStruct->RxDeviation);
  5335. //
  5336. PAN312x_Set_Power(pRadioInitStruct->FrequencyBase,pRadioInitStruct->FrequencyStep,pRadioInitStruct->FrequencyChannelNumber,pRadioInitStruct->PowerSelect,pRadioInitStruct->Power);
  5337. }
  5338. void PAN312x_PktInit(PAN312xPacketInit* pPktInitStruct)
  5339. {
  5340. //Preamble length
  5341. PAN312x_Set_PreambleLength(pPktInitStruct->PreambleLength);
  5342. //Preamble pattern
  5343. PAN312x_Set_PreamblePattern(pPktInitStruct->PreambleSeclect);
  5344. //Preamble patternpattern
  5345. if(pPktInitStruct->PreambleSeclect == PREAMBLE_NON_STANDARD){
  5346. PAN312x_Set_NonStandardPreamblePattern(pPktInitStruct->NonStandardPreamblePattern);
  5347. }
  5348. //syncword pattern syncword length
  5349. PAN312x_Set_SyncWordPattern(pPktInitStruct->SyncwordPattern, pPktInitStruct->SyncwordLength);
  5350. //Preamble Manchester
  5351. if(pPktInitStruct->PreambleManchester == S_ENABLE){
  5352. PAN312x_PreambleManchesterEnable();
  5353. PAN312x_Set_PreambleManchesterMode(pPktInitStruct->PreambleManchesterMode);
  5354. }else if(pPktInitStruct->PreambleManchester == S_DISABLE){
  5355. PAN312x_PreambleManchesterDisable();
  5356. }
  5357. //Syncword Manchester
  5358. if(pPktInitStruct->SyncwordManchester == S_ENABLE){
  5359. PAN312x_SyncwordManchesterEnable();
  5360. PAN312x_Set_SyncwordManchesterMode(pPktInitStruct->SyncwordManchesterMode);
  5361. }else if(pPktInitStruct->PreambleManchester == S_DISABLE){
  5362. PAN312x_SyncwordManchesterDisable();
  5363. }
  5364. //Payload Manchester
  5365. if(pPktInitStruct->PayloadManchester == S_ENABLE){
  5366. PAN312x_PayloadManchesterEnable();
  5367. PAN312x_Set_PayloadManchesterMode(pPktInitStruct->PayloadManchesterMode);
  5368. }else if(pPktInitStruct->PreambleManchester == S_DISABLE){
  5369. PAN312x_PayloadManchesterDisable();
  5370. }
  5371. //Haming
  5372. PAN312x_Set_FecHamingEncoding(pPktInitStruct->FecEncoding);
  5373. //
  5374. PAN312x_Set_Payload_Whitening_Pattern(pPktInitStruct->WhiteningPattern);
  5375. // ready ;
  5376. if(pPktInitStruct->DataMode == DATA_MODE_DIRECT){
  5377. }
  5378. }
  5379. void PAN312x_CrcInit(PAN312xCrcInit* pCrcInitStruct)
  5380. {
  5381. //帧结构中插入crc字段
  5382. PAN312x_CrcInsertSelect(S_ENABLE);
  5383. if(pCrcInitStruct->CrcMode == CRC_MODE_8_BIT){
  5384. PAN312x_Set_CrcMode(CRC_MODE_8_BIT);
  5385. }else if(pCrcInitStruct->CrcMode == CRC_MODE_16_BIT){
  5386. PAN312x_Set_CrcMode(CRC_MODE_16_BIT);
  5387. }else if(pCrcInitStruct->CrcMode == CRC_MODE_24_BIT){
  5388. PAN312x_Set_CrcMode(CRC_MODE_24_BIT);
  5389. }else if(pCrcInitStruct->CrcMode == CRC_MODE_32_BIT){
  5390. PAN312x_Set_CrcMode(CRC_MODE_32_BIT);
  5391. }
  5392. PAN312x_Set_CrcSeed(pCrcInitStruct->CrcSeed);
  5393. PAN312x_Set_CrcPolynomial(pCrcInitStruct->CrcPolynomial);
  5394. PAN312x_Set_CrcBitOrder(pCrcInitStruct->CrcBitOrder);
  5395. PAN312x_Set_CrcByteSwap(pCrcInitStruct->CrcByteSwap);
  5396. PAN312x_Set_CrcInvert(pCrcInitStruct->CrcBitInv);
  5397. }
  5398. void PAN312x_RxNodeIdInit(PAN312xPacketInit* pPktInitStruct)
  5399. {
  5400. if(pPktInitStruct->NodeIdState == S_ENABLE){
  5401. PAN312x_Set_Rx_NodeId_Config(pPktInitStruct->RxNodeIdLength, pPktInitStruct->RxNodeIdPos);
  5402. PAN312x_Set_PacketFilter_Ctrl(pPktInitStruct->PacketFilterCtrl);
  5403. PAN312x_Set_PacketFilter_Mask(pPktInitStruct->PacketFilterMask);
  5404. if((pPktInitStruct->PacketFilterCtrl & PACKET_FILTER_CTRL_PATTERN1_ENABLE) == PACKET_FILTER_CTRL_PATTERN1_ENABLE){
  5405. PAN312x_Set_PacketFilter_Pat1Value(pPktInitStruct->PacketFilterPat1Value);
  5406. }
  5407. if((pPktInitStruct->PacketFilterCtrl & PACKET_FILTER_CTRL_PATTERN2_ENABLE) == PACKET_FILTER_CTRL_PATTERN2_ENABLE){
  5408. PAN312x_Set_PacketFilter_Pat2Value(pPktInitStruct->PacketFilterPat2Value);
  5409. }
  5410. if((pPktInitStruct->PacketFilterCtrl & PACKET_FILTER_CTRL_PATTERN3_ENABLE) == PACKET_FILTER_CTRL_PATTERN3_ENABLE){
  5411. PAN312x_Set_PacketFilter_Pat3Value(pPktInitStruct->PacketFilterPat3Value);
  5412. }
  5413. }
  5414. }
  5415. void PAN312x_TxNodeIdInit(PAN312xPacketInit* pPktInitStruct)
  5416. {
  5417. if(pPktInitStruct->NodeIdState == S_ENABLE){
  5418. PAN312x_Set_Tx_NodeId_Lnegth(pPktInitStruct->TxNodeIdLength);
  5419. PAN312x_Set_Tx_NodeId_Value(pPktInitStruct->TxNodeIdValue);
  5420. }
  5421. }
  5422. /**
  5423. * @简介:Iomux PAN312x的GPIO功能(只使用GPIO3 ~ GPIO10)
  5424. * @参数:IomuxGpio:
  5425. * @返回值: 无
  5426. */
  5427. void PAN312x_Iomux_Gpio_BySpi(uint32_t IomuxGpio)
  5428. {
  5429. uint8_t tmp;
  5430. uint16_t reg_addr;
  5431. PAN312x_Write(R005, 0x60);
  5432. reg_addr = (uint16_t)(IomuxGpio & 0x7ff);
  5433. tmp = PAN312xReg_ReadB1(reg_addr);
  5434. tmp &= ~((uint8_t)(IomuxGpio >> 16));
  5435. tmp |= ((uint8_t)(IomuxGpio >> 24));
  5436. PAN312xReg_WriteB1(reg_addr, tmp);
  5437. PAN312x_Write(R005, 0x00);
  5438. }
  5439. /**
  5440. * @简介:设置PAN312x的GPIO模式(只使用GPIO3 ~ GPIO10)
  5441. * @参数:GpioPin:
  5442. * Mode:
  5443. * 0x01: 输出模式
  5444. * 0x00: 输入模式
  5445. * @返回值: 无
  5446. */
  5447. void PAN312x_Set_Gpio_Mode_BySpi(uint16_t GpioPin, uint8_t Mode)
  5448. {
  5449. uint8_t tmp;
  5450. uint8_t GpioPin3_10 = 0x00;
  5451. GpioPin3_10 = (uint8_t)(GpioPin >> 8);
  5452. PAN312x_Write(R005, 0x60);
  5453. if(GpioPin3_10 != 0x00){
  5454. //[0x60][0x19]
  5455. tmp = PAN312xReg_ReadB1(R019);
  5456. if(Mode == GPIO_INPUT_MODE) {
  5457. tmp &= ~GpioPin3_10;
  5458. PAN312xReg_WriteB1(R019, tmp);
  5459. tmp = PAN312xReg_ReadB1(R018);
  5460. tmp |= GpioPin3_10;
  5461. PAN312xReg_WriteB1(R018, tmp);
  5462. }
  5463. else if(Mode == GPIO_OUTPUT_MODE){
  5464. tmp |= GpioPin3_10;
  5465. PAN312xReg_WriteB1(R019, tmp);
  5466. }
  5467. }
  5468. PAN312x_Write(R005, 0x00);
  5469. }
  5470. /**
  5471. * @简介:设置PAN312x的GPIO输出高低电平(只使用GPIO3 ~ GPIO10)
  5472. * @参数:GpioPin:
  5473. * Mode:
  5474. * 0x01: 高电平
  5475. * 0x00: 低电平
  5476. * @返回值: 无
  5477. */
  5478. void PAN312x_Gpio_Write_Pin_BySpi(uint16_t GpioPin, uint8_t PinState)
  5479. {
  5480. uint8_t tmp;
  5481. uint8_t GpioPin3_10 = 0x00;
  5482. GpioPin3_10 = (uint8_t)(GpioPin >> 8);
  5483. PAN312x_Write(R005, 0x60);
  5484. if(GpioPin3_10 != 0x00){
  5485. tmp = PAN312xReg_ReadB1(R017);
  5486. if(PinState == 0) {
  5487. tmp &= ~GpioPin3_10;
  5488. }
  5489. else if(PinState == 1){
  5490. tmp |= GpioPin3_10;
  5491. }
  5492. PAN312xReg_WriteB1(R017, tmp);
  5493. }
  5494. PAN312x_Write(R005, 0x00);
  5495. }
  5496. //uint8_t tmp_test;
  5497. /**
  5498. * @简介:使能PAN312x三线SPI
  5499. * @参数:无
  5500. * @返回值: 无
  5501. */
  5502. void PAN312x_SPI3wire_Enable(void)
  5503. {
  5504. PAN312xReg_WriteB1(R005, 0x60);
  5505. //3spi
  5506. PAN312xReg_WriteB1(R00E, 0x84);
  5507. // tmp_test = PAN312xReg_ReadB1(R00E);
  5508. PAN312xReg_WriteB1(R005, 0x00);
  5509. }
  5510. void PAN312x_PreambleCadIndEnable(void)
  5511. {
  5512. uint8_t tmp;
  5513. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1CB);
  5514. tmp |= PROPERTY_MSK_R1CB_PRE_BUSY_MASK;
  5515. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1CB, tmp);
  5516. }
  5517. void PAN312x_PreambleCadIndDisable(void)
  5518. {
  5519. uint8_t tmp;
  5520. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1CB);
  5521. tmp &= ~PROPERTY_MSK_R1CB_PRE_BUSY_MASK;
  5522. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1CB, tmp);
  5523. }
  5524. void PAN312x_SyncwordCadIndEnable(void)
  5525. {
  5526. uint8_t tmp;
  5527. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1CB);
  5528. tmp |= PROPERTY_MSK_R1CB_SW_BUSY_MASK;
  5529. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1CB, tmp);
  5530. }
  5531. void PAN312x_SyncwordCadIndDisable(void)
  5532. {
  5533. uint8_t tmp;
  5534. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1CB);
  5535. tmp &= ~PROPERTY_MSK_R1CB_SW_BUSY_MASK;
  5536. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1CB, tmp);
  5537. }
  5538. /**
  5539. * @简介:使能RSSI CAD指示
  5540. * @参数:无
  5541. * @返回值: 无
  5542. */
  5543. void PAN312x_RssiCadIndEnable(void)
  5544. {
  5545. uint8_t tmp;
  5546. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1CB);
  5547. tmp |= PROPERTY_MSK_R1CB_RSSI_BUSY_MASK;
  5548. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1CB, tmp);
  5549. }
  5550. void PAN312x_RssiCadIndDisable(void)
  5551. {
  5552. uint8_t tmp;
  5553. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1CB);
  5554. tmp &= ~PROPERTY_MSK_R1CB_RSSI_BUSY_MASK;
  5555. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1CB, tmp);
  5556. }
  5557. /**
  5558. * @简介:设置RSSI CAD指示门限
  5559. * @参数:threshold:门限值
  5560. * @返回值: 无
  5561. */
  5562. void PAN312x_SetRssiCadIndThreshold(uint8_t threshold)
  5563. {
  5564. uint8_t tmp = threshold;
  5565. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1AC, tmp);
  5566. }
  5567. /**
  5568. * @简介:使能GPIO命令触发发送
  5569. * @参数:无
  5570. * @返回值: 无
  5571. */
  5572. void PAN312x_GpioCmdTxEnable(void)
  5573. {
  5574. uint8_t tmp;
  5575. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1A4);
  5576. tmp |= PROPERTY_MSK_R1A4_REG_GPIO_TX_MODE;
  5577. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1A4, tmp);
  5578. }
  5579. void PAN312x_GpioCmdTxDisable(void)
  5580. {
  5581. uint8_t tmp;
  5582. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1A4);
  5583. tmp &= ~PROPERTY_MSK_R1A4_REG_GPIO_TX_MODE;
  5584. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1A4, tmp);
  5585. }
  5586. /**
  5587. * @简介:使能GPIO命令触发接收
  5588. * @参数:无
  5589. * @返回值: 无
  5590. */
  5591. void PAN312x_GpioCmdRxEnable(void)
  5592. {
  5593. uint8_t tmp;
  5594. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1A4);
  5595. tmp |= PROPERTY_MSK_R1A4_REG_GPIO_RX_MODE;
  5596. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1A4, tmp);
  5597. }
  5598. void PAN312x_GpioCmdRxDisable(void)
  5599. {
  5600. uint8_t tmp;
  5601. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1A4);
  5602. tmp &= ~PROPERTY_MSK_R1A4_REG_GPIO_RX_MODE;
  5603. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1A4, tmp);
  5604. }
  5605. void PAN312x_Set_XthCapTrim(uint8_t TrimCode)
  5606. {
  5607. uint8_t tmp;
  5608. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R2C7);
  5609. tmp &= ~PROPERTY_MSK_R2C7_XTH_CAP_TRIM;
  5610. tmp |= (TrimCode << PROPERTY_POS_R2C7_XTH_CAP_TRIM);
  5611. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R2C7, tmp);
  5612. }
  5613. void PAN312x_WutEnable(void)
  5614. {
  5615. uint8_t tmp;
  5616. PAN312x_Get_OP_Reg(R02F, 1, &tmp);
  5617. tmp |= R02F_WUT_EN_Msk;
  5618. PAN312x_Set_OP_Reg(R02F, 1, &tmp);
  5619. }
  5620. void PAN312x_WutDisable(void)
  5621. {
  5622. uint8_t tmp;
  5623. PAN312x_Get_OP_Reg(R02F, 1, &tmp);
  5624. tmp &= ~R02F_WUT_EN_Msk;
  5625. PAN312x_Set_OP_Reg(R02F, 1, &tmp);
  5626. }
  5627. void PAN312x_IomuxGpio3Rcl(void)
  5628. {
  5629. uint8_t tmp;
  5630. PAN312x_Get_OP_Reg(R00E, 1, &tmp);
  5631. tmp &= ~R00E_GPIO3_MUX15_SEL_Msk;
  5632. tmp |= (0x02 << R00E_GPIO3_MUX15_SEL_Pos);
  5633. PAN312x_Set_OP_Reg(R00E, 1, &tmp);
  5634. PAN312x_Iomux_Gpio(IOMUX_GPIO3_AS_BOD_LVR_RCL_XTL);
  5635. }
  5636. /**
  5637. * @简介:设置802.15.4g数据包的头文件字段中fcs类型
  5638. * @参数:FcsType:
  5639. * 0x00: CRC32,多项式为0x04C011BB7
  5640. * 0x01: CRC16,多项式为0x1021
  5641. * @返回值: 无
  5642. */
  5643. void PAN312x_Set_FcsType(PAN312x802154FcsType FcsType)
  5644. {
  5645. uint8_t tmp;
  5646. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R11B);
  5647. tmp &= ~PROPERTY_MSK_R11B_REG_M802_FCS;
  5648. tmp |= (FcsType << PROPERTY_POS_R11B_REG_M802_FCS);
  5649. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R11B, tmp);
  5650. }
  5651. /**
  5652. * @简介:通过PAN312x的gpio输出高电平到TCXO的使能引脚,以此来激活TCXO,
  5653. * @参数:GpioPin:只支持GPIO9和GPIO10
  5654. * PinState:如果TCXO EN高电平有效, 则使能的话PinState = 1, 失能的话PinState = 0;
  5655. * 如果TCXO EN低电平有效, 则使能的话PinState = 0, 失能的话PinState = 1;
  5656. * @返回值: 无
  5657. * @备注:如果使用TCXO,并且需要PAN3120的GPIO来激活,则需要将此函数PAN312x_Trigger()前面执行;
  5658. */
  5659. void PAN312x_TCXO_ControlByGpio(uint16_t GpioPin, uint8_t PinState)
  5660. {
  5661. if(PAN312x_GPIO_PIN_9 == GpioPin){
  5662. PAN312x_Iomux_Gpio_BySpi(IOMUX_GPIO9_AS_GPIO);
  5663. PAN312x_Set_Gpio_Mode_BySpi(PAN312x_GPIO_PIN_9, GPIO_OUTPUT_MODE);
  5664. PAN312x_Gpio_Write_Pin_BySpi(PAN312x_GPIO_PIN_9,PinState);
  5665. }else if(PAN312x_GPIO_PIN_10 == GpioPin){
  5666. PAN312x_Iomux_Gpio_BySpi(IOMUX_GPIO10_AS_GPIO);
  5667. PAN312x_Set_Gpio_Mode_BySpi(PAN312x_GPIO_PIN_10, GPIO_OUTPUT_MODE);
  5668. PAN312x_Gpio_Write_Pin_BySpi(PAN312x_GPIO_PIN_10,PinState);
  5669. }
  5670. }
  5671. /**
  5672. * @简介:初始化控制TRxSwitch的GPIO引脚
  5673. * @参数:吴
  5674. * @返回值: 无
  5675. * @备注:
  5676. */
  5677. void PAN312x_TRxSwitchGpioInit(void)
  5678. {
  5679. PAN312x_Iomux_Gpio(IOMUX_GPIO0_AS_GPIO);
  5680. PAN312x_Iomux_Gpio(IOMUX_GPIO1_AS_GPIO);
  5681. PAN312x_Set_Gpio_Mode(PAN312x_GPIO_PIN_0|PAN312x_GPIO_PIN_1, GPIO_OUTPUT_MODE);
  5682. }
  5683. /**
  5684. * @简介:关闭TxSwitch
  5685. * @参数:无
  5686. * @返回值: 无
  5687. */
  5688. void PAN312x_TxSwitchOn(void)
  5689. {
  5690. PAN312x_Gpio_Write_Pin(PAN312x_GPIO_PIN_0, 0);
  5691. PAN312x_Gpio_Write_Pin(PAN312x_GPIO_PIN_1, 1);
  5692. }
  5693. /**
  5694. * @简介:打开RxSwitch
  5695. * @参数:无
  5696. * @返回值: 无
  5697. */
  5698. void PAN312x_RxSwitchOn(void)
  5699. {
  5700. PAN312x_Gpio_Write_Pin(PAN312x_GPIO_PIN_0, 1);
  5701. PAN312x_Gpio_Write_Pin(PAN312x_GPIO_PIN_1, 0);
  5702. }
  5703. /**
  5704. * @简介:关闭TRxSwitch
  5705. * @参数:无
  5706. * @返回值: 无
  5707. */
  5708. void PAN312x_TRxSwitchOff(void)
  5709. {
  5710. PAN312x_Gpio_Write_Pin(PAN312x_GPIO_PIN_0, 0);
  5711. PAN312x_Gpio_Write_Pin(PAN312x_GPIO_PIN_1, 0);
  5712. }
  5713. void PAN312x_SetSyncwordTimeout(PAN312xPacketInit* pPacketInitStruct)
  5714. {
  5715. uint8_t tmp;
  5716. uint8_t timeout_byte;
  5717. timeout_byte = pPacketInitStruct->PreambleLength + pPacketInitStruct->SyncwordLength + 8;
  5718. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1A4);
  5719. tmp |= PROPERTY_MSK_R1A4_REG_TIMEOUT_EN;
  5720. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1A4, tmp);
  5721. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1A4, timeout_byte);
  5722. }
  5723. /**
  5724. * @简介:合并tx fifo作为rx fifo 此时rx fifo大小变为256 bytes
  5725. * @参数:无
  5726. * @
  5727. */
  5728. void PAN312x_MergeTxFifoAsRxFifo(void)
  5729. {
  5730. uint8_t tmp;
  5731. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R16B);
  5732. tmp &= ~PROPERTY_MSK_R16B_FIFO_MODE;
  5733. tmp |= (0x02 << PROPERTY_POS_R16B_FIFO_MODE);
  5734. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R16B, tmp);
  5735. }
  5736. /**
  5737. * @简介:合并rx fifo作为tx fifo,此时tx fifo大小变为256 bytes
  5738. * @参数:无
  5739. * @
  5740. */
  5741. void PAN312x_MergeRxFifoAsTxFifo(void)
  5742. {
  5743. uint8_t tmp;
  5744. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R16B);
  5745. tmp &= ~PROPERTY_MSK_R16B_FIFO_MODE;
  5746. tmp |= (0x01 << PROPERTY_POS_R16B_FIFO_MODE);
  5747. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R16B, tmp);
  5748. }
  5749. /**
  5750. * @简介:清除TxFifo和RxFifo
  5751. * @参数:无
  5752. * @
  5753. */
  5754. void PAN312x_FlushTxFifoRxFifo(void)
  5755. {
  5756. uint8_t tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1C0);
  5757. tmp |= (PROPERTY_MSK_R1C0_FIFO0_WADDR_CLR | PROPERTY_MSK_R1C0_FIFO0_RADDR_CLR);
  5758. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1C0, tmp);
  5759. tmp &= ~(PROPERTY_MSK_R1C0_FIFO0_WADDR_CLR | PROPERTY_MSK_R1C0_FIFO0_RADDR_CLR);
  5760. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1C0, tmp);
  5761. tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1C1);
  5762. tmp |= (PROPERTY_MSK_R1C1_FIFO1_WADDR_CLR | PROPERTY_MSK_R1C1_FIFO1_RADDR_CLR);
  5763. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1C1, tmp);
  5764. tmp &= ~(PROPERTY_MSK_R1C1_FIFO1_WADDR_CLR | PROPERTY_MSK_R1C1_FIFO1_RADDR_CLR);
  5765. PAN312x_Set_PropertyB1(PROPERTY_ADDR_R1C1, tmp);
  5766. }
  5767. void PAN312x_Set_RxAdjustFrequency(uint32_t AdjustFrequency)
  5768. {
  5769. float mid_frequency_tmp;
  5770. uint32_t ref_freq = 32000000;
  5771. uint8_t lo_tmp;
  5772. lo_tmp = PAN312x_Get_PropertyB1(PROPERTY_ADDR_R1B3);
  5773. lo_tmp &= 0x07;
  5774. if(lo_tmp == 0){
  5775. mid_frequency_tmp = AdjustFrequency * 2.0f / ref_freq * (1 << 24);
  5776. }else if(lo_tmp == 1){
  5777. mid_frequency_tmp = AdjustFrequency * 4.0f / ref_freq * (1 << 24);
  5778. }else if(lo_tmp == 2){
  5779. mid_frequency_tmp = AdjustFrequency * 6.0f / ref_freq * (1 << 24);
  5780. }else if(lo_tmp == 3){
  5781. mid_frequency_tmp = AdjustFrequency * 8.0f / ref_freq * (1 << 24);
  5782. }else if(lo_tmp == 4){
  5783. mid_frequency_tmp = AdjustFrequency * 12.0f / ref_freq * (1 << 24);
  5784. }
  5785. //[0x71][0x19][0x71][0x1a][0x71][0x1b]Rx AdjustFrequency
  5786. PAN312x_Set_PropertyB3(PROPERTY_ADDR_R199, (uint32_t)mid_frequency_tmp);
  5787. }
  5788. /****** Copyright (C) 2025-2050 Shanghai Panchip Microelectronics Co., Ltd. All rights reserved. *******/