SY883x_For_Clients_ROCK-A/UsrSrc/vox/vox_module.c

413 lines
8.7 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 "bat.h"
#include "hall.h"
#include "key.h"
#include "sys_tim.h"
#include "adc.h"
#include "gpio_comm.h"
#include "userapp.h"
bit Vox_Vout_Enable = OFF; //Vox功率输出标志位
bit Earphone_Chg_Flag = 0; //耳机出入盒标志位
uint8_t Vox_TX_Timer = 0; //VOX发送指令持续时间计数,在Hall_Handler检测中清0.
#if VOX_ENABLE
/******************************************************************************\
Macro definitions
\******************************************************************************/
/*100ms调用周期*/
#define VOX_OUTPUT_SHORT_CNT 2
#define VOX_LOW_BAT_CNT 25 //关盖前盒子低电保护Vox 5V持续2.5s
#define VOX_VOUT_5V_LEAST_CNT 250
#define VOX_VOUT_5V_DEBOUNCE 3 //开盖前耳机充满或盒子电压低于3.582V则VOX 5V持续150ms
#define VOX_ADT_HOLD_CNT 3
#define Vox_TX_Pattern_Cnt 3
#define BOOST_VOUT_MAX 2 //跟随充Boost输出电压上限值0:4.6V,1:4.7V,2:4.8V,3:5.05V.
/******************************************************************************\
Variables definitions
\******************************************************************************/
uint8_t Vox_Vol_Hold_Timer = 0;
bit Cover_Close_Flag = 0;
bit Cover_Open_Flag = 0;
bit Vox_Vout_5V_Flag = 0;
uint8_t Vox_Output_Short_Debounce = 0;
bit Get_CHIP_STA1_Flag = 0;
bit Pattern_TX_Over_Flag = 0;
uint8_t CHIP_STA1_BK = 0;
#if VOX_FOLLOW_CHG
bit Boost_VoxVout_Follow_Flag = 0;
int8 Boost_Vout_Value = 0;
bit Boost_Up_Flag = 0;
#endif
/******************************************************************************\
Functions definitions
\******************************************************************************/
/*
*******************************************************************************
* void VOX_EN_Type(VOR_Enable_Type_e VOR_Enable_Type)
*
* Description : VOL Open(EN_VO)
* Arguments :
* Returns :
* Notes :
*
*******************************************************************************
*/
void VOX_EN_Type(VOX_Enable_Mode_e VOX_Enable_Mode)
{
COM_CTRL = ON;
if( VOX_Enable_Mode == VOX_VOUT_Mode)
{
VOX_CTL0 &= ~0x30; //VOX Disable 5V And Disable VOX ADT
VOX_CTL0 |= 0x30; //VOX Enable 5V
}
else
{
VOX_CTL0 &= ~0x30; //VOX 5v Off
}
}
/*
*******************************************************************************
* void Vox_Det_Machine(void)
*
* Description : Vox Detect:耳机识别。 (100ms调用周期)
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void Vox_Det_Machine(void)
{
/*Vox 过流保护两只耳机都每隔200ms打嗝一次*/
if( IRQ_FLAG0 & 0x0C )
{
Vox_Output_Short_Debounce++;
if( Vox_Output_Short_Debounce >= VOX_OUTPUT_SHORT_CNT ) //Vox短路保护200ms后重新开启Vox 5V。
{
Vox_Output_Short_Debounce = 0;
IRQ_FLAG0 = 0x0C;
VOX_EN_Type(VOX_VOUT_Mode);
return;
}
}
if( CoverEvent_Flg ) //Hall事件触发。
{
if( gBoost_Prepared_Flag )
{
COM_CTRL = ON;
/*Set P01 As Output*/
SFRADDR = P0_OE;
SFRDATA |= 0x02;
if( CoverStatus == CLOSE ) //1、关盖关闭COM_CTRL显示灯效。无需查询Loadon、IOFF状态无论耳机是否在仓Vox 5V输出。
{
if( !BST_EN )
{
#if VOX_FOLLOW_CHG
/*跟随充逻辑*/
SFRADDR = BST_CTL0; //Boost 5V输出
SFRDATA |= 0x03;
Boost_Vout_Value = 0x03;
Boost_Up_Flag = 0;
SFRADDR = VOX_CON0; //IOFF选择高电流档10/15/20/25mA
SFRDATA |= 0x20;
SFRADDR = VOX_CON2;
SFRDATA &= ~0xC0;
SFRDATA |= 0x80; //IOFF 20mA
#endif
BST_EN = 1; //Boost Enable异常时由硬件主动关闭。开启Boost开启Vox 5v会在开启Boost之后100ms延时
return;
}
Cover_Close_Flag = 1;
CoverEvent_Flg = 0;
Vox_Vout_Enable = ON;
Cover_Open_Flag = 0;
Vox_Vol_Hold_Timer = 0; //关盖清0开盖使用
#if VOX_FOLLOW_CHG
Boost_VoxVout_Follow_Flag = 1;
#endif
VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V开启VOX端的NMOS
}
else //2、开盖处理调整Vox电压pattern tx 循环3次。
{
Cover_Close_Flag = 0;
if( Vox_Vout_Enable == OFF ) //开盖前耳机充满或盒子电池低电则开盖后VOX 5V输出持续150ms
{
BST_EN = 1;
VOX_CTL0 |= 0x30; //打开VOX负端
if( Vox_Vol_Hold_Timer < VOX_VOUT_5V_DEBOUNCE )
{
Vox_Vol_Hold_Timer++;
return;
}
VOX_CTL0 &= ~0x30; //VOX 5v Off
BST_EN = 0;
}
COM_CTRL = OFF;
PATTERN_TX = ON;
Vox_Vol_Hold_Timer = 0;
Cover_Open_Flag = 1;
Get_CHIP_STA1_Flag = 0;
CoverEvent_Flg = 0;
Pattern_TX_Data = ( (bat_level*10) << 8) | FW_VER2; //获取盒子电量和软件版本号
}
}
else
{
VOX_EN_Type(VOX_ADT_Mode);
}
}
/* 发送开盖指令*/
if( Cover_Open_Flag ) /*开盖后每隔100ms发送一次开盖指令连发3次之后Vox转入adt模式等待耳机出入盒并显示相应的灯效。*/
{
if( Vox_Vol_Hold_Timer < VOX_ADT_HOLD_CNT ) //开盖后Vbat(Adt模式)持续300ms后发送pattern。
{
Vox_Vol_Hold_Timer++;
return;
}
if( Vox_TX_Timer < Vox_TX_Pattern_Cnt )
{
BST_EN = 1;
PATTERN_TX = OFF;
VOX_CTL0 |= 0x30; //打开VOX负端MOS
Pattern_TX_Start = 1;
Vox_TX_Timer++;
Pattern_TX_Over_Flag = 1;
COM_CTRL = ON;
}
else
{
if( Pattern_TX_Over_Flag )
{
Pattern_TX_Over_Flag = 0;
BST_EN = 0;
/*Set P01 As Float*/
SFRADDR = P0_OE; //P01设置成Float模式节省功耗
SFRDATA &= ~0x02;
Vox_Vout_Enable = OFF;
VOX_EN_Type(VOX_ADT_Mode);
}
else
{
if( !Get_CHIP_STA1_Flag )
{
Get_CHIP_STA1_Flag = 1;
CHIP_STA1_BK = CHIP_STA1 & 0xA0; //获取耳机loadon状态
}
}
if( Get_CHIP_STA1_Flag )
{
/*耳机出入盒判断*/
if( CHIP_STA1_BK != (CHIP_STA1 & 0xA0) ) //查询耳机loadon状态loadon状态改变则说明有耳机出入盒。
{
Earphone_Chg_Flag = 1;
LED_On_Timer = 0;
CHIP_STA1_BK = CHIP_STA1 & 0xA0;
}
}
}
}
if( Cover_Close_Flag )
{
/*跟随充说明:
1、关盖后初始化Boost输出5VIOFF 20mA
*/
#if VOX_FOLLOW_CHG
if( Boost_VoxVout_Follow_Flag )
{
if ( CHIP_STA1 & 0x0C ) //是否存在IOFF标志存在则Boost上升一个step否则Boost下降一个step。
{
Boost_Vout_Value += 1; //Boost 输出上升一个step
Boost_Up_Flag = 1;
if( Boost_Vout_Value >= BOOST_VOUT_MAX ) //Boost输出达到电压上限值则结束跟随充。
{
Boost_Vout_Value = BOOST_VOUT_MAX;
Boost_VoxVout_Follow_Flag = 0;
SFRADDR = VOX_CON0; //IOFF选择低电流档2/3/4/5mA
SFRDATA &= ~0x20;
SFRADDR = VOX_CON2;
SFRDATA &= ~0xC0;
SFRDATA |= 0x40; //IOFF 3mA
}
}
else
{
if( !Boost_Up_Flag ) //只在初始化找最低轻载电压时执行
{
Boost_Vout_Value -= 1; //Boost 输出下降一个step
if( Boost_Vout_Value <= 0 )
{
Boost_Vout_Value = 0;
}
}
}
SFRADDR = BST_CTL0; //Boost 输出
SFRDATA |= Boost_Vout_Value;
return;
}
#endif
if( ( (CHIP_STA1 & 0xAC) == 0xAC ) || F_batlevel_protect ) //耳机充满或盒子低电VOX需要从5V到0V则关闭Vout输出通路关闭Boost。
{
if ( F_batlevel_protect ) //关盖前盒子低电则关盖时序为Vox由ADT转换为5V输出持续2.5s
{
if( Vox_TX_Timer < VOX_LOW_BAT_CNT )
{
Vox_TX_Timer++;
return;
}
}
else
{
if( Vox_TX_Timer < VOX_VOUT_5V_LEAST_CNT )
{
Vox_TX_Timer++;
return;
}
}
BST_EN = 0;
VOX_CTL0 &= ~0x30; //VOX 5v Off 关功率管
COM_CTRL = OFF;
Vox_Vout_Enable = OFF;
gBoost_Prepared_Flag = 0;
PATTERN_TX = OFF;
}
}
}
/*
*******************************************************************************
* void Vox_Follow_Chg(void)
*
* Description : 耳机跟随充函数。
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
/*
1、关盖后设置Boost输出电压5VVOX IOFF 20mA;
*/
#endif