441 lines
9.2 KiB
C
441 lines
9.2 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 "bat.h"
|
||
#include "hall.h"
|
||
#include "key.h"
|
||
#include "sys_tim.h"
|
||
#include "adc.h"
|
||
#include "gpio_comm.h"
|
||
#include "userapp.h"
|
||
#include "key.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 50
|
||
|
||
#define VOX_VOUT_5V_DEBOUNCE 5
|
||
#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.
|
||
|
||
#define Vox_TX_Interval 2 //Vox定时发送指令时间间隔
|
||
|
||
/******************************************************************************\
|
||
Variables definitions
|
||
\******************************************************************************/
|
||
|
||
|
||
uint8_t Vox_Vol_Hold_Timer = 0;
|
||
|
||
bit Cover_Close_Flag = 0;
|
||
bit Cover_Close_Flag1 = 0;
|
||
|
||
bit Cover_Open_Flag = 0;
|
||
bit Vox_Vout_5V_Flag = 0;
|
||
|
||
uint8_t Vox_Output_Debounce = 0;
|
||
|
||
bit Get_CHIP_STA1_Flag = 0;
|
||
|
||
bit Pattern_TX_Over_Flag = 0;
|
||
|
||
uint8_t CHIP_STA1_BK = 0;
|
||
|
||
bit Cover_Open_5V_Flag = 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_Debounce++;
|
||
if( Vox_Output_Debounce >= VOX_OUTPUT_SHORT_CNT ) //Vox短路保护200ms后,重新开启Vox 5V。
|
||
{
|
||
Vox_Output_Debounce = 0;
|
||
IRQ_FLAG0 = 0x0C;
|
||
VOX_EN_Type(VOX_VOUT_Mode);
|
||
return;
|
||
}
|
||
}
|
||
|
||
if( CoverEvent_Flg ) //Hall事件触发。
|
||
{
|
||
if( gBoost_Prepared_Flag )
|
||
{
|
||
COM_CTRL = ON;
|
||
|
||
if( !F_batlevel_low ) //电压低于3.3V不升压,但需要走开关盖逻辑,用于灯效显示。
|
||
{
|
||
if( !BST_EN )
|
||
{
|
||
BST_EN = 1;
|
||
return;
|
||
}
|
||
|
||
VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V,开启VOX端的NMOS
|
||
}
|
||
|
||
if( CoverStatus == CLOSE ) //1、关盖关闭COM_CTRL;显示灯效。(无需查询Loadon、IOFF状态,无论耳机是否在仓,Vox 5V输出。)
|
||
{
|
||
#if VOX_FOLLOW_CHG
|
||
|
||
if( BST_EN )
|
||
{
|
||
/*跟随充逻辑*/
|
||
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
|
||
|
||
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、开盖处理:5v 500ms 转0V 500ms,后转ADT模式。
|
||
{
|
||
|
||
Cover_Close_Flag = 0;
|
||
|
||
Vox_Vol_Hold_Timer = 0;
|
||
|
||
Cover_Open_Flag = 1;
|
||
|
||
Get_CHIP_STA1_Flag = 0;
|
||
|
||
CoverEvent_Flg = 0;
|
||
|
||
Cover_Open_5V_Flag = 0;
|
||
|
||
Vox_Output_Debounce = 0;
|
||
|
||
// VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V,开启VOX端的NMOS
|
||
}
|
||
}
|
||
else
|
||
{
|
||
VOX_EN_Type(VOX_ADT_Mode);
|
||
|
||
Vox_Vout_Enable = OFF;
|
||
|
||
CoverEvent_Flg = 0;
|
||
}
|
||
}
|
||
|
||
/* 发送开盖指令*/
|
||
if( Cover_Open_Flag ) /*开盖后,5V持续500ms后0V持续500ms,Vox转入adt模式,等待耳机出入盒,并显示相应的灯效。*/
|
||
{
|
||
if( Vox_Vol_Hold_Timer < VOX_VOUT_5V_DEBOUNCE ) //开盖后5V 500ms。
|
||
{
|
||
Vox_Vol_Hold_Timer++;
|
||
|
||
return;
|
||
}
|
||
|
||
if( Vox_TX_Timer < VOX_VOUT_5V_DEBOUNCE ) //转0V 500ms
|
||
{
|
||
COM_CTRL = OFF;
|
||
|
||
BST_EN = 0;
|
||
|
||
Vox_TX_Timer++;
|
||
|
||
Pattern_TX_Over_Flag = 1;
|
||
}
|
||
else
|
||
{
|
||
if( Pattern_TX_Over_Flag ) //转adt模式,用于后续识别耳机出入仓检测
|
||
{
|
||
Pattern_TX_Over_Flag = 0;
|
||
|
||
COM_CTRL = ON;
|
||
|
||
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 KEY_ENABLE
|
||
/*开盖状态下,长按按键8s,则VOX发送数据:55 AA 02 06 DD BA*/
|
||
if( Key_Press_ll_irq )
|
||
{
|
||
if( Vox_Output_Debounce < 10 )
|
||
{
|
||
if( (Vox_Output_Debounce % Vox_TX_Interval == 0) )
|
||
{
|
||
Vox_TX_Machine();
|
||
}
|
||
|
||
Vox_Output_Debounce++;
|
||
}
|
||
else
|
||
{
|
||
Key_Press_ll_irq = 0;
|
||
|
||
Vox_Output_Debounce = 0;
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
}
|
||
|
||
if( Cover_Close_Flag )
|
||
{
|
||
/*跟随充说明:
|
||
1、关盖后初始化Boost输出5V,IOFF 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_low ) //耳机充满或盒子低电,则关闭Vout输出通路,关闭Boost。
|
||
{
|
||
if( Vox_Vol_Hold_Timer < VOX_VOUT_5V_LEAST_CNT ) //重载转轻载延时5s后关闭Boost输出。
|
||
{
|
||
Vox_Vol_Hold_Timer++;
|
||
|
||
return;
|
||
}
|
||
|
||
BST_EN = 0;
|
||
|
||
VOX_EN_Type(VOX_ADT_Mode);
|
||
|
||
Vox_Vout_Enable = OFF;
|
||
|
||
COM_CTRL = OFF; //关MOS管,节省功耗。
|
||
}
|
||
}
|
||
}
|
||
|
||
#ifdef VOX_TX
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void Vox_TX_Machine(void)
|
||
*
|
||
* Description : Vor Detect:耳机识别。 (100ms调用周期)
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
|
||
void Vox_TX_Machine(void)
|
||
{
|
||
uint8_t tx_pData[7] = 0;
|
||
|
||
tx_pData[0] = 0x55;
|
||
|
||
tx_pData[1] = 0xAA;
|
||
|
||
tx_pData[2] = 0x02;
|
||
|
||
tx_pData[3] = 0x06;
|
||
|
||
tx_pData[4] = 0xDD;
|
||
|
||
tx_pData[5] = 0xBA;
|
||
|
||
COM_CTRL = OFF; //VOX切换到通讯TX功能模式(3.3V)。
|
||
|
||
SFRADDR = P0_PU;
|
||
SFRDATA = 0x03;
|
||
|
||
SFRADDR = MFP_CTL0;
|
||
SFRDATA |= 0x04; //P01 as UART's TX
|
||
|
||
Uart0SendPacket(7, tx_pData); //多加一个字节发送,后面要设置TX为GPIO,会导致最后一个字节没来得及发出去。
|
||
|
||
SFRADDR = MFP_CTL0; //Set P01 Pinmux As GPIO Function
|
||
SFRDATA &= ~0x0C;
|
||
|
||
SFRADDR = P0_PD;
|
||
SFRDATA &= ~0x03;
|
||
|
||
COM_CTRL = ON;
|
||
}
|
||
|
||
#endif
|
||
|
||
#endif
|
||
|