找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1765|回复: 0
打印 上一主题 下一主题
收起左侧

A7160驱动程序

[复制链接]
跳转到指定楼层
楼主
ID:584195 发表于 2021-8-16 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在闲鱼上弄得墨水屏几个,准备研究如何驱动,现在把程序贴出来大家一起学习一下。

12 #include <intrins.h>
13 #include "ap180.h"
14 #include "define.h"
15 #include "a7106reg.h"
功能說明:Include 檔宣告,定義常數變數
行數 說明
12~15
匯入程式庫設定檔


17 /*********************************************************************
18 ** I/O Declaration
19 *********************************************************************/
20 #define SCS P1_1 //spi SCS
21 #define SCK P3_0 //spi SCK
22 #define SDIO P3_1 //spi SDIO
23 #define CKO P0_2 //CKO
24 #define GIO1 P3_3 //GIO1
25 #define GIO2 P3_4 //GIO2
26 #define MasterSel P1_7 //Master Slave select
功能說明:MCU 對 A7106 RF chip I/O 接腳定義,常數定義
行數 說明
20~26 MCU I/O 配置



28 /*********************************************************************
29 ** Global Variable Declaration
30 *********************************************************************/
31 Uint8 data _100us;
32 Uint8 data timer;
33 Uint16 idata RxCnt;
34 Uint32 idata Err_ByteCnt;
35 Uint32 idata Err_BitCnt;
36 Uint8 idata tmpbuf[64];
37 Uint8 data Seq;
38 Uint8 data Err_HopCnt;
39
40 const Uint8 code BitCount_Tab[16] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
41 const Uint8 code ID_Tab[4]={0x54,0x75,0xC5,0x2A}; //ID code
42 const Uint8 code PN9_Tab[]=
43 { 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1,
44 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4,
45 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC,
46 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53,
47 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59,
48 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D,
49 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A,
50 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0
51 }; // This table are 64bytes PN9 pseudo random code.
功能說明:使用的整體變數宣告,常數變數的宣告
行數 說明
31~38
程式中使用的變數宣告
40 BitCount_Tab 宣告
41
ID code 宣告
42~51 PN9 data 宣告



53 const Uint16 code A7106Config[]=
54 {
55 // address name Descript
56 // ------- ---- ---------
57 0x00, //0x00 ; MODE_REG
58 0x62, //0x01 ; MODE_CONTROL_REG FIFO mode, Enable ARSSI, Enable AIF
59 0x00, //0x02 ; CALIBRATION_REG
60 0x3F, //0x03 ; FIFO1_REG FIFO end = 63+1
61 0x40, //0x04 ; FIFO2_REG
62 0x00, //0x05 ; FIFO_REG
63 0x00, //0x06 ; IDCODE_REG
64 0x00, //0x07 ; RCOSC1_REG
65 0x00, //0x08 ; RCOSC2_REG
66 0x00, //0x09 ; RCOSC3_REG
67 0x00, //0x0A ; CKO_REG
68 0x01, //0x0B ; GIO1_REG GIO1 = WTR
69 0x01, //0x0C ; GIO2_REG GIO2 = WTR
70 0x05, //0x0D ; CLOCK_REG
71 0x00, //0x0E ; DATARATE_REG 500K bps
72 0x64, //0x0F ; PLL1_REG
73 0x9E, //0x10 ; PLL2_REG
74 0x4B, //0x11 ; PLL3_REG
75 0x00, //0x12 ; PLL4_REG
76 0x02, //0x13 ; PLL5_REG
77 0x16, //0x14 ; TX1_REG f(dev) = 186kHz
78 0x2B, //0x15 ; TX2_REG
79 0x12, //0x16 ; DELAY1_REG TX, PLL setting time = 60us
80 0x40, //0x17 ; DELAY2_REG Crystal Turn on delay = 600us
81 0x62, //0x18 ; RX_REG BW = 500kHz, Up side band
82 0x80, //0x19 ; RXGAIN1
83 0x80, //0x1A ; RXGAIN2
84 0x00, //0x1B ; RXGAIN3
85 0x0A, //0x1C ; RXGAIN4
86 0x32, //0x1D ; RSSI_REG
87 0x03, //0x1E ; ADC_REG
88 0x0F, //0x1F ; CODE1_REG ID=4bytes, Preamble=4bytes, enable CRC
89 0x16, //0x20 ; CODE2_REG
90 0x00, //0x21 ; CODE3_REG
91 0x00, //0x22 ; IFCAL1_REG
92 0x00, //0x23 ; IFCAL2_REG
93 0x00, //0x24 ; VCOCCAL_REG VCO current auto calibration
94 0x00, //0x25 ; VCOCAL1_REG
95 0x23, //0x26 ; VCOCAL2_REG
96 0x70, //0x27 ; BATTERY_REG Regulator = 1.8V, Enable Quick discharge
97 0x17, //0x28 ; TXTEST_REG TX power = 0dBm
98 0x47, //0x29 ; RXDEM1_REG
99 0x80, //0x2A ; RXDEM2_REG
100 0x77, //0x2B ; CPC_REG RGC=3, CPC=3, LVR=1, CELS=1
101 0x01, //0x2C ; CRYSTALTEST_REG
102 0x45, //0x2D ; PLLTEST_REG
103 0x19, //0x2E ; VCOTEST1_REG
104 0x00, //0x2F ; VCOTEST2_REG
105 0x01, //0x30 ; IFAT_REG
106 0x0F, //0x31 ; RSCALE_REG
107 0x00, //0x32 ; FILTERTEST_REG
108 0x7F, //0x33 ; TMV_REG Ramp Up / Ramp Down enable
109 };
功能說明: RF chip 初始設定
行數 說明
53~109 RF chip 的初始設定

111 const Uint8 HopTab[5]=
112 {
113 22, //2411
114 42, //2421
115 82, //2441
116 122,//2461
117 162 //2481
118 };
功能說明:Hopping table 宣告
行數 說明
117~118 自行定義 5 個的 channel.



120 /*********************************************************************
121 ** function Declaration
122 *********************************************************************/
123 void InitTimer0(void);
124 void initUart0(void);
125 void Timer0ISR (void);
126 void A7106_Reset(void);
127 void A7106_WriteReg(Uint8, Uint8);
128 Uint8 A7106_ReadReg(Uint8);
129 void ByteSend(Uint8 src);
130 Uint8 ByteRead(void);
131 void A7106_WriteID(void);
132 void A7106_WriteFIFO(void);
133 void initRF(void);
134 void A7106_Config(void);
135 void A7106_Cal(void);
136 void A7106_RCO_Cal(void);
137 void RxPacket(void);
138 void StrobeCmd(Uint8);
139 void SetCH(Uint8);
功能說明:副程式檔頭宣告
行數 說明
123~139 副程式宣告



146 void main(void)
147 {
148 //initHW
149 P0 = 0xFF;
150 P1 = 0xFF;
151 P2 = 0xFF;
152 P3 = 0xFF;
153
154 InitTimer0();
155 TR0=1;
156 EA=1;
157
158 if (MasterSel == 1) // Master
159 {
160 initRF();
161 StrobeCmd(CMD_STBY);
162 A7106_WriteFIFO(); //write data to tx fifo
163 Seq=0;
164
165 while(1)
166 {
167 //Tx time-slot
168 while(timer != 2); //wait until timer=2
169 SetCH(HopTab[Seq]);
170 StrobeCmd(CMD_TX); //entry tx & transmit
171 while(GIO1); //wait transmit completed
172
173 //Rx time-slot
174 while(timer !=12); //wait until timer=12
175 StrobeCmd(CMD_RX);
176 while( (GIO1==1) && (timer<=14) );
177
178 if ( GIO1 == 0 )
179 {
180 //data procedure
181 RxPacket();
182 }
183 else
184 {
185 //timeout
186 StrobeCmd(CMD_STBY);
187 }
188
189 Seq++;
190 Seq %= 5;
191 }
192 }
功能說明:主程式 main loop。
行數 說明
158
判斷 P1_7 (MasterSel),當 P1_7==1 就執行 master 迴圈,否則執行 slave 迴圈。
159~192
Master 迴圈
162
寫 64 bytes PN9 data 到 A7106 TX FIFO (在 RF 初始化時,已將 FIFO 長度設為 64)。
168~171
等待 timeslot 為 2,然後發射 TX packet.
174
等待 timeslot 為 12
175
設定 RF chip 進入 RX mode,並等待 ACK packet。
若 ACK packet 的長度和 TX packet 的長度不一樣時,在進入 RX mode 前要先設定 FIFO 長度。
由於在 RF 初始化時有開啟 AIF 的功能,因此在同 channel 下進入 RX 時不用重新設定 channel。
176~187
當 GIO1==1 代表沒有收到 ACK packet (timeslot > 14),離開 RX mode。
當 GIO1==0 代表收到 ACK packet,讀取 RX FIFO 並計算錯誤的 bits 數。
189~190
Channel 的號碼加一。



193 else //MasterSel == 0, slave
194 {
195 initRF();
196
197 //clear variable
198 RxCnt = 0;
199 Err_ByteCnt = 0;
200 Err_BitCnt = 0;
201 Seq=0;
202 Err_HopCnt=0;
203
204 while(1)
205 {
206 //Rx time-slot
207 while(timer!=0);
208 SetCH(HopTab[Seq]);
209 StrobeCmd(CMD_RX);
210 while(GIO1 && timer <= 3); //wait receive completed
211
212 if ( GIO1 == 1 ) // not received data
213 {
214 StrobeCmd(CMD_STBY);
215
216 Seq++;
217 Seq %= 5;
218
219 Err_HopCnt++;
220 if (Err_HopCnt > 5)
221 {
222 Seq = 0;
223 Err_HopCnt = 0;
224
225 SetCH(HopTab[Seq]);
226 StrobeCmd(CMD_RX);
227 while(1)
228 {
229 if (GIO1==0)
230 {
231 break;
232 }
233 }
234 }
235 else
236 {
237 continue;
238 }
239 }
240
241 InitTimer0();
242 TR0=1;
243 timer = 2; //reSync
244
245 RxPacket();
246
247 //Tx time-slot
248 while(timer != 12);
249 StrobeCmd(CMD_TX);
250 while(GIO1);
251
252 Seq++;
253 Seq %= 5;
254 }
255 }
256 }



功能說明:初始化 Timer0 程序
行數 說明
194~255
Slave 迴圈
207~210
設定 RF 進入 RX mode 並等待 master 端傳送資料或是等待超時 (timeslot > 3)
212
若 GIO1==1 則沒有收到 master 傳送的資料 (亦即傳送超時)
214~239
設定 RF chip 離開 RX mode 並換下一個 channel 試試看。若所有的 channel 都沒有讀到資料,則停在
channel 0 直到接收到 master 發射的資料為止
241~243
RF chip 接收到資料,重設 timeslot
245
讀取 RX FIFO 的資料
248
等待 timeslot 等於 12.
249~250
設定 RF chip 進入 TX mode 並傳送 ACK packet。 (因為在 RF 初始化時已啟動 AIF 功能,因此不用重新設定
channel)
252~253
Channel 的號碼加一。
258 /************************************************************************
259 ** init Timer0
260 ************************************************************************/
261 void InitTimer0(void)
262 {
263 TF0 = 0;
264 TR0 = 0;
265 TMOD &= 0xF0;
266 TMOD |= 0x02; // 8bit auto-reload
267 TH0 = (256-100);
268 TL0 = (256-100); // auto-reload count: 100us @ 12MHz
269 ET0 = 1; // enable Timer0 interrupt
270 _100us = 10;
271 }
功能說明:初始化 Timer0 程序
行數 說明
263~264
關閉 Timer0 計時動作並清除 Timer0 的中斷旗標
265~266
設置 Timer0 為 mode 2 (8bits 計時器,自動重新載入)
267~268
設定 Timer0 的計時期間 (100us 中斷發生)
269
致能 Timer0 中斷
270
設定 _100us 為 10 (用來計算 1ms 的時間)
273 /************************************************************************
274 ** Timer0ISR
275 ************************************************************************/
276 void Timer0ISR (void) interrupt 1
277 {
278 TF0 = 0; // Clear Timer0 interrupt
279
280 _100us --;
281 if ( _100us == 0 )
282 {
283 _100us = 10;
284
285 timer++;
286 if (timer>=20)
287 timer=0;
288 }
289 }
功能說明:初始化 Timer0 的中斷副程式



行數 說明
278
清除 Timer0 中斷旗標
280~283
1ms 時間計算
285~287
產生 timeslot (即 timer)
291 /************************************************************************
292 ** Reset_RF
293 ************************************************************************/
294 void A7106_Reset(void)
295 {
296 A7106_WriteReg(MODE_REG, 0x00); //reset RF chip
297 }
功能說明:A7106 RF chip Reset 程序
行數 說明
296
對 register 位址 0 ,寫入 0x00,重置 RF chip。
299 /************************************************************************
300 ** WriteID
301 ************************************************************************/
302 void A7106_WriteID(void)
303 {
304 Uint8 i;
305 Uint8 d1,d2,d3,d4;
306
307 SCS = 0;
308 ByteSend(IDCODE_REG);
309 for (i=0; i < 4; i++)
310 ByteSend(ID_Tab[ i]);
311 SCS = 1;
312
313 // only for check, can skip it.
314 SCS=0;
315 ByteSend(IDCODE_REG | 0x40);
316 d1=ByteRead();
317 d2=ByteRead();
318 d3=ByteRead();
319 d4=ByteRead();
320 SCS=1;
321 }
功能說明:寫入 ID 的程序。
行數 說明
307~311
寫入 ID 控制暫存器的位址,及 4 bytes 的 ID code
314~320
讀出 ID code (只用來做 check 而已,可省略)



323 /************************************************************************
324 ** A7106_WriteReg
325 ************************************************************************/
326 void A7106_WriteReg(Uint8 addr, Uint8 dataByte)
327 {
328 Uint8 i;
329
330 SCS = 0;
331 for(i = 0; i < 8; i++)
332 {
333 if(addr & 0x80)
334 SDIO = 1;
335 else
336 SDIO = 0;
337
338 SCK = 1;
339 _nop_();
340 SCK = 0;
341 addr = addr << 1;
342 }
343 _nop_();
344
345 //send data byte
346 for(i = 0; i < 8; i++)
347 {
348 if(dataByte & 0x80)
349 SDIO = 1;
350 else
351 SDIO = 0;
352
353 SCK = 1;
354 _nop_();
355 SCK = 0;
356 dataByte = dataByte<< 1;
357 }
358 SCS = 1;
359 }
功能說明:對 A7106 控制暫存器(Control Register)寫入動作
行數 說明
330
SCS=0,致能控制暫存器讀寫功能
331~342
寫入 address
346~357
寫入 data
358
SCS=1,清除控制暫存器讀寫功能



361 /************************************************************************
362 ** A7106_ReadReg
363 ************************************************************************/
364 Uint8 A7106_ReadReg(Uint8 addr)
365 {
366 Uint8 i;
367 Uint8 tmp;
368
369 SCS = 0;
370 addr |= 0x40; //bit cmd=0,r/w=1
371 for(i = 0; i < 8; i++)
372 {
373
374 if(addr & 0x80)
375 SDIO = 1;
376 else
377 SDIO = 0;
378
379 _nop_();
380 SCK = 1;
381 _nop_();
382 SCK = 0;
383
384 addr = addr << 1;
385 }
386
387 _nop_();
388 SDIO = 1;
389
390 //read data
391 for(i = 0; i < 8; i++)
392 {
393 if(SDIO)
394 tmp = (tmp << 1) | 0x01;
395 else
396 tmp = tmp << 1;
397
398 SCK = 1;
399 _nop_();
400 SCK = 0;
401 }
402 SCS = 1;
403 return tmp;
404 }
功能說明:A7106 控制暫存器(Control Register)讀出動作
行數 說明
369
SCS=0,致能控制暫存器讀寫功能
370
寫入 address 並將讀出 bit 設為 1 以讀取資料
371~385
設置 SDIO 為輸出模式 (在其他類型的 MCU 上,此動作可能是設為 input pin)
388
讀出資料
391~401
SCS=0,清除控制暫存器讀寫功能
402
回傳 1 byte 的讀值



406 /************************************************************************
407 ** ByteSend
408 ************************************************************************/
409 void ByteSend(Uint8 src)
410 {
411 Uint8 i;
412
413 for(i = 0; i < 8; i++)
414 {
415 if(src & 0x80)
416 SDIO = 1;
417 else
418 SDIO = 0;
419
420 _nop_();
421 SCK = 1;
422 _nop_();
423 SCK = 0;
424 src = src << 1;
425 }
426 }
功能說明:寫入 1 byte 的程序
行數 說明
413~425 寫入 1 個 byte 的程序
428 /************************************************************************
429 ** ByteRead
430 ************************************************************************/
431 Uint8 ByteRead(void)
432 {
433 Uint8 i,tmp;
434
435 SDIO = 1; //sdio pull high
436 for(i = 0; i < 8; i++)
437 {
438 if(SDIO)
439 tmp = (tmp << 1) | 0x01;
440 else
441 tmp = tmp << 1;
442
443 SCK = 1;
444 _nop_();
445 SCK = 0;
446 }
447 return tmp;
448 }
功能說明:讀出 1byte 的程序
行數 說明
436~446
讀出 1 個 byte 的程序
447
返回 8 bit 的讀值
450 /*********************************************************************
451 ** SetCH
452 *********************************************************************/
453 void SetCH(Uint8 ch)
454 {
455 A7106_WriteReg(PLL1_REG, ch);


功能說明:設置頻道的程序
行數 說明
455
呼叫副程式 A7106_WriteReg,對 PLL1 控制暫存器寫入工作頻道值。
458 /*********************************************************************
459 ** initRF
460 *********************************************************************/
461 void initRF(void)
462 {
463 //init io pin
464 SCS = 1;
465 SCK = 0;
466 SDIO = 1;
467 CKO = 1;
468 GIO1 = 1;
469 GIO2 = 1;
470
471 A7106_Reset(); //reset A7106 RF chip
472 A7106_WriteID();//write ID code
473 A7106_WriteReg(CPC_REG, 0x77); // RGC=3
474 A7106_Config(); //config A7106 chip
475 A7106_WriteReg(CPC_REG, 0x57); // RGC=1
476 A7106_Cal(); //calibration IF,vco, vcoc
477 A7106_RCO_Cal(); // calibration RC Osc (OPTION)
478 }
功能說明:初始化 Master 端的 RF chip
行數 說明
464~469
設置 RF chip 介面 I/O 初始值
471
呯叫副程式 A7106_Reset,重置 RF chip
472
呼叫副程式 A7106_WriteID,寫入 ID code 4ytes
473
設置 RGC=3
474
呼叫副程式 A7106_Config,初始 RF 端的控制暫存器
475
設置 RGC=1
476
呼叫副程式 A7106_Cal,IF, VCO, VCO current 的校準程序
477
呼叫副程式 A7106_RCO_Cal,RC oscillator 的校準程序。若使用者沒有用到 WOR 或是 TWWS 功能時,此
步驟可省略。
480 /*********************************************************************
481 ** A7106_WriteFIFO
482 *********************************************************************/
483 void A7106_WriteFIFO(void)
484 {
485 Uint8 i;
486
487 SCS=0;
488 ByteSend(FIFO_REG);
489 for(i=0; i <64; i++)
490 ByteSend(PN9_Tab[ i]);
491 SCS=1;
492 }
功能說明:Tx FIFO 寫入資料的程序
行數 說明
487
SCS=0,致能控制暫存器讀寫功能
488
寫入 FIFO_REG (0x05)
489~490 寫入 64 bytes 的資料
491
[size=9.119pt]SCS=1[size=9.119pt],清除控制暫存器讀寫功能
494 /*********************************************************************
495 ** Strobe Command
496 *********************************************************************/
497 void StrobeCmd(Uint8 cmd)
498 {
499 SCS = 0;
500 ByteSend(cmd);
501 SCS = 1;
502 }
功能說明:Strobe 命令寫入的程序。
行數 說明
499
SCS=0,致能控制暫存器讀寫功能
500
呯叫副程式 Send4Bit,將控制指令寫入。這邊也可以只寫入 4bits 的控制指令。
501
SCS=1,清除控制暫存器讀寫功能
504 /*********************************************************************
505 ** RxPacket
506 *********************************************************************/
507 void RxPacket(void)
508 {
509 Uint8 i;
510 Uint8 recv;
511 Uint8 tmp;
512
513 RxCnt++;
514
515 SCS=0;
516 ByteSend(FIFO_REG | 0x40);
517 for(i=0; i <64; i++)
518 {
519 recv = ByteRead();
520 tmpbuf[ i]=recv;
521 if((recv ^ PN9_Tab[ i])!=0)
522 {
523 tmp = recv ^ PN9_Tab[ i];
524 Err_BitCnt += (BitCount_Tab[tmp>>4] + BitCount_Tab[tmp & 0x0F]);
525 }
526 }
527 SCS=1;
528 }
功能說明:從 RX FIFO 讀出資料,比對資料的程序
行數 說明
513
變數 RxCnt 加 1
515
SCS=0,致能控制暫存器讀寫功能
516
寫入 FIFO_REG 並將讀取 bit 設為 1 以準備讀出 RX FIFO
517~526 讀出 data ,比較 data 的正確性,計算出 error bit
527
[size=9.119pt]SCS=1[size=9.119pt],清除控制暫存器讀寫功能
530 /*********************************************************************
531 ** Err_State
532 *********************************************************************/
533 void Err_State(void)
534 {
535 //ERR display
536 //Error Proc...
537 //...
538 while(1)
539 {
540 ;
541 }
542 }
功能說明:Error State 處理程序
行數 說明
534~542 Error 處理程序,使用者自訂
544 /*********************************************************************
545 ** calibration
546 *********************************************************************/
547 void A7106_Cal(void)
548 {
549 Uint8 tmp;
550 Uint8 fb, vcb, vb, rh, rl;
551
552 //==================================================
553 // calibration IF, VB, VCB, RSSI
554 StrobeCmd( CMD_STBY );
555 A7106_WriteReg( CALIBRATION_REG, 0x0F );
556 do
557 {
558 tmp = A7106_ReadReg( CALIBRATION_REG );
559 } while ( tmp & 0x0F );
560
561 tmp = A7106_ReadReg( IFCAL1_REG );
562 if ( tmp & 0x10 )
563 Err_State();
564 fb = tmp & 0x0F;
565
566 tmp = A7106_ReadReg( VCOCCAL_REG );
567 if ( tmp & 0x10 )
568 Err_State();
569 vcb = tmp & 0x0F;
570
571 tmp = A7106_ReadReg( VCOCAL1_REG );
572 if ( tmp & 0x08 )
573 Err_State();
574 vb = tmp& 0x07;
575
576 rh = A7106_ReadReg( RXGAIN2_REG );
577 rl = A7106_ReadReg( RXGAIN3_REG );
578 }
功能說明:IF, VCO, VCO current 校準程序
行數 說明
554
設定 A7106 進入 standby mode.以準備開始 calibration 程序
555
啟動 IF, VB, VCB, RSSI. 的自動校準程序
556~559 等待自動校準程序結束
561~564 檢查 FBCF,若 FBCF 為 1,則 IF 自動校準失敗
[size=9.119pt]566~569 [size=9.119pt]檢查 [size=9.119pt]FVCC[size=9.119pt],若 [size=9.119pt]FVCC [size=9.119pt]為 [size=9.119pt]1[size=9.119pt],則[size=9.119pt] VCO current [size=9.119pt]自動校準失敗
571~574 檢查 FBCF,若 FBCF 為 1,則 VCO band 自動校準失敗
576~577 讀取 RH and RL。RH 相當於在-64dBm 下讀到的 RSSI 值,RL 相當於在-74dBm 下讀到的 RSSI 值
580 /*********************************************************************
581 ** A7106_RCO_Cal
582 *********************************************************************/
583 void A7106_RCO_Cal(void)
584 {
585 Uint8 tmp, rcoc, rcot;
586
587 //==================================================
588 // calibration RC osc
589 for ( rcot = 0; rcot <= 3; rcot++ )
590 {
591 A7106_WriteReg( RCOSC3_REG, 0x00 ); // RCO oscillator disable
592 A7106_WriteReg( RCOSC3_REG, (0x0C | (rcot<<4)) ); // RCOSC_E=1, CALW=1
593 do
594 {
595 tmp = A7106_ReadReg( RCOSC1_REG ) & 0x80;
596 } while( tmp );
597 rcoc = A7106_ReadReg( RCOSC1_REG ) & 0x3F;
598 if ( rcoc >= 20 )
599 {
600 return;
601 }
602 }
603
604 Err_State(); // RCOC always too small
605 }
Function:A7106 RC oscillator calibration.
行數 說明
589
執行振盪器校準程序,RCOT 由 0 到 3 順序執行
591
關閉 RC 振盪器
592
啟動 RC 振盪器並開始執行 RC 振盪器校準程序
593~596
等待 RC 振盪器校準程序結束
597
讀出 RCOC 值
596~598
若 RCOC 值大於 20,結束 RC 振盪器校準程序。若 RCOC 值小於 20,RC 振盪器的誤差可能會太大,將
RCOT 的值加一並重新執行 RC 振盪器校準程序。
604
若 RCOT 已經加到 3 但 RCOC 的值一直小於 20,則此 WOR/TOWR 動作可會誤差太大或有問題,使用者也
[size=9.119pt]許需要檢查 [size=9.119pt]RF Chip[size=9.119pt]。
607 /*********************************************************************
608 ** A7106_Config
609 *********************************************************************/
610 void A7106_Config(void)
611 {
612 Uint8 i;
613
614 //0x00 mode register, for reset
615 //0x02 calibration register
616 //0x05 fifo data register
617 //0x06 id code register
618 //0x23 IF calibration II, only read
619 //0x32 filter test register
620
621 for ( i=1; i<=0x33; i++ )
622 {
623 if ( (i==0x02) || (i==0x05) || (i==0x06) || (i==0x23) || (i==0x32) )
624 continue;
625
626 A7106_WriteReg( i, A7106Config[ i] );
627 }
628 }
功能說明:初始 RF chip Master 端的程序
行數 說明
621~627 呼叫副程式 A7106_WriteReg,以初始化所有的控制暫存器。但有一些控制暫存器不去初始化它,包括 0x00,
0x02, 0x05, 0x06, 0x23, 0x32 等暫存器。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表