介紹A91x39M0 低功耗接收 WOR功能

SamYang2024-05-10M0核126
  • 之前有介绍過Amiccom WOR功能的工作原理,可以參考此篇<Amiccom WOR介紹>

  • 本篇換使用Amiccom A9139M0 核Soc Chip做WOR低功耗接收

<代碼:RC_A9139M0_Ux0_470MHz-510MHz Band Ref. Code WOR mode_240517.zip>

  • TX端說明:每delay 200us,發射一包 2Byte Payload的資料

TX:先進入UserRegister函數中,修改FIFO Length=2Byte & ID Length=4Byte & CRC Enable

void UserRegister ( void )
{
		Reg_Init();
		IDLength ( ID_4BYTES ); 		
	        if ( WriteID() ) 
		    Err_State(); 
		
		FIFO_Reg = 0x00000001; //b0~b25:FEP, lengths=FEP+1 
		RADIO->FIFOCTRL = FIFO_Reg;		
				
		SYCK_Reg = 0x000E0000; //b0~b7:SDR, Data rate=Data rate/(SDR+1)  
		RADIO->SYCK = SYCK_Reg;		
		
		GPIO_Reg = 0x07000000; //RFIO	 
		RADIO->RFGIO = GPIO_Reg;	
		
		TXPWR_Reg = 0x0007027E;	//b0~b5:TBG, b6~b7:PAC, b8~b9:TDC, 62/1/2 
		RADIO->TXPOWER = TXPWR_Reg;					
    
		//IDL[1:0]: [00]:2bytes, [01]:4bytes, [10]:6bytes, [11]:8bytes 
		CODE1_Reg = 0x3D580301; //b22~b23:IDL, 4bytes CRC Enable
		RADIO->CODE1 = CODE1_Reg;			
		
}

main.c :間隔每200us打一包TX

		while ( 1 )
		    {											
			RF_SetBBIO ( ARCWTR_GPIO1, EOAC_GPIO2, DCK_CKO, ENABLE );
			WriteFIFO ( PN9_TAB, 2 ); //Write 2Byte data to TX FIFO
			while(1)
			{
			RF_Flag = 0;
			RFLIB_StrobeCmd ( CMD_TX ); //Entry TX & Transmit						
			while ( RF_Flag == 0 ); //Wait TX Finish
			Delay100us ( 2 ); //delay 200us for TX ramp down
		        }
						
		    }	

RX端:呼叫WOR_enable_by_sync函數

  1. 修改wrdly=65,使active時間為2ms一次

  2. 修改wordly=127,使sleep時間為1s一次

void WOR_enable_by_sync ( void )
{
		Uint16 wrdly, wordly;
	
		wrdly = 65; //2ms
		wordly = 127;
		RCOSC_Cal(); //internal RC OSC CAL

		RF_SetBBIO ( PDNRX_GPIO1, ARCWTR_GPIO2, ROSC_CKO, ENABLE ); 

		    //setup WOR Sleep time and Rx time
		    //WOR Active Period = (WRDLY[8:0]+1) x (1/32768), (30.5us ~ 15.6ms).
		    //WOR Sleep  Period = (WORDLY[9:0]+1) x (32/4096), (7.8ms ~ 7.99s).
 	 	    //WRDLY[8:0]=256 : WOR Active Period ~ 7.84ms, WORDLY[9:0]=127 : WOR Sleep  Period ~ 1s
		
	        WORT2_Reg = ( ( WORT2_Reg & ~0x03FF01FF ) | ( wrdly & 0x1FF ) | ( ( wordly & 0x3FF ) << 16 ) );	

		    //WOR_HOLD : WOR hold RX setting when preamble/sync/carrier detected ok.
		    //      [0]: No hold. [1]: Hold RX.
		    //WOR_SEL: TWWS=1 setting.
		    //      [0]:RX valid packet.  [1]: preamble/sync/carrier  detected ok.
		    //WOR_RST: Shall be set to [1].
		WORT2_Reg = ( ( WORT2_Reg & ~0x03000000 ) | BY_FRAME_SYNC_OK );
		WORT2_Reg = ( WORT2_Reg & ~0x04000000 ); //b30:WOR_SEL=0	
		RADIO->WORT_Item.TSEL = ENABLE; 
		DSSS1_Reg = ( ( DSSS1_Reg & ~0x03000000 ) | BIT24 | BIT25 );	//b24:WOR_HOLD=1, b25:WOR_RST=1
		RADIO->WORT2 = WORT2_Reg;
		RADIO->DSSS1 = DSSS1_Reg;
		
		RFLIB_StrobeCmd ( CMD_STBY );

		NVIC_EnableIRQ ( RADIO_IRQn );//enable RF interrupt
		INTIE_Reg	|= RADIO_INT_CLEAR | ENABLE_RFINT_WAKEBB; 
		RADIO->RFINT_WRITE = INTIE_Reg;	
		

		RADIO->WORT_Item.WN = 0;
		RADIO->WORT_Item.WOR_EN = ENABLE;//enable WOR function
		PM2();
               
		//WOR_SEL=0 : RX valid packet -> TWWS go high -> wake up MCU
		//check data
		RxPacket();
		RFLIB_StrobeCmd ( CMD_STBY ); //TWWS reset by strobe command.
}

實測TX Off,Rx WOR(active ~2ms==>Sleep ~1s==>active ~2ms......)

微信圖片_20240510135533.png實測TX ON時,RX端SYNC OK,收下資料包

TX Timig=delay ~200us==>TX-ARCWTR Go High(TX on)==>TX-ARCWTR Go Low(Tx finish)=~330us

RX Timing=RX_PDN Go High(RX Ready)==>RX-ARCWTR Go Low(Rx finish)=296us

TRX WTR.png


发表评论

访客

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