Auto Resend / Auto Ack 介紹 (使用A5133為例)

SamYang2024-03-1151核122
  • 本篇介紹使用A5133 運行Auto Resend /Auto Ack(詳細也可以參閱A5133 Datasheet 第19章)

A5133 Datasheet v1.1.pdf

    1.  EAR=1=開啟Auto-Resend,EAK=1=開啟Auto Ack

  • image.png

image.png

    2. Auto Resend MAX次數=15

image.png


    3. ARD可以調整每包Resend的間距時間,預設=600uS,p.s. 600us內RF會進入RX等待Ack packet,RND=fixed interval=200us,這邊需要使用到CKO(設定成VPOAK) mode,來觀察Auto Resend/Auto Ack是否完成(成功)

image.png

   

image.png


image.png

image.png

  • 可調整VKM/VPM,設置VPOAK GO High時,為脈衝訊號,且脈衝寬度維持10us後自動Low,或是設定by event,若是by event需要下達any Strobe cmd來拉low

image.png

  • 代碼:

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 */
}

image.png

image.png

    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
				}


发表评论

访客

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