538 lines
12 KiB
C
538 lines
12 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"
|
||
|
||
bit Vox_Vout_Enable = OFF; //Vox功率输出标志位
|
||
|
||
#if VOX_ENABLE
|
||
|
||
/******************************************************************************\
|
||
Macro definitions
|
||
\******************************************************************************/
|
||
#define VOX_TX_CNT 100 //VOX发送指令时间(10s)
|
||
#define EARPHONR_WKUP_CNT 5
|
||
#define BES_RST_PULS_CNT 50
|
||
#define Vox_TX_Interval 3 //Vox定时发送指令时间间隔
|
||
#define T10MIN_DEBOUNCE 600
|
||
|
||
/******************************************************************************\
|
||
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 Boost_Open_Flag = 0; //用于开启Boost后延时开启Vox 5V。
|
||
|
||
uint8_t Vox_Output_Short_Debounce = 0;
|
||
uint16_t Boost_Open_Atleast_10min_Cnt = 0;
|
||
|
||
|
||
/******************************************************************************\
|
||
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;
|
||
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)
|
||
{
|
||
|
||
/*Vox 过流保护,两只耳机都每隔200ms打嗝一次(28Bytes)*/
|
||
if( IRQ_FLAG0 & 0x0C )
|
||
{
|
||
Vox_Output_Short_Debounce++;
|
||
if( Vox_Output_Short_Debounce >= 2 ) //Vox短路保护200ms后,重新开启Vox 5V。
|
||
{
|
||
Vox_Output_Short_Debounce = 0;
|
||
IRQ_FLAG0 = 0x0C;
|
||
VOX_EN_Type(VOX_VOUT_Mode);
|
||
return;
|
||
}
|
||
}
|
||
|
||
if( CoverEvent_Flg ) //Hall事件。
|
||
{
|
||
#if 0
|
||
if(gBoost_Prepared_Flag && ( CHIP_STA1 & 0xA0 ) ) //1、Boost开启条件不满足,则Vox一直处于ADT模式。2、存在loadon,有耳机在仓,开启Vox 5V输出
|
||
#else
|
||
if( gBoost_Prepared_Flag )
|
||
#endif
|
||
{
|
||
if( !Boost_Open_Flag )
|
||
{
|
||
BST_EN = 1; //Boost Enable;异常时由硬件主动关闭。开启Boost,开启Vox 5v会在开启Boost之后(100ms延时)。
|
||
Boost_Open_Flag = 1;
|
||
return;
|
||
}
|
||
|
||
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;
|
||
Boost_Open_Flag = 0;
|
||
Boost_Open_Atleast_10min_Cnt = 0;
|
||
VOX_EN_Type(VOX_VOUT_Mode);
|
||
}
|
||
else //2、开盖处理,Vox 5V输出500ms用于唤醒耳机;500ms后vox设置为ADT模式,关Boost。
|
||
{
|
||
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
|
||
{
|
||
BST_EN = 0; //Boost Disable
|
||
Cover_Open_Flag = 1;
|
||
CoverEvent_Flg = 0;
|
||
Boost_Open_Flag = 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;开盖间隔之间开启ADT。*/
|
||
if(Vox_TX_Timer < VOX_TX_CNT)
|
||
{
|
||
if( (Vox_TX_Timer % Vox_TX_Interval) == 0 ) //300ms发送一次
|
||
{
|
||
if( EarPhone_ShutDown_Flag )
|
||
{
|
||
#ifdef VOX_TX
|
||
Vox_TX_Machine(SHUT_DOWN); /*耳机电池充满或仓处于低电,发关机指令*/
|
||
#endif
|
||
#ifdef _DEBUG_VOX
|
||
printf("Shut Down,Cnt:%d\r\n",(uint16_t)Vox_TX_Timer);
|
||
#endif
|
||
}
|
||
else
|
||
if( CoverStatus == CLOSE )
|
||
{
|
||
#ifdef VOX_TX
|
||
Vox_TX_Machine(CLOSE_COVER); //发送关盖指令
|
||
#endif
|
||
#ifdef _DEBUG_VOX
|
||
printf("Cover Close,Cnt:%d\r\n",(uint16_t)Vox_TX_Timer);
|
||
#endif
|
||
}
|
||
else
|
||
if( CoverStatus == OPEN )
|
||
{
|
||
#ifdef VOX_TX
|
||
Vox_TX_Machine(OPEN_COVER); //发送开盖指令
|
||
#endif
|
||
#ifdef _DEBUG_VOX
|
||
printf("Cover Open,Cnt:%d\r\n",(uint16_t)Vox_TX_Timer);
|
||
#endif
|
||
}
|
||
}
|
||
else
|
||
{
|
||
COM_CTRL = ON;
|
||
}
|
||
|
||
Vox_TX_Timer++;
|
||
}
|
||
else //10s后清标志位。
|
||
{
|
||
if(EarPhone_ShutDown_Flag)
|
||
{
|
||
EarPhone_ShutDown_Flag = 0;
|
||
Cover_Close_Flag = 0;
|
||
Vox_Vout_Enable = OFF;
|
||
BST_EN = 0; //Boost Disable
|
||
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。等待开盖重新插拔耳机。
|
||
{
|
||
if( Boost_Open_Atleast_10min_Cnt >= T10MIN_DEBOUNCE ) //Boost必须工作满10分钟软件才允许关机,原因,给耳机电池处于锂保状态进行充电。
|
||
{
|
||
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;
|
||
#ifdef _DEBUG_VOX
|
||
printf("Bes Reset.\r\n");
|
||
#endif
|
||
#ifdef VOX_TX
|
||
Vox_TX_Machine(BES_RESET); //发送BES Reset脉冲,只发一次。 23*5=115ms,
|
||
#endif
|
||
return; /*return的原因:Vox_Det_Machine() 100ms调用周期,BES_RESET在Timer1中5ms调用。整个复位Pattern需要115ms,
|
||
在此处return可以保证在200ms内只有BES 复位pattern在操作COM_CTRL。*/
|
||
}
|
||
}
|
||
}
|
||
else
|
||
if( CoverStatus == OPEN )
|
||
{
|
||
Cover_Open_Flag = 0;
|
||
}
|
||
|
||
COM_CTRL = ON;
|
||
}
|
||
}
|
||
}
|
||
|
||
#ifdef VOX_TX
|
||
/*
|
||
*******************************************************************************
|
||
* void HandleTxCommand(VOX_BES_COMMAND_E RxCommand, e_Vox_Chan nVox_Chn_Select)
|
||
*
|
||
* Description : 发送数据包的封装,并打开相应的双向通信通道
|
||
* Command payload
|
||
* --Header--cmd----len_h---len_l-----Data------CRC16
|
||
* 4bytes 2byte 1byte 1byte Len bytes 1byte
|
||
*
|
||
* Arguments : VOX_BES_COMMAND_E TxCommand: , e_Vox_Chan nVox_Chn_Select
|
||
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
|
||
void HandleTxCommand(VOX_BES_COMMAND_E TxCommand, e_Vox_Chan nVox_Chn_Select)
|
||
{
|
||
switch(TxCommand)
|
||
{
|
||
case CMD_BOX_OPEN:
|
||
|
||
break;
|
||
|
||
case CMD_BOX_CLOSE:
|
||
|
||
break;
|
||
|
||
case CMD_SHUT_DOWN:
|
||
|
||
break;
|
||
|
||
case CMD_BES_PAIRING:
|
||
|
||
break;
|
||
|
||
case CMD_BES_CLEAN:
|
||
|
||
break;
|
||
|
||
case CMD_BES_HEARTBEAT:
|
||
|
||
break;
|
||
|
||
case CMD_OTA:
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
#endif
|
||
|
||
#ifdef VOX_RX
|
||
/*
|
||
*******************************************************************************
|
||
* char HandleRxCommand(ACK_TYPE_E RxCommand)
|
||
*
|
||
* Description : 耳机端发送的数据包的解析及处理
|
||
* Ack payload:
|
||
* Header cmd Ack type len_h len_l Data CRC16
|
||
* 4bytes 2byte 1byte 1byte 1byte Len bytes 1byte
|
||
*
|
||
* Arguments : ACK_TYPE_E RxCommand:
|
||
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
char HandleRxMsg(VOX_BES_COMMAND_E RxCommand)
|
||
{
|
||
switch(RxCommand)
|
||
{
|
||
case CMD_BOX_OPEN:
|
||
|
||
break;
|
||
|
||
case CMD_BOX_CLOSE:
|
||
|
||
break;
|
||
|
||
case CMD_SHUT_DOWN:
|
||
|
||
break;
|
||
|
||
case CMD_BES_PAIRING:
|
||
|
||
break;
|
||
|
||
case CMD_BES_CLEAN:
|
||
|
||
break;
|
||
|
||
case CMD_BES_HEARTBEAT:
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
#endif
|
||
|
||
|
||
#ifdef VOX_TX
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void BES_Reset_Puls(void)
|
||
*
|
||
* Description : BES Reset用于产生蓝牙耳机复位时序。 (5ms调用周期)
|
||
* Vox TX BES Plus,VOX发送如下时序给耳机端。
|
||
* 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;
|
||
}
|
||
}
|
||
}
|
||
|
||
BES_Puls_Cnt++;
|
||
|
||
if(BES_Puls_Cnt >= 23)
|
||
{
|
||
BES_Puls_Start = 0;
|
||
BES_Puls_Cnt = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* 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[9] = 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
|
||
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)。
|
||
#if UART0_ENABLE
|
||
Uart0SendPacket(9, tx_pData);
|
||
#endif
|
||
}
|
||
|
||
#endif
|
||
|
||
#endif
|
||
|