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;
}
}