SY883x_For_WEIHUA_W13/UsrSrc/vox/vox_module.c

480 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
******************************************************************************
*
* @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;
#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
\******************************************************************************/
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;
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;
uint8_t Vol_Output_Short_Debounce = 0;
uint8_t Vor_Output_Short_Debounce = 0;
bit Vol_Bat_Full_Flag = 0;
bit Vor_Bat_Full_Flag = 0;
/******************************************************************************\
Functions definitions
\******************************************************************************/
/*
*******************************************************************************
* void Vox_init(void)
*
* Description : Vox Initialization :Vox初始化函数
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
#if 0
void Vox_init(void)
{
VOX_CTL0 = 0xC3; //VOX 负载接入、存在识别功能使能负载自动识别。打开Vox vds钳压环使能主要用于VOX 5V输出
/*
SFRADDR = VOX_CON0; //设置VOX输出500mA负载识别电流2.5uA。
SFRDATA &= 0xE0;
SFRDATA |= (VOX_IOUT_500MA << 3) | VOX_ADT_Cur_2_5UA;
*/
Vol_State = VOX_NONE_IN_BOX;
Vor_State = VOX_NONE_IN_BOX;
}
#endif
#if 0
/*
*******************************************************************************
* 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)
{
if(VOL_Enable_Mode == VOX_VOUT_Mode )
{
VOX_CTL0 &= ~0x10; //VOL Disable 5V And Enable VOR ADT
VOX_CTL0 |= 0x10; //VOL Enable 5V
}
else
{
VOX_CTL0 &= ~0x10; //VOL 5v Off
}
}
/*
*******************************************************************************
* 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)
{
if(VOR_Enable_Mode == VOX_VOUT_Mode )
{
VOX_CTL0 &= ~0x20; //VOR Disable 5V And Enable VOR ADT
VOX_CTL0 |= 0x20; //VOR Enable 5V
}
else
{
VOX_CTL0 &= ~0x20; //VOR 5v Off
}
}
#endif
/*
*******************************************************************************
* void Vol_Det_Machine(void)
*
* Description : Vol Detect:耳机识别。 (100ms调用周期)
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
#if DISPLAY_6PIN_188
bit Vol_Outbox_Disp_Flag = 0;
bit Vol_Intobox_Disp_Flag = 0;
#endif
void Vol_Det_Machine(void)
{
if( gBoost_Prepared_Flag )
{
switch( Vol_State )
{
case VOX_GET_INTO_BOX: //耳机入仓
if( (VOX_CTL0 & 0x10) != 0x10 ) //1、当前已经开启了VOUT则无需重复开启原因在使能VOUT前需要先关闭VOUT使能如果连续开会出现一段时间断开的情况。
{
VOX_CTL0 &= ~0x10; //VOL Disable 5V And Enable VOR ADT
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 DISPLAY_6PIN_188
if( Vol_Intobox_Disp_Flag ) //拔出左耳,左耳对应的图标闪一次
{
Vol_Intobox_Disp_Flag = 0;
Vol_GetOut_Box_Flag = 1; //左耳出盒标志置1
//LED_On_Timer = 0;
Vol_Outbox_Disp_Flag = 1;
}
#endif
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、耳机电池充满
{
VOX_CTL0 &= ~0x10; //VOL Disable 5V And Enable VOR ADT
Vol_Bat_Full_Flag = 1;
#ifdef _DEBUG_VOX
printf("Vol Get Out\r\n");
#endif
}
}
}
else
if( (CHIP_STA1 & 0x24) == 0x20 ) //观察CHIP_STA1的状态无IOFF有Loadon说明1、耳机出仓后4s内耳机再次入仓2、10分钟未满耳机电池退出锂保状态进入正常充电
{
Vol_Ioff_Det_Debounce = 0;
Vol_Vout_Enable = ON; //正常充电标志置ON。
#if DISPLAY_6PIN_188
if( Vol_Outbox_Disp_Flag ) //左耳4s内再次入盒左耳对应的图标闪一次
{
Vol_Outbox_Disp_Flag = 0;
Vol_GetOut_Box_Flag = 0;
Disp_Vol_Lev = Disp_Vor_Lev;
//LED_On_Timer = 0;
}
Vol_Intobox_Disp_Flag = 1;
#endif
if( Vol_Bat_Full_Flag ) //耳机充满在ADT模式下只有Loadon状态则说明耳机充满。
{
Vol_Vout_Enable = OFF;
#if DISPLAY_6PIN_188
LED_On_Timer = 0;
#endif
#ifdef _DEBUG_VOX
printf("Vol Bat Full\r\n");
#endif
}
}
else
if( !(CHIP_STA1 & 0x24) ) //CHIP_STA1无loadon和ioff状态则说明耳机出仓了。
{
Vol_State = VOX_NONE_IN_BOX;
#if DISPLAY_6PIN_188
Vol_GetInto_Box_Flag = 0;
#endif
Vol_Bat_Full_Flag = 0;
}
break;
case VOX_NONE_IN_BOX: //空仓
//VOL_EN_Type(VOX_ADT_Mode);
VOX_CTL0 &= ~0x10; //VOL Disable 5V And Enable VOR ADT
//Vol_Loadon_Det_Debounce = 0;
Vol_Ioff_Det_Debounce = 0;
Vol_Vout_Enable = OFF;
if( CHIP_STA1 & 0x20 ) //ADT模式下出现Loadon信号则说明有耳机入仓。
{
Vol_State = VOX_GET_INTO_BOX;
#if DISCHARGE_ENABLE
BST_EN = 1; //Boost Enable异常时由硬件主动关闭。
#endif
#if DISPLAY_6PIN_188
Vol_GetInto_Box_Flag = 1;
Disp_Vol_Lev = Disp_Vor_Lev;
//LED_On_Timer = 0;
#endif
#ifdef _DEBUG_VOX
printf("VO_INTO_BOX\r\n");
#endif
}
break;
default:
break;
}
}
else //Boost保护后VOX恢复到最初状态。
{
Vol_State = VOX_NONE_IN_BOX;
}
/*Vol 过流保护每隔200ms打嗝一次*/
if( IRQ_FLAG0 & 0x04 )
{
Vol_Output_Short_Debounce++;
if( Vol_Output_Short_Debounce >= 2 ) //Vor短路保护200ms后重新开启ADT
{
Vol_Output_Short_Debounce = 0;
IRQ_FLAG0 = 0x04;
Vol_State = VOX_NONE_IN_BOX;
}
}
}
/*
*******************************************************************************
* void Vor_Det_Machine(void)
*
* Description : Vor Detect:耳机识别。 (100ms调用周期)
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
#if DISPLAY_6PIN_188
bit Vor_Outbox_Disp_Flag = 0;
bit Vor_Intobox_Disp_Flag = 0;
#endif
void Vor_Det_Machine(void)
{
if( gBoost_Prepared_Flag )
{
switch( Vor_State )
{
case VOX_GET_INTO_BOX: //耳机入仓
if( (VOX_CTL0 & 0x20) != 0x20 ) //1、当前已经开启了VOUT则无需重复开启原因在使能VOUT前需要先关闭VOUT使能如果连续开会出现一段时间断开的情况。
{
VOX_CTL0 &= ~0x20; //VOR Disable 5V And Enable VOR ADT
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 DISPLAY_6PIN_188
if( Vor_Intobox_Disp_Flag ) //
{
Vor_Intobox_Disp_Flag = 0;
Vor_GetOut_Box_Flag = 1; //右耳出盒标志置1
//LED_On_Timer = 0;
Vor_Outbox_Disp_Flag = 1;
}
#endif
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、耳机电池充满
{
VOX_CTL0 &= ~0x20; //VOR Disable 5V And Enable VOR ADT
Vor_Bat_Full_Flag = 1;
#ifdef _DEBUG_VOX
printf("Vor Get Out\r\n");
#endif
}
}
}
else
if( (CHIP_STA1 & 0x88) == 0x80 ) //观察CHIP_STA1的状态无IOFF有Loadon说明1、耳机出仓后4s内耳机再次入仓2、10分钟未满耳机电池退出锂保状态进入正常充电3、耳机锂保满10分钟。
{
Vor_Ioff_Det_Debounce = 0;
Vor_Vout_Enable = ON;
#if DISPLAY_6PIN_188
if( Vor_Outbox_Disp_Flag ) //左耳4s内再次入盒左耳对应的图标闪一次
{
Vor_Outbox_Disp_Flag = 0;
Vor_GetOut_Box_Flag = 0;
Disp_Vor_Lev = Disp_Vol_Lev;
}
Vor_Intobox_Disp_Flag = 1;
#endif
if( Vor_Bat_Full_Flag )
{
Vor_Vout_Enable = OFF;
#if DISPLAY_6PIN_188
LED_On_Timer = 0;
#endif
#ifdef _DEBUG_VOX
printf("Vor Bat Full\r\n");
#endif
}
}
else
if( !(CHIP_STA1 & 0x88) ) //CHIP_STA1无loadon和ioff状态则说明耳机出仓了。
{
Vor_State = VOX_NONE_IN_BOX;
#if DISPLAY_6PIN_188
Vor_GetInto_Box_Flag = 0;
#endif
Vor_Bat_Full_Flag = 0;
}
break;
case VOX_NONE_IN_BOX: //空仓
VOX_CTL0 &= ~0x20; //VOR Disable 5V And Enable VOR ADT
Vor_Ioff_Det_Debounce = 0;
Vor_Vout_Enable = OFF;
/* Loadon状态位存在则说明耳机入仓开启后续充电流程。*/
if( CHIP_STA1 & 0x80 )
{
Vor_State = VOX_GET_INTO_BOX;
#if DISCHARGE_ENABLE
BST_EN = 1; //Boost Enable异常时由硬件主动关闭。
#endif
#if DISPLAY_6PIN_188
Vor_GetInto_Box_Flag = 1;
Disp_Vor_Lev = Disp_Vol_Lev;
#endif
#ifdef _DEBUG_VOX
printf("VOR_INTO_BOX\r\n");
#endif
}
break;
default:
break;
}
}
else //Boost保护后VOX恢复到最初状态。
{
Vol_State = VOX_NONE_IN_BOX;
}
/*Vor 过流保护(读中断标志位)每隔200ms打嗝一次*/
if( IRQ_FLAG0 & 0x08 )
{
Vor_Output_Short_Debounce++;
if( Vor_Output_Short_Debounce >= 2 ) //Vor短路保护200ms后重新开启ADT
{
Vor_Output_Short_Debounce = 0;
IRQ_FLAG0 = 0x08;
Vor_State = VOX_NONE_IN_BOX;
}
}
}
#endif