A5133 FIFO Ext 動態調整RX接收FIFO長度
之前介紹過,如何使用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
2. Mark掉Master & Slave端
RF_WriteReg(DATARATECLOCK, 9);/* 100kbps */
此功能是將原先500Kbps的DataRate再除以(9+1)=50Kbps
3.修改接收端的读取数据长度的延时:
如DR:4Mbps 修改为 (2*8)/4000000 , 即4us
修改位置如下图:
数据相关说明:
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; }