/* ****************************************************************************** * * @file VOX_Module.c * @brief VOL/R module * * * @version 1.0 * @date 2022/07/18 09:59:40 * @author Alex Xu * * Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd. * All Rights Reserved * * History: * Revision Date Author Desc * 1.0.0 2022/07/18 Alex build this file ****************************************************************************** */ #include "vox_module.h" #include "led.h" #include "system.h" #include "discharge_module.h" #include "sleep.h" #include "bat.h" #include "hall.h" #include "key.h" #include "sys_tim.h" #include "adc.h" #include "gpio_comm.h" #include "userapp.h" bit Vox_Vout_Enable = OFF; //Vox功率输出标志位 bit Earphone_Chg_Flag = 0; //耳机出入盒标志位 uint8_t Vox_TX_Timer = 0; //VOX发送指令持续时间计数,在Hall_Handler检测中清0. #if VOX_ENABLE /******************************************************************************\ Macro definitions \******************************************************************************/ /*100ms调用周期*/ #define VOX_OUTPUT_SHORT_CNT 2 #define VOX_LOW_BAT_CNT 25 //关盖前,盒子低电保护,Vox 5V持续2.5s #define VOX_VOUT_5V_LEAST_CNT 200 #define VOX_VOUT_5V_DEBOUNCE 3 //开盖前,耳机充满或盒子电压低于3.582V,则VOX 5V持续150ms #define VOX_ADT_HOLD_CNT 3 #define Vox_TX_Pattern_Cnt 3 #define VOX_IOFF_HOLD_CNT 30 #define BOOST_VOUT_MAX 2 //跟随充Boost输出电压上限值:0:4.6V,1:4.7V,2:4.8V,3:5.05V. /******************************************************************************\ Variables definitions \******************************************************************************/ uint8_t Vox_Vol_Hold_Timer = 0; bit Cover_Close_Flag = 0; bit Cover_Close_Flag1 = 0; bit Cover_Open_Flag = 0; bit Vox_Vout_5V_Flag = 0; uint8_t Vox_Output_Short_Debounce = 0; bit Get_CHIP_STA1_Flag = 0; bit Pattern_TX_Over_Flag = 0; uint8_t CHIP_STA1_BK = 0; bit Vox_None_Inbox_Flag = 0; #if VOX_FOLLOW_CHG bit Vor_In_Box_Flag = 0; bit Vol_In_Box_Flag = 0; bit Boost_VoxVout_Follow_Flag = 0; int8 Boost_Vout_Value = 0; bit Boost_Up_Flag = 0; #endif /******************************************************************************\ Functions definitions \******************************************************************************/ /* ******************************************************************************* * void VOX_EN_Type(VOR_Enable_Type_e VOR_Enable_Type) * * Description : VOL Open(EN_VO) * Arguments : * Returns : * Notes : * ******************************************************************************* */ void VOX_EN_Type(VOX_Enable_Mode_e VOX_Enable_Mode) { COM_CTRL = ON; if( VOX_Enable_Mode == VOX_VOUT_Mode) { VOX_CTL0 &= ~0x30; //VOX Disable 5V And Disable VOX ADT VOX_CTL0 |= 0x30; //VOX Enable 5V } else { VOX_CTL0 &= ~0x30; //VOX 5v Off } } /* ******************************************************************************* * void Vox_Det_Machine(void) * * Description : Vox Detect:耳机识别。 (100ms调用周期) * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ void Vox_Det_Machine(void) { /*Vox 过流保护,两只耳机都每隔200ms打嗝一次*/ if( IRQ_FLAG0 & 0x0C ) { Vox_Output_Short_Debounce++; if( Vox_Output_Short_Debounce >= VOX_OUTPUT_SHORT_CNT ) //Vox短路保护200ms后,重新开启Vox 5V。 { Vox_Output_Short_Debounce = 0; IRQ_FLAG0 = 0x0C; VOX_EN_Type(VOX_VOUT_Mode); return; } } if( CoverEvent_Flg ) //Hall事件触发。 { if( gBoost_Prepared_Flag ) { COM_CTRL = ON; if( CoverStatus == CLOSE ) //1、关盖关闭COM_CTRL;显示灯效。(无需查询Loadon、IOFF状态,无论耳机是否在仓,Vox 5V输出。) { Cover_Close_Flag = 1; Cover_Close_Flag1 = 1; CoverEvent_Flg = 0; Vox_Vout_Enable = ON; Cover_Open_Flag = 0; Vol_In_Box_Flag = 0; Vor_In_Box_Flag = 0; // Vox_Vol_Hold_Timer = 0; //关盖清0,开盖使用 VOX_EN_Type(VOX_ADT_Mode); // P10 = 1; // P03 = 0; //return; } else //2、开盖处理:调整Vox电压;pattern tx 循环3次。 { Cover_Close_Flag = 0; if( Vox_Vout_Enable == OFF ) //开盖前,耳机充满或盒子电池低电,则开盖后VOX 5V输出持续300ms { BST_EN = 1; VOX_CTL0 |= 0x30; //打开VOX负端 if( Vox_Vol_Hold_Timer < VOX_VOUT_5V_DEBOUNCE ) { Vox_Vol_Hold_Timer++; return; } VOX_CTL0 &= ~0x30; //VOX 5v Off BST_EN = 0; } COM_CTRL = OFF; PATTERN_TX = ON; Vox_Vol_Hold_Timer = 0; Cover_Open_Flag = 1; //Get_CHIP_STA1_Flag = 0; CoverEvent_Flg = 0; Pattern_TX_Data = ( (bat_level*10) << 8) | FW_VER2; //获取盒子电量和软件版本号 } } else { VOX_EN_Type(VOX_ADT_Mode); } } /* 发送开盖指令*/ if( Cover_Open_Flag ) /*开盖后Vbat(Adt模式)持续300ms后,发送pattern。*/ { if( Vox_Vol_Hold_Timer < VOX_ADT_HOLD_CNT ) { Vox_Vol_Hold_Timer++; return; } if( Vox_TX_Timer < Vox_TX_Pattern_Cnt ) { BST_EN = 1; PATTERN_TX = OFF; VOX_CTL0 |= 0x30; //打开VOX负端MOS Pattern_TX_Start = 1; Vox_TX_Timer++; Pattern_TX_Over_Flag = 1; COM_CTRL = ON; } else { if( Pattern_TX_Over_Flag ) { Pattern_TX_Over_Flag = 0; VOX_EN_Type(VOX_ADT_Mode); //先关VOX 5V输出,再关Boost BST_EN = 0; COM_CTRL = ON; PATTERN_TX = ON; Vox_Vout_Enable = OFF; } else { if( !Get_CHIP_STA1_Flag ) { Get_CHIP_STA1_Flag = 1; CHIP_STA1_BK = CHIP_STA1 & 0xA0; //获取耳机loadon状态 } } if( Get_CHIP_STA1_Flag ) { /*耳机出入盒判断*/ if( CHIP_STA1_BK != (CHIP_STA1 & 0xA0) ) //查询耳机loadon状态,loadon状态改变,则说明有耳机出入盒。 { Earphone_Chg_Flag = 1; LED_On_Timer = 0; CHIP_STA1_BK = CHIP_STA1 & 0xA0; } } } } if( Cover_Close_Flag ) { if( Cover_Close_Flag1 ) { if( !Get_CHIP_STA1_Flag ) //关盖后需判断有几只耳机在盒 { Get_CHIP_STA1_Flag = 1; if( CHIP_STA1 & 0xA0 ) { if( (CHIP_STA1 & 0xA0) == 0x80 ) //盒子里有VOR耳机 { Vor_In_Box_Flag = 1; } else if( (CHIP_STA1 & 0xA0) == 0x20 ) //盒子里有VOL耳机 { Vol_In_Box_Flag = 1; } else //盒子里两个耳机都在。 { Vor_In_Box_Flag = 1; Vol_In_Box_Flag = 1; } } else { Vox_None_Inbox_Flag = 1; } } if( !BST_EN ) { #if VOX_FOLLOW_CHG /*跟随充逻辑*/ SFRADDR = OTP_KEY; SFRDATA = 0x69; SFRADDR = BST_CTL0; //Boost 5V输出 SFRDATA |= 0x03; SFRADDR = OTP_KEY; SFRDATA = 0x01; Boost_Vout_Value = 0x03; Boost_Up_Flag = 0; SFRADDR = VOX_CON0; //IOFF选择高电流档10/15/20/25mA SFRDATA |= 0x20; SFRADDR = VOX_CON2; SFRDATA &= ~0xC0; SFRDATA |= 0x80; //IOFF 20mA Boost_VoxVout_Follow_Flag = 1; #endif BST_EN = 1; //Boost Enable;异常时由硬件主动关闭。开启Boost,开启Vox 5v会在开启Boost之后(100ms延时)。 // P10 = 1; return; } // P10 = 0; if( Vor_In_Box_Flag && Vol_In_Box_Flag ) { VOX_CTL0 |= 0x30; } else if( Vol_In_Box_Flag ) //盒子里有VOL耳机 { VOX_CTL0 |= 0x10; //VOL Enable 5V } else //盒子里两个耳机都在。 if( Vor_In_Box_Flag ) //盒子里有VOR耳机 { VOX_CTL0 |= 0x20; //VOR Enable 5V } else { Boost_VoxVout_Follow_Flag = 0; } if( Vox_Vol_Hold_Timer < VOX_IOFF_HOLD_CNT ) //等耳机抽电。 { Vox_Vol_Hold_Timer++; return; } Cover_Close_Flag1 = 0; } else { #if VOX_FOLLOW_CHG if( Boost_VoxVout_Follow_Flag ) { if ( CHIP_STA1 & 0x0C ) //是否存在IOFF标志,存在,则Boost上升一个step,否则,Boost下降一个step。 { Boost_Vout_Value += 1; //Boost 输出上升一个step Boost_Up_Flag = 1; if( Boost_Vout_Value >= BOOST_VOUT_MAX ) //Boost输出达到电压上限值,则结束跟随充。 { Boost_Vout_Value = BOOST_VOUT_MAX; Boost_VoxVout_Follow_Flag = 0; SFRADDR = VOX_CON0; //IOFF选择低电流档2/3/4/5mA SFRDATA &= ~0x20; SFRADDR = VOX_CON2; SFRDATA &= ~0xC0; SFRDATA |= 0x40; //IOFF 3mA } } else { if( !Boost_Up_Flag ) //只在初始化找最低轻载电压时执行 { Boost_Vout_Value -= 1; //Boost 输出下降一个step if( Boost_Vout_Value <= 0 ) { Boost_Vout_Value = 0; } } } SFRADDR = OTP_KEY; SFRDATA = 0x69; SFRADDR = BST_CTL0; //Boost 输出 SFRDATA &= ~0x03; SFRDATA |= Boost_Vout_Value; SFRADDR = OTP_KEY; SFRDATA = 0x01; return; } #endif } if( Vor_In_Box_Flag && Vol_In_Box_Flag ) { if( (CHIP_STA1 & 0xAC) == 0xAC ) { Vox_None_Inbox_Flag = 1; Vor_In_Box_Flag = 0; Vol_In_Box_Flag = 0; } } else if( Vol_In_Box_Flag ) //盒子里有VOL耳机 { if( (CHIP_STA1 & 0x24) == 0x24 ) { Vox_None_Inbox_Flag = 1; Vol_In_Box_Flag = 0; } } else //盒子里两个耳机都在。 if( Vor_In_Box_Flag ) //盒子里有VOR耳机 { if( (CHIP_STA1 & 0x88) == 0x88 ) { Vox_None_Inbox_Flag = 1; Vor_In_Box_Flag =0; } } // if( ( (CHIP_STA1 & 0xAC) == 0xAC ) || F_batlevel_protect || Vox_None_Inbox_Flag ) //耳机充满或盒子低电,VOX需要从5V到0V,则关闭Vout输出通路,关闭Boost。 if( F_batlevel_protect || Vox_None_Inbox_Flag ) { if ( F_batlevel_protect ) //关盖前,盒子低电,则关盖时序为:Vox由ADT转换为5V输出,持续2.5s { if( Vox_TX_Timer < VOX_LOW_BAT_CNT ) { Vox_TX_Timer++; return; } } else { if( Vox_TX_Timer < VOX_VOUT_5V_LEAST_CNT ) { Vox_TX_Timer++; return; } } VOX_CTL0 &= ~0x30; //VOX 5v Off 关功率管 ,先关VOX 5V 再关Boost。 BST_EN = 0; COM_CTRL = OFF; Vox_Vout_Enable = OFF; gBoost_Prepared_Flag = 0; PATTERN_TX = OFF; } } } #endif