A8101 VOX By TWOR Sleep timer功能
先前介紹A9101 VOX功能,可以參考此篇:A9101VOX介紹
本篇換介紹A8101 VOX,與先前介紹的A9101 VOX 不太一樣的是,A8101代碼裡會在VOX尚未被觸發時會進入TWOR功能,也就是當Sleep timer計時到時會喚醒進入RFINT中斷,喚醒時Master端會去檢查CodeC ADC是否大於設定的門檻值,當>門檻值時會啟動VOX INT3中斷將TX_Active=1,恢復到正常通話狀態
代碼:使用時只需到main.h裡將#define VOXON打開即可以開啟VOX功能
RC_A8101_x2_Reference code for One Way Model(1Mbps) AFH_v0.9 - 20220805.zip
#define VOXON
1.啟動Sleep timer 將TMRE=1, 選擇使用WOR_SL參數作為TWOR的時間將TSEL=1, 啟動TWOR將TWWS_E=1
A8101_WriteReg(RCOSC3_REG,0x17);//TMRE=1, TSEL=1, TWWS_E=1
2. 進入Sleep mode 前先啟動RF 中斷 之後執行STOP,停止MCU(因停止MCU前有先開啟RFINT,因此MCU STOP後執行RFINT中斷)
StrobeCmd(CMD_SLEEP); EIE |= 0x08;//Enable RFINT PCON = 0x02;//STOP MCU
3.RF中斷
void RFISR(void) interrupt 10 { #ifdef Master StrobeCmd(CMD_STBY); EIF = 0x08;//Write '1' to clear flag EIE &= 0xF7; //disable RFINT A8101_WriteReg(RCOSC3_REG,0x10);//Disable sleep timer & TWOR off PCON |= 0x01;//system clcok Enable InitCodec(); EIE &= 0xFB;//disable INT4 ADC/DAC EIE |= 0x02;//Enable INT3 VOSINT EIP |= 0x02;//INT3 (at 1-high-level) A8101_WriteReg(CODEC_ANACTL,0x0F);//Disable DAC A8101_WriteReg(CODEC_AGCCAL,0x4C);//Set VOX threshold A8101_WriteReg(CODEC_CODECTL,0xB0);//ADC Enable A8101_WriteReg(CODEC_ADCDLY,0x00);//ADC Delay setting TX_Active = 0; Delay1ms(200); TIMEBASE = 65536; IP |=0x02; InitTimer0(); do{ }while((Timer_Flag==0)&&(TX_Active==0));//wait Tx Active=1 TR0 = 0; EIE &= 0xFD;//Disable INT3 VOXINT EIP &= 0xFD;//Disable INT3 Priority IP &= 0xFD;//Disable INT3 Interrupt Priority A8101_WriteReg(CODEC_ANACTL,0x00);//Disable DAC & ADC A8101_WriteReg(CODEC_AGCCAL,0x4C);//Set VOX threshold A8101_WriteReg(CODEC_CODECTL,0x00);////ADC off A8101_WriteReg(CODEC_ADCDLY,0x07);//ADC Delay setting if(TX_Active)//if VOX ON TX_Active=1 { StrobeCmd(CMD_STBY); STOP_Flag = 0;//SET STOP Flag=0 } else { STOP_Flag = 1; }
3.等待執行VOX中斷,將TX_Active=1
VOXISR解說:
void VOXISR(void) interrupt 8 { A8101_WriteReg(CODEC_STATE,0x00);//Reset CodeC A8101_WriteReg(CODEC_AGCCAL,0x2C);//修改VOX門檻值 TX_Active = (A8101_ReadReg(CODEC_STATE)&0x04)>>2;//Voice is active Tx_Actice=1 }
4. 當TX Active=1時,關閉RFINT,打TX,並將Search_Flag=1 ˙& STOP_Flag=0結束sleep mode,回到system link開始one way語音通話
while(1) { if(TX_Active)//Wait Voice active { EIE &= 0xF7; //disable RFINT for(j=0;j<300;j++) { TX_Active = 0; for(i=0;i<3;i++) { SetCH(Pair_Tab[i]); A8101_WriteReg(TXDATA_REG ,~0x81); A8101_WriteReg(TXDATA_REG + 1 ,~0x01); StrobeCmd(CMD_TX); while((A8101_ReadReg(STROBE_REG)&0x80)==0x80);//Wait RFINT State is None(finish) if((A8101_ReadReg(STROBE_REG)&0x08)==0x08)//RFINT flag=1 is Clear { Search_Flag = 1; break; } } if(Search_Flag||KEY_Pair) { StrobeCmd(CMD_STBY); break; } } STOP_Flag = 1; } if(~Search_Flag) { for(i=0;i<6;i++) { SetCH(Pair_Tab[Pair_index]); Pair_index++; if(Pair_index>2) Pair_index = 0; StrobeCmd(CMD_RX); TIMEBASE = 5000; InitTimer0(); IP |= 0x02; while((~Timer_Flag)&&((A8101_ReadReg(STROBE_REG)&0x80)==0x80)); IP &= 0xFD; TR0 = 0; if((A8101_ReadReg(STROBE_REG)&0x80)==0x80) StrobeCmd(CMD_STBY); else { Search_Flag = 1; break; } if(KEY_Pair) break; } } A8101_WriteReg(RCOSC3_REG,0x17); if(STOP_Flag) { StrobeCmd(CMD_SLEEP); STOP_Flag = 0; EIE |= 0x08; PCON = 0x02; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } if(Search_Flag||KEY_Pair) { StrobeCmd(CMD_STBY); break; } }