A8101 VOX By TWOR Sleep timer功能

SamYang2024-03-07A9101/A8101171
  • 先前介紹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


image.png

2. 進入Sleep mode 前先啟動RF 中斷 之後執行STOP,停止MCU(因停止MCU前有先開啟RFINT,因此MCU STOP後執行RFINT中斷)

            StrobeCmd(CMD_SLEEP);
            EIE |= 0x08;//Enable RFINT
            PCON = 0x02;//STOP MCU

image.png


image.png

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
}

image.png

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

发表评论

访客

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