介紹A91x39M0 低功耗接收 WOR功能
之前有介绍過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函數
修改wrdly=65,使active時間為2ms一次
修改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......)
實測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