如何使用Amiccom RF IC 的Ref Code Tx/Rx製作一款簡易版測試距離工具
本篇介紹如何使用Amiccom 提供的Ref Code 來製作一款測試RF 性能的工具
注意每顆RF IC的Config & 校準流程 & 初始化流程皆不太相同,需使用相對應IC型號的Ref Code
Amiccom 每顆RF IC的RX接收靈敏度 皆為 BER < 0.1% (千分之一)
因此我們需要將TX發射過來的資料,做相應的比對誤碼率計算
為了方便比對誤碼率,因此我們需要TX/RX端為固定資料內容,好讓RX端可以進行比對計算
TX端:
1.持續固定發射相同封包內容
const Uint8 code PN9_Tab[]= { 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1, 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4, 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC, 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53, 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59, 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D, 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A, 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0 };
2. 將PN9 Data寫入RF IC內部的FIFO TX Buffer
void A7130_WriteFIFO(void) { Uint8 i; Uint8 cmd; cmd = FIFO_REG; //send address 0x05, bit cmd=0, r/w=0 SCS=0; ByteSend(cmd); for(i=0; i <64; i++) ByteSend(PN9_Tab[i]); SCS=1; }
3. 填好WriteFIFO後,執行TX CMD,等待GIO1 Go Low(相關GIO介紹可以參考:GIO介紹)
while(1) { A7130_WriteFIFO(); //write data to tx fifo StrobeCmd(CMD_TX); //entry tx & transmit while(GIO1); //wait transmit completed P1_1=0; Delay10ms(1) }
RX端:
初始化RF後,執行Standby CMD(使RF IC進入Standby Mode),
定義好Err_ByteCnt = 0; Err_BitCnt = 0; SubRxCnt = 0; Err_Frame = 0;
設定頻點(每顆RF IC的Setch公式不同,需視當下IC的Ref Code為主)
設定RF IC內部的RX FIFO Buffer空間為64Byte(0x3F+1)
initRF(); //init RF StrobeCmd(CMD_STBY); RxCnt = 0; Err_ByteCnt = 0; Err_BitCnt = 0; SubRxCnt = 0; Err_Frame = 0; SetCH(100); //freq 2450.001MHz SCS=0; ByteSend(FIFO1_REG);//fifo length upto 4K bytes ByteSend(0x3F); //low byte ByteSend(0x00); //high byte SCS=1;
5.執行RX CMD,等待GIO1 Go Low
6.Go Low,執行RxPacket();將RF IC內部的RX FIFO Buffer 內容複製到MCU定義的Buffer空間裡
while(1) { StrobeCmd(CMD_RX); while(GIO1); //wait receive completed P1_1=0; RxPacket();
7.RxPacket()內容,將RF IC內部的RX FIFO Buffer 轉存到tmpbuf[i]裡,然後比對收到的內容與先前定義好的PN9_Tab[]內容錯誤了幾Bit
void RxPacket(void) { Uint8 i; Uint8 recv; Uint8 tmp; Uint8 cmd; RxCnt++; cmd = FIFO_REG | 0x40; //address 0x05, bit cmd=0, r/w=1 SCS=0; ByteSend(cmd); for(i=0; i <64; i++) { recv = ByteRead(); tmpbuf[i]=recv; if((recv ^ PN9_Tab[i])!=0) { Err_ByteCnt++; tmp = recv ^ PN9_Tab[i]; Err_BitCnt += (BitCount_Tab[tmp>>4] + BitCount_Tab[tmp & 0x0F]); } } SCS=1; }
8.這邊我們使用Amiccom Soc(A9108內核51)的MCU P1_3當作LED顯示PIN,
當收到2包以上也就是(64 Byte x 2)=128Byte=1024 bit ,前面提到Amiccom RX靈敏度 < 1/1000 bit,也就是每1024 bit只容許錯1bit ,若超過1bit,就視為誤碼率超標,因此我們套用"Err_BitCnt*125<RxCnt*64"公式可以得出當Err_BitCnt=2時,將觸發P1_3=0(LED燈 滅),來提示我們目前誤碼率已超標
9.這裡我們為了讓超標的誤碼率可以快速恢復,以利測試時不需要長時間等待,會加入每收滿1000包,會重新Reset Err_ByteCnt = 0; Err_BitCnt = 0; SubRxCnt = 0; Err_Frame = 0;
if(RxCnt>=2) { if(Err_BitCnt*125<RxCnt*64) { P1_3=1; } else { P1_3=0; } } else { P1_3=1; } if(RxCnt>1000) { RxCnt = 0; Err_ByteCnt = 0; Err_BitCnt = 0; SubRxCnt = 0; Err_Frame = 0; }