/* ****************************************************************************** * * @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 "userapp.h" bit Vor_Vout_Enable = OFF; //OFF:用于BOOST开启后延时开启VOUT输出;TRUE:用于判断是正常充电还是IOFF充电。 bit Vol_Vout_Enable = OFF; bit Vor_GetInto_Box_Flag = 0; //耳机入盒标志位 bit Vol_GetInto_Box_Flag = 0; bit Vor_GetOut_Box_Flag = 0; //耳机出盒标志位 bit Vol_GetOut_Box_Flag = 0; //bit Vor_GetOut_Box_Flag1 = 0; //耳机出盒标志位 //bit Vol_GetOut_Box_Flag1 = 0; #if VOX_ENABLE /******************************************************************************\ Macro definitions \******************************************************************************/ #define VOX_IOFF_DET_DEBOUNCE 40 //Vox Ioff检测延时4s,为了保证耳机端初始化完成,开始抽电流 #define VOX_LOADON_DET_DEBOUNCE 2 /******************************************************************************\ Variables definitions \******************************************************************************/ Vox_State_e Vol_State = VOX_NONE_IN_BOX; //uint8_t Vol_Ioff_Det_Debounce = 0; Vox_State_e Vor_State = VOX_NONE_IN_BOX; //uint8_t Vor_Ioff_Det_Debounce = 0; //uint8_t Vol_Output_Debounce = 0; //uint8_t Vor_Output_Debounce = 0; bit Vol_Bat_Full_Flag = 0; bit Vor_Bat_Full_Flag = 0; bit Vol_Vout_Close_Flag = 0; bit Vor_Vout_Close_Flag = 0; //bit Vol_Bat_Low_Flag = 0; //bit Vor_Bat_Low_Flag = 0; /******************************************************************************\ Functions definitions \******************************************************************************/ /* ******************************************************************************* * void Vol_Det_Machine(void) * * Description : Vol Detect:耳机识别。 (100ms调用周期) * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ #if LED_188 bit Vol_Outbox_Disp_Flag = 0; bit Vol_Intobox_Disp_Flag = 0; #endif void Vol_Det_Machine(void) { static uint8_t Vol_Output_Debounce; /*Vol 过流保护,每隔200ms打嗝一次*/ if( IRQ_FLAG0 & 0x04 ) { // Vol_Output_Debounce++; // if( Vol_Output_Debounce >= 2 ) //Vor短路保护200ms后,重新开启ADT { // Vol_Output_Debounce = 0; IRQ_FLAG0 = 0x04; VOX_CTL0 &= ~0x10; //VOL Disable 5V And Enable VOR ADT VOX_CTL0 |= 0x10; //VOL Enable 5V Vol_Vout_Enable = OFF; Vol_State = VOX_NONE_IN_BOX; } } else { if( gBoost_Prepared_Flag ) { switch( Vol_State ) { case VOX_GET_INTO_BOX: //耳机入仓 VOX_CTL0 |= 0x10; //VOL Enable 5V Vol_State = VOX_STAY_IN_BOX; break; case VOX_STAY_IN_BOX: //耳机在仓 if( (CHIP_STA1 & 0x24) == 0x24 ) //Vox在充电过程中出现了Loadon和IOFF同时存在的状态,则出现如下三种情况:1、耳机出仓;2、耳机电池充满;3、耳机电池锂保。 { #if LED_188 if( Vol_Intobox_Disp_Flag ) //拔出左耳,左耳对应的图标闪一次 { Vol_Intobox_Disp_Flag = 0; Vol_GetOut_Box_Flag = 1; //左耳出盒标志置1 Vol_Outbox_Disp_Flag = 1; } #endif Vol_Output_Debounce++; if( Vol_Output_Debounce >= VOX_IOFF_DET_DEBOUNCE ) //重载转轻载(耳机出仓后)需延时4s { Vol_Output_Debounce = 0; VOX_CTL0 &= ~0x10; //VOL Disable 5V And Enable VOR ADT Vol_Bat_Full_Flag = 1; Vol_Vout_Close_Flag = 1; #ifdef _DEBUG_VOX printf("Vol Get Out1\r\n"); #endif } } else if( (CHIP_STA1 & 0x24) == 0x20 ) //观察CHIP_STA1的状态,无IOFF有Loadon,说明:1、耳机出仓后4s内,耳机再次入仓;2、10分钟未满,耳机电池退出锂保状态,进入正常充电; { Vol_Output_Debounce = 0; #if LED_188 if( Vol_Outbox_Disp_Flag ) //左耳4s内再次入盒,左耳对应的图标闪一次 { Vol_Outbox_Disp_Flag = 0; Vol_GetOut_Box_Flag = 0; LED_On_Timer = 0; } Vol_Intobox_Disp_Flag = 1; #endif if( Vol_Bat_Full_Flag ) //耳机充满,在ADT模式下,只有Loadon状态,则说明耳机充满。 { Vol_Vout_Enable = OFF; #ifdef _DEBUG_VOX printf("Vol Full\r\n"); #endif } else { Vol_Vout_Enable = ON; //正常充电标志置ON。 } } else if( !(CHIP_STA1 & 0x24) ) //CHIP_STA1无loadon和ioff状态,则说明耳机出仓了。 { Vol_State = VOX_NONE_IN_BOX; #if LED_188 Vol_GetInto_Box_Flag = 0; Vol_Intobox_Disp_Flag = 0; #endif Vol_Bat_Full_Flag = 0; Vol_Vout_Enable = OFF; #ifdef _DEBUG_VOX printf("Vol Get Out2\r\n"); #endif } break; case VOX_NONE_IN_BOX: //空仓 VOX_CTL0 &= ~0x10; //VOL Disable 5V And Enable VOR ADT Vol_Output_Debounce = 0; Vol_Vout_Enable = OFF; if( CHIP_STA1 & 0x20 ) //ADT模式下出现Loadon信号,则说明有耳机入仓。 { if( gBoost_Prepared_Flag ) { Vol_State = VOX_GET_INTO_BOX; #if DISCHARGE_ENABLE BST_EN = 1; //Boost Enable;异常时由硬件主动关闭。 #endif } #if LED_188 Vol_GetInto_Box_Flag = 1; #endif #ifdef _DEBUG_VOX printf("VOL_INTO_BOX\r\n"); #endif } break; default: break; } } else //Boost保护后,VOX恢复到最初状态。 { Vol_State = VOX_NONE_IN_BOX; #if LED_188 Vol_GetInto_Box_Flag = 0; #endif Vol_Vout_Enable = OFF; VOX_CTL0 &= ~0x10; //VOL Disable 5V And Enable VOR ADT } } } /* ******************************************************************************* * void Vor_Det_Machine(void) * * Description : Vor Detect:耳机识别。 (100ms调用周期) * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ #if LED_188 bit Vor_Outbox_Disp_Flag = 0; bit Vor_Intobox_Disp_Flag = 0; #endif void Vor_Det_Machine(void) { static uint8_t Vor_Output_Debounce; /*Vor 过流保护(读中断标志位),每隔200ms打嗝一次*/ if( IRQ_FLAG0 & 0x08 ) { // Vor_Output_Debounce++; // if( Vor_Output_Debounce >= 2 ) //Vor短路保护200ms后,重新开启ADT { // Vor_Output_Debounce = 0; IRQ_FLAG0 = 0x08; VOX_CTL0 &= ~0x20; //VOR Disable 5V And Enable VOR ADT VOX_CTL0 |= 0x20; //VOR Enable 5V Vor_Vout_Enable = OFF; Vor_State = VOX_NONE_IN_BOX; } } else { if( gBoost_Prepared_Flag ) { switch( Vor_State ) { case VOX_GET_INTO_BOX: //耳机入仓 VOX_CTL0 |= 0x20; //VOR Enable 5V Vor_State = VOX_STAY_IN_BOX; break; case VOX_STAY_IN_BOX: //耳机在仓 if( (CHIP_STA1 & 0x88) == 0x88 ) //Vox在充电过程中出现了Loadon和IOFF同时存在的状态,则说明:1、耳机出仓;2、耳机电池充满;3、耳机电池锂保。 { #if LED_188 if( Vor_Intobox_Disp_Flag ) // { Vor_Intobox_Disp_Flag = 0; Vor_GetOut_Box_Flag = 1; //右耳出盒标志置1 Vor_Outbox_Disp_Flag = 1; } #endif Vor_Output_Debounce++; if( Vor_Output_Debounce >= VOX_IOFF_DET_DEBOUNCE ) //重载转轻载(耳机出仓后)需延时4s { Vor_Output_Debounce = 0; VOX_CTL0 &= ~0x20; //VOR Disable 5V And Enable VOR ADT Vor_Bat_Full_Flag = 1; Vor_Vout_Close_Flag = 1; #ifdef _DEBUG_VOX printf("Vor Get Out1\r\n"); #endif } } else if( (CHIP_STA1 & 0x88) == 0x80 ) //观察CHIP_STA1的状态,无IOFF有Loadon,说明:1、耳机出仓后4s内,耳机再次入仓;2、10分钟未满,耳机电池退出锂保状态,进入正常充电;3、耳机锂保满10分钟。 { Vor_Output_Debounce = 0; #if LED_188 if( Vor_Outbox_Disp_Flag ) //左耳4s内再次入盒,左耳对应的图标闪一次 { Vor_Outbox_Disp_Flag = 0; Vor_GetOut_Box_Flag = 0; LED_On_Timer = 0; } Vor_Intobox_Disp_Flag = 1; #endif if( Vor_Bat_Full_Flag ) { Vor_Vout_Enable = OFF; #ifdef _DEBUG_VOX printf("Vor Full\r\n"); #endif } else { Vor_Vout_Enable = ON; } } else if( !(CHIP_STA1 & 0x88) ) //CHIP_STA1无loadon和ioff状态,则说明耳机出仓了。 { Vor_State = VOX_NONE_IN_BOX; #if LED_188 Vor_Output_Debounce = 0; Vor_Intobox_Disp_Flag = 0; #endif Vor_Bat_Full_Flag = 0; Vor_Vout_Enable = OFF; #ifdef _DEBUG_VOX printf("Vor Get Out2\r\n"); #endif } break; case VOX_NONE_IN_BOX: //空仓 VOX_CTL0 &= ~0x20; //VOR Disable 5V And Enable VOR ADT Vor_Output_Debounce = 0; Vor_Vout_Enable = OFF; /* Loadon状态位存在,则说明耳机入仓,开启后续充电流程。*/ if( CHIP_STA1 & 0x80 ) { if( gBoost_Prepared_Flag ) { Vor_State = VOX_GET_INTO_BOX; #if DISCHARGE_ENABLE BST_EN = 1; //Boost Enable;异常时由硬件主动关闭。 #endif } #if LED_188 Vor_GetInto_Box_Flag = 1; #endif #ifdef _DEBUG_VOX printf("VOR_INTO_BOX\r\n"); #endif } break; default: break; } } else //Boost保护后,VOX恢复到最初状态。 { Vor_State = VOX_NONE_IN_BOX; #if LED_188 Vor_GetInto_Box_Flag = 0; #endif Vor_Vout_Enable = OFF; VOX_CTL0 &= ~0x20; //VOR Disable 5V And Enable VOR ADT } } } #endif