434 lines
9.8 KiB
C
434 lines
9.8 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"
|
||
#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
|
||
{
|
||
if( !Vol_Bat_Low_Flag )
|
||
{
|
||
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;
|
||
#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信号,则说明有耳机入仓。
|
||
{
|
||
Vol_State = VOX_GET_INTO_BOX;
|
||
|
||
Vol_Bat_Low_Flag = 0;
|
||
#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;
|
||
|
||
Vol_GetInto_Box_Flag = 0;
|
||
|
||
Vol_Bat_Low_Flag = 1;
|
||
|
||
//Vol_GetInto_Box_Flag = 1;
|
||
|
||
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
|
||
{
|
||
if( !Vor_Bat_Low_Flag )
|
||
{
|
||
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;
|
||
#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 )
|
||
{
|
||
Vor_State = VOX_GET_INTO_BOX;
|
||
|
||
Vor_Bat_Low_Flag = 0;
|
||
|
||
#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;
|
||
|
||
Vor_GetInto_Box_Flag = 0;
|
||
|
||
Vor_Bat_Low_Flag = 1;
|
||
|
||
//Vor_GetInto_Box_Flag = 1;
|
||
|
||
Vor_Vout_Enable = OFF;
|
||
|
||
VOX_CTL0 &= ~0x20; //VOR Disable 5V And Enable VOR ADT
|
||
}
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|