介紹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
