640 lines
17 KiB
C
640 lines
17 KiB
C
/*
|
||
******************************************************************************
|
||
*
|
||
* @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"
|
||
#if VOX_ENABLE
|
||
|
||
/******************************************************************************\
|
||
Macro definitions
|
||
\******************************************************************************/
|
||
#define VOX_IOFF_DET_DEBOUNCE 40 //Vox Ioff检测延时4s,为了保证耳机端初始化完成,开始抽电流
|
||
|
||
#define VOX_LOADON_DET_DEBOUNCE 2
|
||
|
||
#define T10MIN_DEBOUNCE 150 //10分钟定时,4s一次。150
|
||
/******************************************************************************\
|
||
Variables definitions
|
||
\******************************************************************************/
|
||
|
||
bit gVor_Recharge_Irq_Flag = 0; //耳机复充中断标志位
|
||
bit gVol_Recharge_Irq_Flag = 0;
|
||
|
||
bit gVor_Charge_Normal_Flag = 0; //开启Vout后,debounce一段时间不存在IOFF标志,则说明已正常充电,耳机电池不是锂保或充满状态。
|
||
bit gVol_Charge_Normal_Flag = 0;
|
||
|
||
bit gVor_Output_Short_Irq_Flag = 0;
|
||
bit gVol_Output_Short_Irq_Flag = 0;
|
||
uint8_t Vol_Output_Short_Debounce = 0;
|
||
uint8_t Vor_Output_Short_Debounce = 0;
|
||
|
||
Vox_State_e Vol_State = VOX_NONE_IN_BOX;
|
||
|
||
uint8_t Vol_Loadon_Det_Debounce = 0;
|
||
uint8_t Vol_Ioff_Det_Debounce = 0;
|
||
uint8_t Vol_LiPro_Det_Debounce = 0;
|
||
bit Vol_LiPro_Flag = 0;
|
||
|
||
bit Vol_Bat_Full_Flag = 0;
|
||
bit gVol_Take_Out_Flag = 0;
|
||
|
||
Vox_State_e Vor_State = VOX_NONE_IN_BOX;
|
||
|
||
uint8_t Vor_Loadon_Det_Debounce = 0;
|
||
uint8_t Vor_Ioff_Det_Debounce = 0;
|
||
uint8_t Vor_LiPro_Det_Debounce = 0;
|
||
bit Vor_LiPro_Flag = 0;
|
||
|
||
bit Vor_Bat_Full_Flag = 0;
|
||
bit gVor_Take_Out_Flag = 0; //耳机出仓检测标志位
|
||
|
||
bit Vor_Vout_Enable = OFF; //OFF:用于BOOST开启后延时开启VOUT输出;TRUE:用于判断是正常充电还是IOFF充电。
|
||
bit Vol_Vout_Enable = OFF;
|
||
|
||
|
||
/******************************************************************************\
|
||
Functions definitions
|
||
\******************************************************************************/
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void Vox_init(void)
|
||
*
|
||
* Description : Vox Initialization :Vox初始化函数
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void Vox_init(void)
|
||
{
|
||
#if 0
|
||
SFRADDR = VOX_CON1;
|
||
SFRDATA &= ~0x07;
|
||
SFRDATA |= 0x07; //VOX 输出限流配置(200mA) ,VOX 轻载检测电流(5mA)
|
||
|
||
|
||
SFRADDR = VOX_CON0;
|
||
SFRDATA &= ~0x03;
|
||
SFRDATA |= 0x03;
|
||
#endif
|
||
|
||
VOL_EN_Type(VOX_ADT_Mode);
|
||
VOR_EN_Type(VOX_ADT_Mode);
|
||
|
||
Vol_State = VOX_NONE_IN_BOX;
|
||
|
||
Vor_State = VOX_NONE_IN_BOX;
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* uint8_t VOL_EN_Type(VOL_Enable_Type_e VOL_Enable_Type)
|
||
*
|
||
* Description : VOL Open(EN_VO)
|
||
|
||
* Arguments :
|
||
|
||
* Returns :
|
||
|
||
* Notes :
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void VOL_EN_Type(VOX_Enable_Mode_e VOL_Enable_Mode)
|
||
{
|
||
switch(VOL_Enable_Mode)
|
||
{
|
||
case VOX_VOUT_Mode:
|
||
#ifndef BOOST_AOUT
|
||
DisCharge_Boost_Open();
|
||
#endif
|
||
VOX_CTL0 &= ~0x10; //VOL Disable 5V Charge
|
||
|
||
VOX_CTL0 |= 0x10; //VOL Enable 5V Charge
|
||
|
||
VOX_CTL0 &= ~0x05; //ADTL Disable,VOL_PU Disable
|
||
|
||
break;
|
||
|
||
case VOX_ADT_Mode:
|
||
|
||
VOX_CTL0 |= 0x01; //VOL 负载接入、存在识别功能使能,负载自动识别
|
||
|
||
VOX_CTL0 &= ~((0x01<<2)|(0x01<<4)); //VOL Pull Up,5v Discharge Off
|
||
#ifndef BOOST_AOUT
|
||
DisCharge_Boost_Close();
|
||
#endif
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void VOR_EN_Type(VOR_Enable_Type_e VOR_Enable_Type)
|
||
*
|
||
* Description : VOL Open(EN_VO)
|
||
|
||
* Arguments :
|
||
|
||
* Returns :
|
||
|
||
* Notes :
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void VOR_EN_Type(VOX_Enable_Mode_e VOR_Enable_Mode)
|
||
{
|
||
switch(VOR_Enable_Mode)
|
||
{
|
||
case VOX_VOUT_Mode:
|
||
#ifndef BOOST_AOUT
|
||
DisCharge_Boost_Open();
|
||
#endif
|
||
VOX_CTL0 &= ~0x20; //VOR Disable 5V Charge
|
||
|
||
VOX_CTL0 |= 0x20; //VOR Enable 5V Charge
|
||
|
||
VOX_CTL0 &= ~0x0A; //ADTR Disable,VOR_PU Disable
|
||
|
||
break;
|
||
case VOX_ADT_Mode:
|
||
|
||
VOX_CTL0 |= 0x02; //VOR load detect On
|
||
|
||
VOX_CTL0 &= ~((0x01<<3)|(0x01<<5)); //VOR Pull Up,5v Discharge Off
|
||
#ifndef BOOST_AOUT
|
||
DisCharge_Boost_Close();
|
||
#endif
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void Vol_Det_Machine(void)
|
||
*
|
||
* Description : Vol Detect:耳机识别。 (100ms调用周期)
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void Vol_Det_Machine(void)
|
||
{
|
||
uint8_t Vox_Mode_Type = 0;
|
||
|
||
SFRADDR = ST_VOX; //读取VOL\R 状态寄存器
|
||
Vox_Mode_Type = SFRDATA;
|
||
#ifndef BOOST_AOUT
|
||
if( gBoost_Opened_Flag ) //进行Vox Det的条件:1、Vox处于非双向通信功能;2、Boost已经开启
|
||
#endif
|
||
{
|
||
switch(Vol_State)
|
||
{
|
||
case VOX_GET_INTO_BOX: //耳机入仓
|
||
|
||
if( (Vox_Mode_Type&0x07) != 0x02 ) //1、当前已经开启了VOUT,则无需重复开启;原因:在使能VOUT前需要先关闭VOUT使能,如果连续开,会出现一段时间断开的情况。
|
||
{
|
||
VOL_EN_Type(VOX_VOUT_Mode);
|
||
}
|
||
|
||
Vol_Loadon_Det_Debounce++;
|
||
if( Vol_Loadon_Det_Debounce >= VOX_LOADON_DET_DEBOUNCE) //Vox开启VOUT输出后,debounce一段时间(200ms)后,IOFF状态消失,则说明Vox正常充电。
|
||
{
|
||
Vol_Loadon_Det_Debounce = 0;
|
||
if( !(CHIP_STA1 & 0x04) ) //耳机电池充满,Vox转入ADT模式,在ADT模式下,同时存在Loadon和IOFF状态,如果耳机端在复充条件下有拉Vox电流的功能,则同过loadin状态识别。
|
||
{
|
||
Vol_Vout_Enable = ON; //正常充电标志置ON。
|
||
Vol_Bat_Full_Flag = 0;
|
||
gVol_Take_Out_Flag = 0;
|
||
Vol_LiPro_Flag = 0;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vol Vout Normal(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
|
||
Vol_State = VOX_STAY_IN_BOX;
|
||
}
|
||
|
||
break;
|
||
|
||
case VOX_STAY_IN_BOX: //耳机在仓
|
||
|
||
if( (CHIP_STA1 & 0x24) == 0x24 ) //Vox在充电过程中出现了Loadon和IOFF同时存在的状态,则说明:1、耳机出仓;2、耳机电池充满;3、耳机电池锂保。
|
||
{
|
||
gVol_Take_Out_Flag = 1;
|
||
Vol_Ioff_Det_Debounce++;
|
||
if( Vol_Ioff_Det_Debounce >= VOX_IOFF_DET_DEBOUNCE ) //重载转轻载(耳机出仓后)需延时4s
|
||
{
|
||
Vol_Ioff_Det_Debounce = 0;
|
||
{
|
||
if( ON == Vol_Vout_Enable ) //Vox在正常充电过程中出现了IOFF状态,则说明:1、耳机出仓;2、耳机电池充满;
|
||
{
|
||
VOL_EN_Type(VOX_ADT_Mode); //Vox进入ADT模式后,观察CHIP_STA1的状态,1、无Loadon、IOFF,则说明耳机出仓;2、只有Loadon,则说明耳机在仓,耳机电池充满。
|
||
Vol_Bat_Full_Flag = 1;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vol Stay In Box.(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
else //否则,耳机电池处于锂保状态,Vout输出电流5mA,充电10分钟。1、10分钟未满,耳机电池跳出锂保状态;2、10分钟满,耳机电池仍处于锂保状态。
|
||
{
|
||
Vol_LiPro_Flag = 1; //耳机电池进入锂保状态后,不能倒数进休眠?or 需要定时唤醒进行计数?
|
||
Vol_LiPro_Det_Debounce++;
|
||
if( Vol_LiPro_Det_Debounce >= T10MIN_DEBOUNCE )
|
||
{
|
||
Vol_LiPro_Det_Debounce = 0;
|
||
Vol_State = VOX_GET_OUTPUT_BOX; //2、10分钟满,耳机电池仍处于锂保状态。则Vox转入出仓状态
|
||
Vol_Vout_Enable = OFF;
|
||
Vol_LiPro_Flag = 0;
|
||
}
|
||
#ifdef LED_DISPLAY
|
||
LED_R_KEEP_FLASHING(500);
|
||
#endif
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vol Go In LiPro.(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
if( (CHIP_STA1 & 0x24) == 0x20 ) //观察CHIP_STA1的状态,无IOFF有Loadon,说明:1、耳机出仓后4s内,耳机再次入仓;2、10分钟未满,耳机电池退出锂保状态,进入正常充电;
|
||
{
|
||
Vol_Ioff_Det_Debounce = 0;
|
||
Vol_LiPro_Det_Debounce = 0;
|
||
#ifdef LED_DISPLAY
|
||
LED_R_ON();
|
||
#endif
|
||
if( 1 == gVol_Take_Out_Flag ) //耳机再次入仓,则继续充电。
|
||
{
|
||
Vol_State = VOX_GET_INTO_BOX;
|
||
gVol_Take_Out_Flag = 0;
|
||
Vol_LiPro_Flag = 0;
|
||
Vol_Loadon_Det_Debounce = 0;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vol Get In Again(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
}
|
||
else
|
||
if( (CHIP_STA1 & 0x24) == 0x04 ) //观察CHIP_STA1的状态,1、无Loadon有IOFF,则说明耳机已出仓;
|
||
{
|
||
Vol_State = VOX_GET_OUTPUT_BOX;
|
||
Vol_Vout_Enable = OFF;
|
||
Vol_Bat_Full_Flag = 0;
|
||
gVol_Take_Out_Flag = 0;
|
||
#ifdef LED_DISPLAY
|
||
LED_R_FLASH(200,5);
|
||
#endif
|
||
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vol Get Out(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
|
||
break;
|
||
|
||
case VOX_GET_OUTPUT_BOX: //耳机出仓,Vox进入自动识别模式。存在两种情况:1、Loadon标志消失,则耳机出仓;2、Loadon、IOFF标志同时存在。
|
||
//则说明:1、耳机电池经过10分钟的5mA充电仍未解除锂保或耳机电池失效;2、耳机电池充满。
|
||
VOL_EN_Type(VOX_ADT_Mode);
|
||
|
||
if( !(CHIP_STA1 & 0x20) ) //1、Loadon标志消失,则耳机出仓;Vox转入空仓状态;等待耳机重新入仓。2、Loadon、IOFF标志同时存在,则说明耳机电池经过10分钟的5mA充电仍未解除锂保或耳机电池失效。则需重新插拔耳机?????
|
||
{
|
||
Vol_State = VOX_NONE_IN_BOX;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vol Output Box(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
|
||
break;
|
||
|
||
case VOX_NONE_IN_BOX: //空仓
|
||
|
||
VOL_EN_Type(VOX_ADT_Mode);
|
||
|
||
Vol_Loadon_Det_Debounce = 0;
|
||
|
||
if(CHIP_STA1 & 0x20)
|
||
{
|
||
Vol_State = VOX_GET_INTO_BOX;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vol VOX_GET_INTO_BOX (line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Vol_State = VOX_NONE_IN_BOX;
|
||
}
|
||
|
||
#if 0
|
||
if(gVol_Output_Short_Irq_Flag)
|
||
{
|
||
Vol_Output_Short_Debounce++;
|
||
if(Vol_Output_Short_Debounce >= 5) //Vor短路保护100ms后,重新开启ADT
|
||
{
|
||
Vol_Output_Short_Debounce = 0;
|
||
|
||
gVol_Output_Short_Irq_Flag = 0;
|
||
Vol_State = VOX_NONE_IN_BOX;
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void Vor_Det_Machine(void)
|
||
*
|
||
* Description : Vor Detect:耳机识别。 (100ms调用周期)
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void Vor_Det_Machine(void)
|
||
{
|
||
uint8_t Vox_Mode_Type = 0;
|
||
|
||
SFRADDR = ST_VOX; //读取VOL\R 状态寄存器
|
||
Vox_Mode_Type = SFRDATA;
|
||
#ifndef BOOST_AOUT
|
||
if( gBoost_Opened_Flag ) //进行Vox Det的条件:1、Vox处于非双向通信功能;2、Boost已经开启
|
||
#endif
|
||
{
|
||
switch(Vor_State)
|
||
{
|
||
case VOX_GET_INTO_BOX: //耳机入仓
|
||
|
||
if( (Vox_Mode_Type&0x70) != 0x20 ) //1、当前已经开启了VOUT,则无需重复开启;原因:在使能VOUT前需要先关闭VOUT使能,如果连续开,会出现一段时间断开的情况。
|
||
{
|
||
VOR_EN_Type(VOX_VOUT_Mode);
|
||
}
|
||
|
||
Vor_Loadon_Det_Debounce++;
|
||
if( Vor_Loadon_Det_Debounce >= VOX_LOADON_DET_DEBOUNCE) //Vox开启VOUT输出后,debounce一段时间后,IOFF状态消失,则说明Vox正常充电。
|
||
{
|
||
Vor_Loadon_Det_Debounce = 0;
|
||
if( !(CHIP_STA1 & 0x08) ) //耳机电池充满,Vox转入ADT模式,在ADT模式下,同时存在Loadon和IOFF状态,如果耳机端在复充条件下有拉Vox电流的功能,则同过loadin状态识别。
|
||
{
|
||
Vor_Vout_Enable = ON;
|
||
Vor_Bat_Full_Flag = 0;
|
||
gVor_Take_Out_Flag = 0;
|
||
Vor_LiPro_Flag = 0;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vor Vout Normal(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
|
||
Vor_State = VOX_STAY_IN_BOX;
|
||
}
|
||
|
||
break;
|
||
|
||
case VOX_STAY_IN_BOX: //耳机在仓
|
||
|
||
if( (CHIP_STA1 & 0x88) == 0x88 ) //Vox在充电过程中出现了Loadon和IOFF同时存在的状态,则说明:1、耳机出仓;2、耳机电池充满;3、耳机电池锂保。
|
||
{
|
||
gVor_Take_Out_Flag = 1;
|
||
Vor_Ioff_Det_Debounce++;
|
||
if( Vor_Ioff_Det_Debounce >= VOX_IOFF_DET_DEBOUNCE ) //重载转轻载(耳机出仓后)需延时4s
|
||
{
|
||
Vor_Ioff_Det_Debounce = 0;
|
||
|
||
if( ON == Vor_Vout_Enable ) //Vox在正常充电过程中出现了IOFF状态,则说明:1、耳机出仓;2、耳机电池充满;
|
||
{
|
||
VOR_EN_Type(VOX_ADT_Mode); //Vox进入ADT模式后,观察CHIP_STA1的状态,1、无Loadon、IOFF,则说明耳机出仓;2、只有Loadon,则说明耳机在仓,耳机电池充满。
|
||
Vor_Bat_Full_Flag = 1;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vor Stay In Box.(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
else //否则,耳机电池处于锂保状态,Vout输出电流5mA,充电10分钟。1、10分钟未满,耳机电池跳出锂保状态;2、10分钟满,耳机电池仍处于锂保状态。
|
||
{
|
||
Vor_LiPro_Flag = 1; //耳机电池进入锂保状态后,不能倒数进休眠?
|
||
Vor_LiPro_Det_Debounce++;
|
||
if( Vor_LiPro_Det_Debounce >= T10MIN_DEBOUNCE )
|
||
{
|
||
Vor_LiPro_Det_Debounce = 0;
|
||
Vor_State = VOX_GET_OUTPUT_BOX; //2、10分钟满,耳机电池仍处于锂保状态。则Vox转入出仓状态
|
||
Vor_Vout_Enable = OFF;
|
||
Vor_LiPro_Flag = 0;
|
||
}
|
||
#ifdef LED_DISPLAY
|
||
LED_G_KEEP_FLASHING(500);
|
||
#endif
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vor Go In LiPro.(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
}
|
||
}
|
||
else
|
||
if( (CHIP_STA1 & 0x88) == 0x80 ) //观察CHIP_STA1的状态,无IOFF有Loadon,说明:1、耳机出仓后4s内,耳机再次入仓;2、10分钟未满,耳机电池退出锂保状态,进入正常充电;
|
||
{
|
||
Vor_Ioff_Det_Debounce = 0;
|
||
Vor_LiPro_Det_Debounce = 0;
|
||
#ifdef LED_DISPLAY
|
||
LED_G_ON();
|
||
#endif
|
||
if( 1 == gVor_Take_Out_Flag ) //耳机再次入仓,则继续充电。
|
||
{
|
||
Vor_State = VOX_GET_INTO_BOX;
|
||
gVor_Take_Out_Flag = 0;
|
||
Vor_LiPro_Flag = 0;
|
||
Vor_Loadon_Det_Debounce = 0;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vor Get In Again(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
}
|
||
else
|
||
if( (CHIP_STA1 & 0x88) == 0x08 ) //观察CHIP_STA1的状态,1、无Loadon有IOFF,则说明耳机已出仓;
|
||
{
|
||
Vor_State = VOX_GET_OUTPUT_BOX;
|
||
Vor_Vout_Enable = OFF;
|
||
Vor_Bat_Full_Flag = 0;
|
||
gVor_Take_Out_Flag = 0;
|
||
#ifdef LED_DISPLAY
|
||
// LED_G_FLASH(5);
|
||
LED_G_FLASH(200,5);
|
||
#endif
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vor Get Out(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
|
||
break;
|
||
|
||
case VOX_GET_OUTPUT_BOX: //耳机出仓,Vox进入自动识别模式。存在两种情况:1、Loadon标志消失,则耳机出仓;2、Loadon、IOFF标志同时存在。
|
||
//则说明:1、耳机电池经过10分钟的5mA充电仍未解除锂保或耳机电池失效;2、耳机电池充满。
|
||
VOR_EN_Type(VOX_ADT_Mode);
|
||
|
||
// if( !(CHIP_STA1 & 0x80) ) //1、Loadon标志消失,则耳机出仓;Vox转入空仓状态;等待耳机重新入仓。2、Loadon、IOFF标志同时存在,则说明耳机电池经过10分钟的5mA充电仍未解除锂保或耳机电池失效。则需重新插拔耳机?????
|
||
{
|
||
Vor_State = VOX_NONE_IN_BOX;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vor Output Box(line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
|
||
break;
|
||
|
||
case VOX_NONE_IN_BOX: //空仓
|
||
|
||
VOR_EN_Type(VOX_ADT_Mode);
|
||
|
||
Vor_Loadon_Det_Debounce = 0;
|
||
|
||
/* Loadon状态位存在、复充标志置1,则说明耳机入仓,开启后续充电流程。*/
|
||
if(CHIP_STA1 & 0x80)
|
||
{
|
||
Vor_State = VOX_GET_INTO_BOX;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Vor VOX_GET_INTO_BOX (line:%d)!\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Vor_State = VOX_NONE_IN_BOX;
|
||
}
|
||
|
||
#if 0
|
||
/*VOX短路保护,VOX短路保护后,重新开启VOX为ADT模式,Vox一直处于Hiccup模式。*/
|
||
if(gVor_Output_Short_Irq_Flag)
|
||
{
|
||
Vor_Output_Short_Debounce++;
|
||
if(Vor_Output_Short_Debounce > 5) //Vor短路保护100ms后,重新开启ADT
|
||
{
|
||
Vor_Output_Short_Debounce = 0;
|
||
|
||
gVor_Output_Short_Irq_Flag = 0;
|
||
Vor_State = VOX_NONE_IN_BOX;
|
||
}
|
||
}
|
||
|
||
#endif
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void EX2_isr(void) interrupt Interrupt_Vector_IE2
|
||
*
|
||
* Description : System External Intterupt 2
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
#if 1
|
||
void EX2_isr(void) interrupt Interrupt_Vector_IE2
|
||
{
|
||
uint8_t IRQ3_Flag = 0;
|
||
uint8_t IRQ4_Flag = 0;
|
||
|
||
IRQ3_Flag = IRQ_FLAG3;
|
||
IRQ_FLAG3 = IRQ3_Flag;
|
||
|
||
IRQ4_Flag = IRQ_FLAG4;
|
||
IRQ_FLAG4 = IRQ4_Flag;
|
||
|
||
#if 0
|
||
if(IRQ3_Flag & 0x0C) //vol loadon interrupt flag
|
||
{
|
||
gIrq_Event_Type |= VOR_LOADON_IRQ_EVENT;
|
||
}
|
||
|
||
if(IRQ3_Flag & 0x30) //vor loadon interrupt flag
|
||
{
|
||
gIrq_Event_Type |= VOL_LOADON_IRQ_EVENT;
|
||
}
|
||
|
||
if(IRQ4_Flag & 0xC0) //VOR IOFF Edge Interrupt Flag
|
||
{
|
||
gIrq_Event_Type |= VOR_IOFF_IRQ_EVENT;
|
||
}
|
||
|
||
if(IRQ4_Flag & 0x30) //VOL IOFF Edge Interrupt Flag
|
||
{
|
||
gIrq_Event_Type |= VOL_IOFF_IRQ_EVENT;
|
||
}
|
||
#else
|
||
|
||
if(IRQ3_Flag & 0x3C)
|
||
{
|
||
gIrq_Event_Type |= VOX_LOADON_IRQ_EVENT; //vox loadon interrupt flag
|
||
}
|
||
|
||
if(IRQ4_Flag & 0xF0) //VOx IOFF Edge Interrupt Flag
|
||
{
|
||
gIrq_Event_Type |= VOX_IOFF_IRQ_EVENT;
|
||
}
|
||
|
||
#endif
|
||
|
||
#if SLEEP_ENABLE
|
||
if(!Enter_Sleep_Cnt_Restart_Flag)
|
||
{
|
||
Enter_Sleep_Cnt_Restart_Flag = 1;
|
||
}
|
||
#endif
|
||
}
|
||
#endif
|
||
#endif
|