Both_Way_Comm_SY8833/TP3310_Demo.si4project/Backup/vox_module(3243).c

640 lines
17 KiB
C
Raw Permalink 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"
#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