Auto Resend / Auto Ack 介紹 (使用A5133為例)
本篇介紹使用A5133 運行Auto Resend /Auto Ack(詳細也可以參閱A5133 Datasheet 第19章)
1. EAR=1=開啟Auto-Resend,EAK=1=開啟Auto Ack
2. Auto Resend MAX次數=15
3. ARD可以調整每包Resend的間距時間,預設=600uS,p.s. 600us內RF會進入RX等待Ack packet,RND=fixed interval=200us,這邊需要使用到CKO(設定成VPOAK) mode,來觀察Auto Resend/Auto Ack是否完成(成功)
可調整VKM/VPM,設置VPOAK GO High時,為脈衝訊號,且脈衝寬度維持10us後自動Low,或是設定by event,若是by event需要下達any Strobe cmd來拉low
代碼:
RC_A5133_ FIFO mode_V0.6 -20230829-CRC_Check.zip
代碼解說:
1.初始化設定Enable Auto Resend/Auto Ack & ARC=3(重傳3次) & ARD=600uS,& fixed RND interval=200us
void RF_AdvFIFO_Init(void) { RF_WriteReg(FCR_REG, 0x0F);/* EAR=1, EAK=1, ARC=3, FCL=0 */ RF_WriteReg(ARD_REG, 0x02);/* ARD=2, ARD=600us */ RF_WriteReg(AFEP_REG, 0x40);/* spss=1 */ RF_WriteReg(KEYC_REG, 0x20);/* ARTMS=1, fixed interval */ RF_WriteReg(USID_REG, 0x00);/* Random seed=0, fixed interval=200us */ }
2. 設定VKM=1 By 脈衝&VPM=1 脈衝寬=10uS & CKO=VOPAK Mode
RF_WriteReg(GIO1_REG,0xC1);/* GIO1=WTR mode; VKM=1=Vpoak by pulse;VPM=1=30us Pulse width*/ RF_WriteReg(GIO2_REG,0x1D);/* GIO2=trxd mode; No use ;Can modify other */ RF_WriteReg(CKO_REG,0x72);/* CKO=VPOAK Mode */
3. Tx端先Disable Auto Ack bit
P3_4 = 0;//P3_4 is Check state I/O RF_WriteReg(FCR_REG, 0x0D);/* EAR=1, EAK=0, ARC=3, FCL=0 */ 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);//wait TX ready while(GIO1);//Wait TX Finish
4. Check CKO Pin(Vpoak) 如果Go High表示auto resend完成
/* check vpoak */ if(CKO)//check vpoak state {//if vpoak go high wait 30us go low while(CKO);//wait vpoak go low P3 = P3 ^ 0x04;/* transmit completed, toggle I/O ;check resend succeed */ } //vpoak is not work else { P3 = P3 ^ 0x08;//_nop_();/* resend fail */ }
5. 如果重傳結束(不管成功或失敗),都切換成Rx mode,進入RX前,換打開Auto ack & 關閉 auto resend 一樣回復3次ack強制結束離開
P3_4 = 1;//P3 = P3 ^ 0x10; EnableTimer1_Nms(7);//set a 7ms timer to use Timeout Flag if(RF_LVR_Check())/* check if BOD reset has occurred */ break;/* exit loop & re-RF init */ else { RF_WriteReg(FCR_REG, 0x0E);/*EAK=1,EAR=0, ARC=3, FCL=0 */ RF_StrobeCmd(CMD_RX); } Delay10us(1);
6. 等待GIO1(WTR) go low表示接收完成,若重收3次還是都失敗,timeout flag=1,強制結束RX,回到PLL Mode
while((GIO1)&&(Timer1Flag)) _nop_(); if(GIO1==0)//RX succeed { DisableTimer1();//Not Timeout DisableTimer1 if(Is_Vpoak())//read FCR_REG vpoak bit is ok or Fail { P3 = P3 ^ 0x04;/* valid packet, toggle I/O */ RxPacket();//Read packect } else P3 = P3 ^ 0x08; } else//RX Not succeed Timeout { P3 = P3 ^ 0x08; RF_StrobeCmd(CMD_PLL);//turn to PLL mode }