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.修改接收端的读取数据长度的延时:
由於此範例利用FIFO Data的前2byte來動態調整FIFO 長度,因此我們需要在ID Sync後(也就是GIO2 Go High),Delay 2 Byte的時間
如下圖,Delay 160us的原因是,我們採用DataRate 100kbps,因此2Byte的時間為16bit/100000=160us
P.S:假設使用者後續要改用DR:4Mbps時,則需要修改为 16bit/4000000 =4us,也就是改成Delay 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;
}