如何使用Amiccom RF IC 的Ref Code Tx/Rx製作一款簡易版測試距離工具

SamYang2024-01-0951核151
  • 本篇介紹如何使用Amiccom 提供的Ref Code 來製作一款測試RF 性能的工具

  • 注意每顆RF IC的Config & 校準流程 & 初始化流程皆不太相同,需使用相對應IC型號的Ref Code

  1. Amiccom 每顆RF IC的RX接收靈敏度 皆為 BER < 0.1% (千分之一) 

  2. 因此我們需要將TX發射過來的資料,做相應的比對誤碼率計算

  3. 為了方便比對誤碼率,因此我們需要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端:

  1. 初始化RF後,執行Standby CMD(使RF IC進入Standby Mode),

  2. 定義好Err_ByteCnt = 0; Err_BitCnt = 0; SubRxCnt = 0; Err_Frame = 0;

  3. 設定頻點(每顆RF IC的Setch公式不同,需視當下IC的Ref Code為主)

  4. 設定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;
			}






























发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。