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

387 lines
8.8 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"
#include "bat.h"
#include "hall.h"
#if VOX_ENABLE
/******************************************************************************\
Macro definitions
\******************************************************************************/
#define VOX_TX_CNT 100 //VOX发送指令时间10s
#define EARPHONR_WKUP_CNT 5
#define BES_RST_PULS_CNT 50
/******************************************************************************\
Variables definitions
\******************************************************************************/
uint8_t BES_Puls_Cnt = 0; //BES Reset脉冲计数
bit BES_Puls_Start = 0; //开启BES Reset脉冲信号
uint8_t Vox_TX_Timer = 0; //VOX发送指令持续时间计数,在Hall_Handler检测中清0.
uint8_t BES_Rst_Puls_Timer = 0; //关盖15s后发送BES Reset 脉冲
bit BES_Rst_Puls_Flag = 0;
uint8_t WkUp_EarPhone_Debounce = 0;
bit Cover_Close_Flag = 0;
bit Cover_Open_Flag = 0;
bit EarPhone_ShutDown_Flag = 0;
bit Vox_Vout_Enable = OFF; //Vox功率输出标志位
/******************************************************************************\
Functions definitions
\******************************************************************************/
/*
*******************************************************************************
* void Vox_init(void)
*
* Description : Vox Initialization :Vox初始化函数
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
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;
*/
}
/*
*******************************************************************************
* 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;
switch(VOX_Enable_Mode)
{
case VOX_VOUT_Mode:
VOX_CTL0 &= ~0x30; //VOX Disable 5V And Disable VOX ADT
VOX_CTL0 |= 0x30; //VOX Enable 5V
break;
case VOX_ADT_Mode:
VOX_CTL0 &= ~0x30; //VOX 5v Off
VOX_CTL0 |= 0x03; //VOX load detect On
break;
default:
break;
}
}
/*
*******************************************************************************
* void Vox_Det_Machine(void)
*
* Description : Vox Detect:耳机识别。 (100ms调用周期)
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
/*
1、关盖开启Boost denounce一段时间ms级延时后开启Vox 5v显示灯效。
2、开盖开启Boost denounce一段时间ms级延时后开启Vox 5v至少500ms用于唤醒耳机后发送开盖指令持续10s间隔250-300ms。
3、发送开盖指令间隔250-300ms期间Vox转入ADT模式检测都Loadon状态需要有灯效。
4、两只耳机电池都充满或仓低电则发送关机指令。
*/
void Vox_Det_Machine(void)
{
if( CoverEvent_Flg ) //Hall事件。
{
if(gBoost_Prepared_Flag) //Boost开启条件不满足则Vox一直处于ADT模式。
{
DisCharge_Boost_Open(); //开启Boost开启Vox 5v会在发送完一次关盖指令之后10ms级延时
BES_Rst_Puls_Flag = 0;
BES_Rst_Puls_Timer = 0;
EarPhone_ShutDown_Flag = 0;
Vox_TX_Timer = 0;
if( CoverStatus == CLOSE ) //1、关盖开启VOUT显示灯效。无需查询Loadon、IOFF状态无论耳机是否在仓关盖发送指令间隔300ms持续10s间隔之间开启VOUT。
{
WkUp_EarPhone_Debounce = 0;
Cover_Close_Flag = 1;
Cover_Open_Flag = 0;
CoverEvent_Flg = 0;
Vox_Vout_Enable = ON;
VOX_EN_Type(VOX_VOUT_Mode);
}
else //2、开盖处理
{
Cover_Close_Flag = 0;
/*开启VOUT 500ms用于唤醒耳机。*/
if( WkUp_EarPhone_Debounce < EARPHONR_WKUP_CNT ) //debounce 500ms
{
VOX_EN_Type(VOX_VOUT_Mode);
WkUp_EarPhone_Debounce++;
}
else
{
DisCharge_Boost_Close();
Cover_Open_Flag = 1;
CoverEvent_Flg = 0;
VOX_EN_Type(VOX_ADT_Mode);
}
}
}
else
{
VOX_EN_Type(VOX_ADT_Mode);
}
}
if( Cover_Open_Flag || Cover_Close_Flag || EarPhone_ShutDown_Flag )
{
/*间隔300ms发送关盖指令持续10s间隔之间开启VOUT。*/
if(Vox_TX_Timer < VOX_TX_CNT)
{
if( (Vox_TX_Timer % 3) == 0 ) //300ms发送一次
{
if( EarPhone_ShutDown_Flag )
{
Vox_TX_Machine(SHUT_DOWN); /*耳机电池充满或仓处于低电,发关机指令*/
}
else
if( CoverStatus == CLOSE )
{
Vox_TX_Machine(CLOSE_COVER); //发送关盖指令
}
else
if( CoverStatus == OPEN )
{
Vox_TX_Machine(OPEN_COVER); //发送开盖指令
}
}
else
{
COM_CTRL = ON;
}
Vox_TX_Timer++;
}
else //10s后清标志位。
{
COM_CTRL = ON;
if(EarPhone_ShutDown_Flag)
{
EarPhone_ShutDown_Flag = 0;
Cover_Close_Flag = 0;
Vox_Vout_Enable = OFF;
DisCharge_Boost_Close();
VOX_EN_Type(VOX_ADT_Mode);
}
else
if( CoverStatus == CLOSE ) //关盖发送完相应的指令后VOX 5V充电等待耳机电池充满。充满
{
if( ((CHIP_STA1 & 0xAC) == 0xAC) || F_batlevel_low ) //一、loadon和ioff状态同时存在说明1、耳机电池充满2、耳机锂保3、盒中没耳机二、盒电池低电。两种情况都发SHUT_DOWN。等待开盖重新插拔耳机。
{
EarPhone_ShutDown_Flag = 1;
Vox_TX_Timer = 0; //为了后面10s发送SHUT_DOWN指令。
}
if( (!BES_Rst_Puls_Flag ) )
{
BES_Rst_Puls_Timer++;
if( BES_Rst_Puls_Timer > BES_RST_PULS_CNT ) //10+5s后发送BES 复位 pattern
{
BES_Rst_Puls_Flag = 1;
Vox_TX_Machine(BES_RESET); //发送BES Reset脉冲只发一次。 22*5=110ms
}
}
}
else
if( CoverStatus == OPEN )
{
Cover_Open_Flag = 0;
}
}
}
}
/*
*******************************************************************************
* void BES_Reset_Puls(void)
*
* Description : BES Reset用于产生蓝牙耳机复位时序。 (5ms调用周期)
* Vox TX BES PlusVOX发送如下时序给耳机端。
* 5T Low + 1T High + 1T lOW + 1T High + 1T Low + 1T High + 1T Low + 1T High + 1T Low + 2T Low + 2T High + 1T Low + 1T High + 1T Low + 1T High + 1T Low + 1T High + 1T Low
* _ _ _ _ _ _ _ _ _
*0 0 0 0 0 |1|0|1|0|1|0|1|0 0|1 1|0|1|0|1|0|1|0
*__________| |_| |_|_|_|_|___|___|_|_|_|_|_|_|_______
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void BES_Reset_Puls(void)
{
if(BES_Puls_Start)
{
if(BES_Puls_Cnt <= 4) //持续5个低电平后加一高电平
{
COM_CTRL = OFF;
}
else
{
if(BES_Puls_Cnt%2)
{
if(BES_Puls_Cnt == 13)
{
COM_CTRL = OFF;
}
else
{
COM_CTRL = ON;
}
}
else
{
if(BES_Puls_Cnt == 14)
{
COM_CTRL = ON;
}
else
{
COM_CTRL = OFF;
}
}
}
if(BES_Puls_Cnt >= 23)
{
BES_Puls_Start = 0;
BES_Puls_Cnt = 0;
COM_CTRL = ON;
}
BES_Puls_Cnt++;
}
}
/*
*******************************************************************************
* void Vor_Det_Machine(void)
*
* Description : Vor Detect:耳机识别。 (100ms调用周期)
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void Vox_TX_Machine(VOX_Comm_ID_e VOX_Comm_ID)
{
uint8_t tx_pData[10] = 0;
uint8_t i = 0;
tx_pData[0] = HEADER>>8;
tx_pData[1] = HEADER;
tx_pData[3] = 0x02;
tx_pData[5] = 0x02;
tx_pData[6] = bat_level;
tx_pData[7] = FW_VER;
tx_pData[8] = bat_level;
switch(VOX_Comm_ID)
{
case OPEN_COVER: //开盖指令
tx_pData[4] = 0x00;
break;
case CLOSE_COVER: //关盖指令
tx_pData[4] = 0x01;
break;
case BES_RESET: //BES 复位patten
COM_CTRL = ON;
BES_Puls_Start = 1;
return;
case SHUT_DOWN: //关机指令
tx_pData[4] = 0x03;
break;
default:
break;
}
for(i=3 ;i<9 ;i++)
{
tx_pData[2] += tx_pData[i]; //求校验和
}
COM_CTRL = OFF; //VOX切换到通讯TX功能模式1.8V)。
Uart0SendPacket(9, tx_pData);
}
#endif