A5133 FIFO Ext 動態調整RX接收FIFO長度

SamYang2024-08-2951核104
  • 之前介紹過,如何使用A5133的Basic FIFO製作一款可以將FIFO Payload裡塞入Tx字節長度,已達到可以實時動態調整RX 接收長度,詳細可參考此篇:A5133動態調整RX資料長度

  • 本篇延續之前介紹的可調式Basic FIFO RX,修改成設計可以延長接收 '>64Byte'的FIFO Ext可調接收長度功能

<代碼:RC_A5133_Ux0_Reference code for 0.5M_1M_2M_4Mbps  Dynamic FIFO mode -256 byte-20240828.zip>

  •  因代碼使用的MCU為Amiccom 51核Soc,因此SPI的速度不夠,需降低DataRate至50Kbps 才能demo FIFO Ext功能,若使用者選型的MCU SPI速度>4.5Mhz的話,使用4Mbps DataRate傳輸也是沒問題的

底下介紹如何還原成4Mbps速率傳輸:

1. 到A5133Config.h打開DR_4Mbps define,關閉預設的DR_500Kbps define

image.png

2. Mark掉Master & Slave端

RF_WriteReg(DATARATECLOCK, 9);/* 50kbps */

此功能是將原先500Kbps的DataRate再除以(9+1)=50Kbps

image.png

3.修改接收端的读取数据长度的延时:

如DR:4Mbps 修改为 (2*8)/4000000 , 即4us

修改位置如下图:

image.png

  • 数据相关说明:

FIFOLength: 是用于设置发送数据长度(如要发256byte(其中前2 Byte 用于让接收端设置接收长度的CMD) 则设为 256,實際用戶Payload為2~255Byte Buf)

PN9_Tab[256]:要发送的数据,前2Byte 为FIFP长度參數(长度code会自动设置)

tmpbuf[256]: 存放接收到的数据,tmpbuf[1]用于判断TX发送的数据长度

TX:

1. FIFO Ext基礎參數設置

	RF_WriteReg(FIFO2_REG, 0xC0);/* FPM=16/48 Bytes */設置FIFO 余量
			
	RF_WriteReg(GIO1_REG,0x01);/* gio1-wtr */設置GIO1為WTR Mode以便觀察射頻狀態
	RF_WriteReg(GIO2_REG,0x1D);/* gio2-trxd */
	RF_WriteReg(CKO_REG,0x12);/* cko-FPF */設置成FPF Mode,使FIFO Buf剩餘設定的余量後啟動該pin中斷


	RF_StrobeCmd(CMD_PLL);
	RF_SetCH(80);/* ch=80, freq=5805.001MHz */

2. 將使用者有效資料填入2~255Buf裡共塞入254個有效資料

	for(i=0;i<254;i++)
            {
		PN9_Tab[i+2]=i;
	    }

3.

	while(1)
	{	
		
	    FIFOLength=256;//設置Tx FIFO長度=256byte

	    RF_FIFOLength(FIFOLength-1);
	    PN9_Tab[0]=0
	    PN9_Tab[1]=FIFOLength-1;// PN9_Tab[1]=真實RX端要收的Data長度CMD
				
	 k = (FIFOLength-64)/48;//計算FIFO總長度須拆分成幾小包48Byte封包
	 m = (FIFOLength-64)%48;//計算剩餘的資料字節數

4.若資料長度< 64Byte 則採用Basic FIFO即可

	if(FIFOLength <= 64)
	{
		RF_FIFOWrite(64); //write data to tx fifo
		if(RF_LVR_Check())/* check if BOD reset has occurred */
		    break;/* exit loop & re-RF init */
	        else
		    RF_StrobeCmd(CMD_TX);/* transmit packet */
					
		Delay10us(1);
		while(GIO1);/* wait transmit completed */
					
	        P1_1=0;
        }

5.若資料>64Byte,則須改用FIFO Ext

	else
	{
		RF_FIFOWrite(64); //write data to tx fifo
		if(RF_LVR_Check())/* check if BOD reset has occurred */
		    break;/* exit loop & re-RF init */
		else
		    RF_StrobeCmd(CMD_TX);/* transmit packet */		
		count=64;
		    for(j=0; j<k; j++)//k值為剛剛計算後的48Byte小封包數量
			{
			    while(CKO==0);//等待FPF中斷
			    SCS=0;
			    ByteSend(FIFO_REG);
			    for(i=0;i<48;i++)
			     {
			      ByteSend(PN9_Tab[count++]);//填入48Byte資料
			     }
			    SCS=1;
			}
					
			if(m>0)//m為剛剛計算後的剩餘字節量
			{						
			    while(CKO==0);//等待FPF中斷
			    SCS=0;
			    ByteSend(FIFO_REG);
			    for(i=0;i<m;i++)
			        {
				    ByteSend(PN9_Tab[count++]);//填入剩餘的資料
				}
			    SCS=1;
			}

				
			    while(GIO1==1);//等待TX WTR拉LOW,表示發射行為結束							  
	}

RX:

1.FIFO Ext基礎參數設置

	RF_WriteReg(FIFO2_REG, 0xC0);/* FPM=16/48 Bytes */設置FIFO 余量

	RF_WriteReg(GIO1_REG,0x01);//gio1 pin=WTR
	RF_WriteReg(GIO2_REG,0x05);//gio2 pin=Fsync
	RF_WriteReg(CKO_REG,0x12); //cko pin=FPF

	RF_FIFOLength(64-1);//64 bytes  這裡需先預設FIFO長度=64Byte,後續收到TX發來的TX發來的長度CMD再去快速設定FIFO長度REG即可
	RF_StrobeCmd(CMD_PLL);
	RF_SetCH(80);//freq=5805.001MHz

2.進入RX等待ID Code sync(GIO2 Go High)

	RF_StrobeCmd(CMD_RX);
            
	Delay10us(1);
	while(~GIO2);
	Delay10us(16);//即4us
	RF_StrobeCmd(CMD_RFR);//RX fifo pointer reset

3.

	SCS=0;
	ByteSend(FIFO_REG | 0x40);//Read address 0x05
	for(i=0; i <2; i++)
	{
	    recv = ByteRead();//將前2byte取出,存入tmpbuf
	    tmpbuf[i]=recv;
	}
	SCS=1;
	RF_FIFOLength(tmpbuf[1]);//使用tmpbuf[1],設置RX端長度

4.若資料長度< 64Byte 則採用Basic FIFO即可

	if(tmpbuf[1]<=64)
	{	
	    count=2;
	    while(GIO1)
	    SCS=0;
	    ByteSend(FIFO_REG | 0x40);//Read address 0x05
	    for(i=0; i <tmpbuf[1]-1; i++)
	        {
	            recv = ByteRead();
	            tmpbuf[count++]=recv;
	        }
	    SCS=1;
	}

5.

	else
        {				
	    k = ((tmpbuf[1]+1)/48)-1;//k值為計算扣除第1包48Byte字量後剩餘的48byte小封包數量
	    m = (tmpbuf[1]+1)%48;//m值為剩餘的字節數量
					
            if((m+48)<=64)
               {
	        k=k-1;
	        m=m+48;
               }
					
            count=2;
		
	    while(CKO==0);//等待FPF中斷
		SCS=0;
		ByteSend(FIFO_REG | 0x40);//Read address 0x05 FIFO BUF
		for(i=0; i <46; i++)
		    {
		        recv = ByteRead();
		        tmpbuf[count++]=recv;//將data開始填入2~47Byte位置
		    }
		SCS=1;				
                for(j=0; j<k; j++)
		{
		    while(CKO==0);//等待FPF中斷
		    SCS=0;
		    ByteSend(FIFO_REG | 0x40);//Read address 0x05 FIFO BUF
		  for(i=0; i <48; i++)
		    {
	                recv = ByteRead();
                        tmpbuf[count++]=recv;將data依序每包48byte填入tmpbuf
		    }
	            SCS=1;
	        }
	
                while(GIO1)
					
            SCS=0;
	    ByteSend(FIFO_REG | 0x40);//Read address 0x05 FIFO BUF
	    for(i=0; i <m; i++)
	       {
		recv = ByteRead();
		tmpbuf[count++]=recv;//將剩餘字節填入tmpbuf
	       }
	    SCS=1;					
        }

发表评论

访客

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