SY8835_For_Demo_Ourself/UsrSrc/vox/vox_module.c
Alex xu 30111f86c1 更改内容:1、优化代码,全局变量在定义时不赋初值,减小ROM占用;
2、将显示UI模块化,单独成文件displayui.c和display_ui.h;
3、将部分功能模块的状态位、标志位变量和配置参数置于congfig.h;
4、将工程程序中的TP3315字符更改SY8835。
2025-01-21 18:00:07 +08:00

2270 lines
56 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
* @ic sy8835
*
* @version 1.0
* @date 2024/11/01 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 2024/11/01 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 "sys_tim.h"
#include "adc.h"
#include "userapp.h"
bit Vox_Vout_Enable; //Vox功率输出标志位
bit Boost_Open_Flag;
uint8_t Vox_Type;
bit Vox_Output_Short_Flag;
#if VOX_ENABLE
/******************************************************************************\
Macro definitions
\******************************************************************************/
/*100ms调用周期*/
#define Vox_COM_MSG_Tim 20
#define MAX_PACKET_SIZE 0x20
#if VOX_FOLLOW_CHG
#define VOX_FOLLOW_CHG_NOWCURCHK_CNT 5
#define VOX_FOLLOW_CHG_VOLTAGE_ADJUST_CNT 2 //PMID调压周期
#endif
/******************************************************************************\
Variables definitions
\******************************************************************************/
#if VOX_FOLLOW_CHG
uint8_t Vox_Follow_Init_Deb;
xdata uint16_t Vox_Follow_Chg_Debounce;
g_Vox_Fllow_Chg_Cfg xdata Vox_Fllow_Chg;
e_Vox_Follow_Chg_Sta Follow_Chg_Sta;
#endif
#ifdef VOX_RX
xdata uint8_t Vox_Get_Vbat_Flag[2]; //耳机配对状态VOL:低4bitVOR:高4bit。0是无效1是正在配对2是配对成功3不处理保持当前状态。
xdata uint8_t Vox_Get_BES_Addr_Flag[2];
//idata uint8_t BES_Addr[6] = {0}; //蓝牙耳机地址Vox_Bes_Addr[0][6]VOLVox_Bes_Addr[1][6]VOR
#endif
uint8_t EarPhone_Num;
#endif
bit OpenCover_TX_Cmd_Flag;
#define KEY_TWS_PAIR_TIMER 2
#define KEY_TWS_PAIR_CNT 6
#if XUANHENG
xdata uint8_t Vox_Pairing_State[2]; //耳机配对状态0是无效1是正在配对2是配对成功3不处理保持当前状态。
xdata uint8_t Vox_Set_BES_Addr_Flag[2];
xdata uint8_t BES_Addr[6]; //蓝牙耳机地址Vox_Bes_Addr[0][6]VOLVox_Bes_Addr[1][6]VOR
xdata uint8_t Random_Data[8];
xdata uint8_t Bes_Bet_Level[2]; //对耳电池电量信息Bes_Bet_Level[0]左耳Bes_Bet_Level[1]:右耳
xdata uint8_t Bes_Chg_Full[2]; //对耳硬件是否满电0非满电1满电。
xdata uint8_t Tws_Paired_Record[2]; //TWS配对记录0有TWS配对记录1没有TWS配对记录
xdata uint8_t Phone_Paired_Record[2]; //手机配对记录0有与手机配对记录1没有和手机配对记录。
xdata uint8_t Bes_OTA_State[2]; //耳机静默升级状态10没有
xdata uint8_t Bes_Set_SN_State[2]; //耳机应答仓写入SN是否成功。1成功0失败
xdata uint8_t Bes_In_Pair_State[2]; //耳机进入配对状态标志位
xdata uint8_t Vox_Clear_Pair_Flag[2];
bit Vol_Bes_Addr_Flag;
bit Vor_Bes_Addr_Flag;
xdata uint8_t SN_Num[22]; //SN码需要从OTP的固定位置获取。
xdata uint8_t SN_Num_Start; //SN码发送起始位置有开盖动作时清零。
bit gShip_Mode_Flag; //船运模式标志位0正常关机1船运模式
#else
xdata uint8_t Net_Info[2][13];
xdata uint8_t MAC_Addr[2][18];
xdata uint8_t Earphone_Vbat[2]; //对耳电量
#endif
/******************************************************************************\
Functions definitions
\******************************************************************************/
#if 0
/*
*******************************************************************************
* uint8_t VOL_EN_Type(VOL_Enable_Type_e VOL_Enable_Type)
*
* Description : VOL Open(EN_VO)
* 使能信号优先级
* EN_TRAN EN_COM EN_VO EN_ADT PD1K VOX_STATE
* 1 X X X X TRAN
* 0 1 X X X COMM
* 0 0 1 X X 5V
* 0 0 0 1 X LOAD DET
* 0 0 0 0 1 PD1K
* 0 0 0 0 0 HIZ
* Arguments :
* Returns :
* Notes :
*
*******************************************************************************
*/
void VOL_EN_Type(VOX_Enable_Mode_e VOL_Enable_Mode)
{
uint8_t Bst_VOX_Comm_EN = 0;
uint8_t VOX_Confg = 0;
Bst_VOX_Comm_EN = I2cSfr_Read( BST_COMM_EN );
VOX_Confg = I2cSfr_Read( VOX_CFG );
switch(VOL_Enable_Mode)
{
case VOX_TRANS_Mode: //关闭自动识别负载的上拉电阻。
break;
case VOX_COMM_Mode_Uart:
VOX_Confg |= VOX_COM_PULL_UP_SET | VOX_PULL_UP_VOLTAGE_SET | VOX_COM_VOLTAGE_SET;
Bst_VOX_Comm_EN |= BST_COMM_EN_Vol_Comm_En;
break;
case VOX_COMM_Mode_Reg:
break;
case VOX_VOUT_Mode: //Vox的通讯功能优先级比Vout 5V高。
Bst_VOX_Comm_EN |= BST_COMM_EN_Vol_En;
Bst_VOX_Comm_EN &= ~BST_COMM_EN_Vol_Comm_En;
break;
case VOX_ADT_Mode:
VOX_Confg &= ~VOX_CFG_Vox_DisAdt; //开启ADT模式
Bst_VOX_Comm_EN &= ~( BST_COMM_EN_Vol_Comm_En | BST_COMM_EN_Vol_En );
break;
case VOX_PD1K_Mode:
VOX_Confg |= VOX_CFG_Vox_DisAdt;
VOX_Confg &= ~VOX_CFG_Vox_Floating; //Vox通过1K电阻下拉到GND
Bst_VOX_Comm_EN &= ~( BST_COMM_EN_Vol_Comm_En | BST_COMM_EN_Vol_En );
break;
default:
break;
}
I2cSfr_Write( BST_COMM_EN, Bst_VOX_Comm_EN );
I2cSfr_Write( VOX_CFG, VOX_Confg );
}
/*
*******************************************************************************
* void VOR_EN_Type(VOR_Enable_Type_e VOR_Enable_Type)
*
* Description : VOL Open(EN_VO)
* 使能信号优先级
* EN_TRAN EN_COM EN_VO EN_ADT PD1K VOX_STATE
* 1 X X X X TRAN
* 0 1 X X X COMM
* 0 0 1 X X 5V
* 0 0 0 1 X LOAD DET
* 0 0 0 0 1 PD1K
* 0 0 0 0 0 HIZ
* Arguments :
* Returns :
* Notes :
*
*******************************************************************************
*/
void VOR_EN_Type(VOX_Enable_Mode_e VOR_Enable_Mode)
{
uint8_t Bst_VOX_Comm_EN = 0;
uint8_t VOX_Confg = 0;
Bst_VOX_Comm_EN = I2cSfr_Read( BST_COMM_EN );
VOX_Confg = I2cSfr_Read( VOX_CFG );
switch(VOR_Enable_Mode)
{
case VOX_TRANS_Mode: //关闭自动识别负载的上拉电阻。
break;
case VOX_COMM_Mode_Uart:
VOX_Confg |= VOX_COM_PULL_UP_SET | VOX_PULL_UP_VOLTAGE_SET | VOX_COM_VOLTAGE_SET;
Bst_VOX_Comm_EN |= BST_COMM_EN_Vor_Comm_En;
break;
case VOX_COMM_Mode_Reg:
break;
case VOX_VOUT_Mode: //Vox的通讯功能优先级比Vout 5V高。
Bst_VOX_Comm_EN |= BST_COMM_EN_Vor_En;
Bst_VOX_Comm_EN &= ~BST_COMM_EN_Vor_Comm_En;
break;
case VOX_ADT_Mode:
VOX_Confg &= ~VOX_CFG_Vox_DisAdt; //开启ADT模式
Bst_VOX_Comm_EN &= ~( BST_COMM_EN_Vor_Comm_En | BST_COMM_EN_Vor_En );
break;
case VOX_PD1K_Mode:
VOX_Confg |= VOX_CFG_Vox_DisAdt;
VOX_Confg &= ~VOX_CFG_Vox_Floating; //Vox通过1K电阻下拉到GND
Bst_VOX_Comm_EN &= ~( BST_COMM_EN_Vor_Comm_En | BST_COMM_EN_Vor_En );
break;
default:
break;
}
I2cSfr_Write( BST_COMM_EN, Bst_VOX_Comm_EN );
I2cSfr_Write( VOX_CFG, VOX_Confg );
}
#else
/*
*******************************************************************************
* void VOX_EN_Type(VOR_Enable_Type_e VOR_Enable_Type)
*
* Description : VOL Open(EN_VO)
* 使能信号优先级
* EN_COM EN_VO EN_ADT PD1K VOX_STATE
* 1 X X X COMM
* 0 1 X X 5V
* 0 0 1 X Auto DET
* 0 0 0 1 PD1K
* Arguments :
* Returns :
* Notes :
*
*******************************************************************************
*/
void VOX_EN_Type(VOX_Enable_Mode_e VOX_Enable_Mode)
{
uint8_t Bst_VOX_Comm_EN = 0;
uint8_t VOX_Confg = 0;
Bst_VOX_Comm_EN = I2cSfr_Read( BST_COMM_EN );
VOX_Confg = I2cSfr_Read( VOX_CFG );
switch(VOX_Enable_Mode)
{
case VOX_TRANS_Mode: //关闭自动识别负载的上拉电阻。
break;
case VOX_COMM_Mode_Uart:
VOX_Confg |= VOX_COM_PULL_UP_SET | VOX_PULL_UP_VOLTAGE_SET | VOX_COM_VOLTAGE_SET;
Bst_VOX_Comm_EN |= BST_COMM_EN_Gate_Ctrl | ( BST_COMM_EN_Vor_Comm_En | BST_COMM_EN_Vol_Comm_En );
break;
case VOX_COMM_Mode_Reg:
break;
case VOX_VOUT_Mode: //Vox的通讯功能优先级比Vout 5V高。
Bst_VOX_Comm_EN |= ( BST_COMM_EN_Vor_En | BST_COMM_EN_Vol_En );
Bst_VOX_Comm_EN &= ~( BST_COMM_EN_Vor_Comm_En | BST_COMM_EN_Vol_Comm_En );
break;
case VOX_ADT_Mode:
VOX_Confg &= ~VOX_CFG_Vox_DisAdt; //开启ADT模式
Bst_VOX_Comm_EN &= ~( BST_COMM_EN_Vor_Comm_En | BST_COMM_EN_Vor_En | BST_COMM_EN_Vol_Comm_En | BST_COMM_EN_Vol_En );
break;
case VOX_PD1K_Mode:
VOX_Confg |= VOX_CFG_Vox_DisAdt;
VOX_Confg &= ~VOX_CFG_Vox_Floating; //Vox通过1K电阻下拉到GND
Bst_VOX_Comm_EN &= ~( BST_COMM_EN_Vor_Comm_En | BST_COMM_EN_Vor_En | BST_COMM_EN_Vol_Comm_En | BST_COMM_EN_Vol_En );
break;
default:
break;
}
I2cSfr_Write( BST_COMM_EN, Bst_VOX_Comm_EN );
I2cSfr_Write( VOX_CFG, VOX_Confg );
}
#endif
/*
*******************************************************************************
* 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)
{
static bit Get_CHIP_STA1_Flag0;
static bit Get_CHIP_STA1_Flag1;
static bit Cover_Close_Flag;
static bit Cover_Close_Flag1;
static bit Cover_Close_Force_Vout_Flag;
static bit Cover_Open_Flag;
static bit Cover_Open_5V_Flag;
static bit Bat_Low_Pro_Flag;
static bit Vox_Chg_Full_Flag;
static bit Vox_Getinto_Sleep_Flag;
static uint8_t CHIP_STA1_BK;
static uint8_t Vox_Voltage_Hold_Timer;
static uint8_t Vox_TX_Timer;
static bit Vox_Chn_Select;
static uint8_t Vox_Output_Debounce;
static uint8_t Vox_Output_Cnt;
static bit CoverEvent_Flg1;
/*Vox 过流保护两只耳机都每隔200ms打嗝一次*/
if( pmu_Info.pmu_Fault_STA2 & ( Fault_Sta2_VorOCP | Fault_Sta2_VolOCP ) )
{
Vox_Output_Short_Flag = 1;
return;
}
Vox_Output_Short_Flag = 0;
if( gBoost_Prepared_Flag )
{
if( CoverEvent_Flg ) //Hall事件触发。
{
if( !Boost_Open_Flag )
{
Set_PMU_Boost_Vout(BOOST_VOUT_MAX); //开关盖Boost输出5.2V,保证耳机一定能被唤醒。
Set_PMU_Boost(ON); //Boost Enable异常时由硬件主动关闭。开启Boost开启Vox 5v会在开启Boost之后100ms延时
Boost_Open_Flag = 1;
#ifdef _DEBUG_VOX
printf("Boost Open.(line:%d)\r\n",(u16)__LINE__);
#endif
VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V
return;
}
Vox_Output_Debounce = 0;
Vox_Voltage_Hold_Timer = 0; //关盖清0开盖使用
Vox_TX_Timer = 0;
Get_CHIP_STA1_Flag0 = 0;
Get_CHIP_STA1_Flag1 = 0;
CoverEvent_Flg1 = 1;
if( CoverStatus == CLOSE ) //1、关盖关闭COM_CTRL显示灯效。无需查询Loadon、IOFF状态无论耳机是否在仓Vox 5V输出。
{
Earphone_Chg_Flag_led = 0; //关盖取消耳机入盒灯效,显示关盖灯效。
Cover_Close_Flag = 1;
Cover_Close_Flag1 = 1;
Cover_Open_Flag = 0;
Vox_Chg_Full_Flag = 0;
Cover_Close_Force_Vout_Flag = 0;
Vox_Getinto_Sleep_Flag = 0;
Vox_Chn_Select = 0;
Vox_Vout_Enable = ON;
Wkup_Earphone_Flag = 0;
#if VOX_FOLLOW_CHG
Vox_Fllow_Chg.Vox_Follow_Start = OFF;
Vox_Fllow_Chg.Vox_Follow_Stop = OFF;
Follow_Chg_Sta = Vox_Follow_Chg_InitSta;
#endif
#ifdef _DEBUG_VOX
printf("Box Close.(line:%d)\r\n",(u16)__LINE__);
#endif
}
else //2、开盖处理5v 500ms 转0V 500ms后转ADT模式。
{
Cover_Close_Flag = 0;
Cover_Close_Flag1 = 0;
Cover_Open_Flag = 1;
Cover_Open_5V_Flag = 0;
#ifdef _DEBUG_VOX
printf("Box Open.(line:%d)\r\n",(u16)__LINE__);
#endif
}
Boost_Open_Flag = 0;
CoverEvent_Flg = 0;
}
/* 开关盖后VOX先升压5.2V 一段时间唤醒耳机后转入ADT获取盒内耳机数量。 */
if( Vox_Voltage_Hold_Timer < HALL_OPEN_VOX_5V_DEBOUNCE ) //开盖后5V N00ms。
{
Vox_Voltage_Hold_Timer++;
return;
}
if ( CoverEvent_Flg1 )
{
CoverEvent_Flg1 = 0;
VOX_EN_Type(VOX_ADT_Mode);
return;
}
else
{
if ( !Get_CHIP_STA1_Flag0 ) //获取耳机在盒数量。
{
Get_CHIP_STA1_Flag0 = 1;
if ( pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn ) )
{
if ( ( pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn ) ) == ( VOR_LoadOn | VOL_LoadOn ) )
{
EarPhone_Num = 2;
}
else
{
EarPhone_Num = 1;
}
}
else
{
EarPhone_Num = 0;
}
#ifdef _DEBUG_VOX
printf( "Open/Close Box,Earphones In Box(Num:%d)(VoxSta:0x%x).\r\n",(u16)EarPhone_Num, (u16)(pmu_Info.pmu_VOX_STA) );
#endif
}
}
/* 发送开盖指令*/
if( Cover_Open_Flag ) /*开盖后5V持续N00ms后0V持续N00ms保证耳机能被唤醒之后发开盖码。*/
{
#if 1
if( Vox_TX_Timer < HALL_OPEN_VOX_0V_DEBOUNCE ) //转0V N00ms
{
VOX_EN_Type(VOX_PD1K_Mode);
Vox_TX_Timer++;
}
else
#endif
{
if( !Get_CHIP_STA1_Flag1 )
{
if( Vox_Output_Debounce <= Vox_COM_MSG_Tim )
{
if( ( Vox_Output_Debounce % Vox_TX_Interval_2 ) == 0 ) //200ms发送一次
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_OPEN_BOX,VOL_CHAN); //左耳发开盖指令,区分耳机通道。
#elif ZHONGKE
HandleTxCommand(VHOUSE_CMD_OPEN_WINDOW,VOL_CHAN); //左耳发开盖指令,区分耳机通道。
#elif XUANHENG
HandleTxCommand(CMD_HEARTBEAT,VOL_CHAN);
#endif
#endif
}
else
if( ( Vox_Output_Debounce % Vox_TX_Interval ) == 0 ) //200ms发送一次
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_OPEN_BOX,VOR_CHAN); //右耳发开盖指令,区分耳机通道。
#elif ZHONGKE
HandleTxCommand(VHOUSE_CMD_OPEN_WINDOW,VOR_CHAN); //右耳发开盖指令,区分耳机通道。
#elif XUANHENG
HandleTxCommand(CMD_HEARTBEAT,VOR_CHAN);
#endif
#endif
}
Vox_Output_Debounce++;
}
else
{
VOX_EN_Type(VOX_ADT_Mode);
Vox_Output_Debounce = 0;
Get_CHIP_STA1_Flag1 = 1;
OpenCover_TX_Cmd_Flag = 1;
Vox_Vout_Enable = OFF;
#ifdef _DEBUG_VOX
printf("Open Box CMD TX Over.\r\n");
#endif
}
}
else
{
if( Event_key == KEY_EVENT_Empty )
{
if( OpenCover_TX_Cmd_Flag )
{
OpenCover_TX_Cmd_Flag = 0;
CHIP_STA1_BK = pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn );
}
else
{
/*耳机出入盒判断*/
if( CHIP_STA1_BK != ( pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn ) ) ) //查询耳机loadon状态loadon状态改变则说明有耳机出入盒。
{
if ( pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn ) )
{
Earphone_Chg_Flag_led = 1;
#ifdef LED_DISPLAY
LED_On_Flag = 1;
#endif
}
#ifdef _DEBUG_VOX
printf( "Open Box And Earphone GetIn(Num:%d)(VoxSta:0x%x).\r\n",(u16)EarPhone_Num, (u16)(pmu_Info.pmu_VOX_STA) );
#endif
CHIP_STA1_BK = ( pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn ) );
}
}
}
}
}
}
if( Cover_Close_Flag )
{
if( Wkup_Earphone_Flag ) //保护、断充电后VOX需自动升压唤醒耳机。
{
if( !Boost_Open_Flag )
{
Set_PMU_Boost_Vout(BOOST_VOUT_MAX);
Set_PMU_Boost(ON); //Boost Enable异常时由硬件主动关闭。开启Boost开启Vox 5v会在开启Boost之后100ms延时
Boost_Open_Flag = 1;
Vox_Vout_Enable = ON;
#if VOX_FOLLOW_CHG
Vox_Fllow_Chg.Vox_Follow_Start = OFF;
Vox_Fllow_Chg.Vox_Follow_Stop = OFF;
Follow_Chg_Sta = Vox_Follow_Chg_InitSta;
#endif
Vox_Voltage_Hold_Timer = 0;
Vox_Chg_Full_Flag = 0;
CoverEvent_Flg1 = 1;
Get_CHIP_STA1_Flag0 = 0;
Cover_Close_Force_Vout_Flag = 1;
return;
}
VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V
#ifdef _DEBUG_VOX
printf("Close Box And Force Voltage Up.\r\n ");
#endif
Boost_Open_Flag = 0;
Cover_Close_Flag1 = 1;
if( Vox_Voltage_Hold_Timer <= HALL_CLOSE_VOX_5V_HOLD_CNT ) //关盖Boost VOUT 5V保持时间。
{
Vox_Voltage_Hold_Timer++;
return;
}
Wkup_Earphone_Flag = 0;
}
else
{
if( !Cover_Close_Force_Vout_Flag )
{
/*发码*/
if( Vox_TX_Timer <= Vox_COM_MSG_Tim ) //发送关盖指令。
{
if( (Vox_TX_Timer % Vox_TX_Interval_2) == 0 ) //200ms发送一次
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_CLOSE_BOX,VOL_CHAN); //左耳发开盖指令,区分耳机通道。
#elif ZHONGKE
HandleTxCommand(VHOUSE_CMD_CLOSE_WINDOW,VOL_CHAN); //左耳发开盖指令,区分耳机通道。
#elif XUANHENG
HandleTxCommand(CMD_HEARTBEAT,VOL_CHAN);
#endif
#endif
}
else
if( (Vox_TX_Timer % Vox_TX_Interval) == 0 ) //200ms发送一次
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_CLOSE_BOX,VOR_CHAN); //右耳发开盖指令,区分耳机通道。
#elif ZHONGKE
HandleTxCommand(VHOUSE_CMD_CLOSE_WINDOW,VOR_CHAN); //右耳发开盖指令,区分耳机通道。
#elif XUANHENG
HandleTxCommand(CMD_HEARTBEAT,VOR_CHAN);
#endif
#endif
}
Vox_TX_Timer++;
return;
}
if( Vox_Output_Debounce <= Vox_COM_MSG_Tim ) //关盖后5s发送获取电量命令。
{
if( (Vox_Output_Debounce % Vox_TX_Interval_2) == 0 ) //200ms发送一次
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_CLOSE_WIN_GET_VBAT,VOL_CHAN); //左耳发开盖指令,区分耳机通道。
#elif ZHONGKE
HandleTxCommand(VHOUSE_CMD_CLOSE_WIN_GET_VBAT,VOL_CHAN); //左耳发开盖指令,区分耳机通道。
#elif XUANHENG
HandleTxCommand(CMD_TWS_GET_BTADDR,VOL_CHAN);
#endif
#endif
}
else
if( (Vox_Output_Debounce % Vox_TX_Interval) == 0 ) //200ms发送一次
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_CLOSE_WIN_GET_VBAT,VOR_CHAN); //右耳发开盖指令,区分耳机通道。
#elif ZHONGKE
HandleTxCommand(VHOUSE_CMD_CLOSE_WIN_GET_VBAT,VOR_CHAN); //右耳发开盖指令,区分耳机通道。
#elif XUANHENG
HandleTxCommand(CMD_TWS_GET_BTADDR,VOR_CHAN);
#endif
#endif
}
Vox_Output_Debounce++;
return;
}
}
}
/* 发完关盖码后开启VOX VOUT 5V输出。 */
if( Cover_Close_Flag1 )
{
VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V
#ifdef _DEBUG_VOX
printf("VOX Vout 5V(VOX_STA:0x%x,line:%d).\r\n",(uint16_t)(pmu_Info.pmu_VOX_STA), (uint16_t)__LINE__);
#endif
Cover_Close_Flag1 = 0;
}
else
{
if( !Vox_Chg_Full_Flag )
{
if( ( (pmu_Info.pmu_VOX_STA & ( VOR_Ioff | VOL_Ioff ) ) == ( VOR_Ioff | VOL_Ioff ) )|| !( pmu_Info.pmu_VOX_STA & ( VOL_LoadOn | VOR_LoadOn ) ) || F_batlevel_low ) //耳机充满、VOX无负载、盒子低电则关闭Vout输出通路关闭Boost。
{
if( Vox_Voltage_Hold_Timer <= VOX_CHG_FULL_5V_LEAST_CNT ) //重载转轻载延时5s后关闭Boost输出。
{
Vox_Voltage_Hold_Timer++;
return;
}
#ifdef _DEBUG_VOX
printf("VOX CHG Full.\r\n");
#endif
Vox_Chg_Full_Flag = 1;
Vox_Output_Cnt = 0;
Vox_Voltage_Hold_Timer = 0;
Vox_Getinto_Sleep_Flag = 0;
VOX_EN_Type(VOX_ADT_Mode); //VOX Enable ADT
}
else
{
#if VOX_FOLLOW_CHG
if ( Vox_Fllow_Chg.Vox_Follow_Stop == OFF )
{
Vox_Follow_Chg( &Vox_Fllow_Chg ); //跟随充处理。
}
#endif
}
}
else
{
if( Vox_Output_Cnt <= Vox_COM_MSG_Tim )
{
if( (Vox_Output_Cnt % Vox_TX_Interval_2) == 0 ) //200ms发送一次
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_SHUT_DOWN,VOL_CHAN); //左耳发关机指令,区分耳机通道。
#else
HandleTxCommand(VHOUSE_CMD_PWROFF,VOL_CHAN); //左耳发关机指令,区分耳机通道。
#endif
#endif
}
else
if( (Vox_Output_Cnt % Vox_TX_Interval) == 0 ) //200ms发送一次
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_SHUT_DOWN,VOR_CHAN); //右耳发关机指令,区分耳机通道。
#else
HandleTxCommand(VHOUSE_CMD_PWROFF,VOR_CHAN); //右耳发关机指令,区分耳机通道。
#endif
#endif
}
Vox_Output_Cnt++;
}
else
{
if( !Vox_Getinto_Sleep_Flag )
{
Vox_Getinto_Sleep_Flag = 1;
VOX_EN_Type(VOX_ADT_Mode);
Vox_Vout_Enable = OFF;
#ifdef _DEBUG_VOX
printf("VOX Get Into Sleep.\r\n");
#endif
}
}
}
}
}
Bat_Low_Pro_Flag = 0;
}
else
{
if( !Bat_Low_Pro_Flag ) //低电保护后VOX开启ADT模式。判断耳机出入盒并显示相应的灯效。
{
Bat_Low_Pro_Flag = 1;
VOX_EN_Type(VOX_ADT_Mode);
Vox_Vout_Enable = OFF;
CHIP_STA1_BK = pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn );
return;
}
/*耳机出入盒判断*/
if( CHIP_STA1_BK != ( pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn ) ) ) //查询耳机loadon状态loadon状态改变则说明有耳机出入盒。
{
if( pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn ) )
{
Earphone_Chg_Flag_led = 1;
#ifdef LED_DISPLAY
LED_On_Flag = 1;
#endif
}
CHIP_STA1_BK = ( pmu_Info.pmu_VOX_STA & ( VOR_LoadOn | VOL_LoadOn ) );
}
}
}
#if VOX_FOLLOW_CHG
/*
*******************************************************************************
* void Vox_Follow_Chg( g_Vox_Fllow_Chg_Cfg *g_Vox_Fllow_Chg )
*
* Description : Vox 跟随充处理函数。 (40ms调用周期)
*
* Arguments : g_Vox_Fllow_Chg_Cfg *g_Vox_Fllow_Chg
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void Vox_Follow_Chg( g_Vox_Fllow_Chg_Cfg *n_Vox_Fllow_Chg )
{
static bit nVpmid_Value_Setting;
switch (Follow_Chg_Sta)
{
case Vox_Follow_Chg_InitSta: //STA0:PMID=5.2V可以保证耳机一定能进入充电状态,并持续一段时间保证耳机能开始抽电。
if( (n_Vox_Fllow_Chg->Vox_Follow_Stop == OFF) ) //启动跟随充
{
if( Vox_Follow_Init_Deb <= VOX_FOLLOW_CHG_INIT_CNT ) //Vout输出5.25V,保证耳机被唤醒。
{
Vox_Follow_Init_Deb++;
n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present = VOUT_MAX_THD;
if( !nVpmid_Value_Setting )
{
Set_PMU_Boost_Vout(n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present);
#ifdef _DEBUG_FOLLOW
printf("Follow CHG InitSta Set Max Vpmid.(Vox_sta:0x%x)(line:%d)\r\n",(u16)pmu_Info.pmu_VOX_STA, (u16)__LINE__);
#endif
nVpmid_Value_Setting = 1;
}
}
else
{
Vox_Follow_Init_Deb = 0;
/* 参数初始化。 */
nVpmid_Value_Setting = 0;
n_Vox_Fllow_Chg->Vpmid_AddSta[VOR_CHAN] = OFF;
n_Vox_Fllow_Chg->Vpmid_AddSta[VOL_CHAN] = OFF;
n_Vox_Fllow_Chg->Vpmid_SubSta[VOR_CHAN] = OFF;
n_Vox_Fllow_Chg->Vpmid_SubSta[VOL_CHAN] = OFF;
n_Vox_Fllow_Chg->IVox_TC_Mode[VOR_CHAN] = OFF;
n_Vox_Fllow_Chg->IVox_TC_Mode[VOL_CHAN] = OFF;
n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] = OFF;
n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] = OFF;
n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] = 0;
n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] = 0;
n_Vox_Fllow_Chg->Vpmid_Threshold_Neg = VOUT_MIN_THD;
n_Vox_Fllow_Chg->Vpmid_Threshold_Pos = VOUT_MAX_THD;
Follow_Chg_Sta = Vox_Follow_Chg_Sta1;
Vox_Follow_Chg_Debounce = 0;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG InitSta.(Vox_sta:0x%x)(line:%d)\r\n",(u16)pmu_Info.pmu_VOX_STA, (u16)__LINE__);
#endif
}
}
break;
case Vox_Follow_Chg_Sta1: //STA1:获取耳机当前抽电电流和设置Vox上下限电流阈值。
if ( ( pmu_Info.pmu_VOX_STA & VOR_Ioff ) && ( pmu_Info.pmu_VOX_STA & VOL_Ioff ) ) //VOL、VOR耳机无抽电则说明耳机已充满无需再继续跟随充。
{
n_Vox_Fllow_Chg->Vox_Follow_Stop = ON;
Follow_Chg_Sta = Vox_Follow_Chg_InitSta;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta1,No EarPhone In Box.(line:%d)\r\n",(u16)__LINE__);
#endif
}
else
{
/*获取当前Ivox。Vox开启功率且Ioff处于重载状态。*/
if( !(pmu_Info.pmu_VOX_STA & VOR_Ioff) )
{
n_Vox_Fllow_Chg->IVox_Init[VOR_CHAN] = g_pmu_Adc_Ivor;
n_Vox_Fllow_Chg->IVox_Threshold_Neg[VOR_CHAN] = IVOR_Threshold_Neg(g_pmu_Adc_Ivor); //Ivox_Threshold_Neg = IVox_Init * 80%
n_Vox_Fllow_Chg->IVox_Threshold_Pos[VOR_CHAN] = IVOR_Threshold_Pos(g_pmu_Adc_Ivor); //Ivox_Threshold_Neg = IVox_Init * 2
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta1,VOR Chging(Ivor:%dmA).(line:%d)\r\n",g_pmu_Adc_Ivor,(u16)__LINE__);
#endif
}
if( !(pmu_Info.pmu_VOX_STA & VOL_Ioff) )
{
n_Vox_Fllow_Chg->IVox_Init[VOL_CHAN] = g_pmu_Adc_Ivol;
n_Vox_Fllow_Chg->IVox_Threshold_Neg[VOL_CHAN] = IVOL_Threshold_Neg(g_pmu_Adc_Ivol); //Ivox_Threshold_Neg = IVox_Init * 80%
n_Vox_Fllow_Chg->IVox_Threshold_Pos[VOL_CHAN] = IVOL_Threshold_Pos(g_pmu_Adc_Ivol); //Ivox_Threshold_Neg = IVox_Init * 2
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta1,VOL Chging(Ivol:%dmA).(line:%d)\r\n",(u16)g_pmu_Adc_Ivol,(uint16_t)__LINE__);
#endif
}
n_Vox_Fllow_Chg->Vox_Follow_Start = ON;
Follow_Chg_Sta = Vox_Follow_Chg_Sta2;
}
break;
case Vox_Follow_Chg_Sta2: //STA2:获取当前Vox电流等待IVOX电流稳定检测当前电流IVox_At_Present。
if( Vox_Follow_Chg_Debounce <= VOX_FOLLOW_CHG_NOWCURCHK_CNT )
{
Vox_Follow_Chg_Debounce++;
}
else
{
Vox_Follow_Chg_Debounce = 0;
if ( !(pmu_Info.pmu_VOX_STA & VOR_Ioff) )
{
n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] = g_pmu_Adc_Ivor;
n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] = ON; //判断VOR有耳机在盒正常抽电
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta2,Get IVOR:%dmA.(line:%d)\r\n",(uint16_t)g_pmu_Adc_Ivor,(u16)__LINE__);
#endif
}
if ( !(pmu_Info.pmu_VOX_STA & VOL_Ioff) )
{
n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] = g_pmu_Adc_Ivol;
n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] = ON; //判断VOL有耳机在盒正常抽电
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta2,Get IVOL:%dmA.(line:%d)\r\n",(uint16_t)g_pmu_Adc_Ivol,(u16)__LINE__);
#endif
}
Follow_Chg_Sta = Vox_Follow_Chg_Sta3;
}
break;
case Vox_Follow_Chg_Sta3: //STA3:根据Ivox电流判断PMID是否需要降低。
if( Vox_Follow_Chg_Debounce <= VOX_FOLLOW_CHG_VOLTAGE_ADJUST_CNT )
{
Vox_Follow_Chg_Debounce++;
}
else
{
Vox_Follow_Chg_Debounce = 0;
if ( ( n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] > n_Vox_Fllow_Chg->IVox_Threshold_Pos[VOR_CHAN] ) || \
( n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] > n_Vox_Fllow_Chg->IVox_Threshold_Pos[VOL_CHAN] ) ) //当前电流大于THP阈值电流则说明耳机状态发生改变TC跳转到CC或Recharge复充需要重启跟随充。
{
Follow_Chg_Sta = Vox_Follow_Chg_InitSta;
n_Vox_Fllow_Chg->Vox_Follow_Start = OFF; //重启动跟随充
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta3,VOX Chg ReInit.(line:%d)\r\n",(uint16_t)__LINE__);
#endif
}
else
{
if ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] == ON )
{
if ( n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] <= VOX_CV_TC_CURRENT ) //检测到Ivor小于CV/TC电流阈值则说明耳机进入CV/TC阶段
{
if ( pmu_Info.pmu_VOX_STA & VOR_Ioff ) //检测到Ivor Ioff则VPMID升档。
{
n_Vox_Fllow_Chg->Vpmid_AddSta[VOR_CHAN] = ON;
if ( n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present >= VOUT_MAX_THD ) //Vpmid电压升到最大并且IOFF标志存在则说明耳机充满。
{
n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] = OFF;
}
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta3(CV),VOR Vpmid AddSta(Ivor:%dmA).(line:%d)\r\n",n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN],(u16)__LINE__);
#endif
}
else //未检测到Ivor Ioff则Vpmid降档
{
n_Vox_Fllow_Chg->Vpmid_SubSta[VOR_CHAN] = ON;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta3(CV),VOR Vpmid SubSta(Ivor:%dmA).(line:%d)\r\n",n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN],(u16)__LINE__);
#endif
}
}
else
{
if ( n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] > n_Vox_Fllow_Chg->IVox_Threshold_Neg[VOR_CHAN] )
{
n_Vox_Fllow_Chg->Vpmid_SubSta[VOR_CHAN] = ON;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta3(CC),VOR Vpmid SubSta(Ivor:%dmA).(line:%d)\r\n",n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN],(u16)__LINE__);
#endif
}
else
{
n_Vox_Fllow_Chg->Vpmid_AddSta[VOR_CHAN] = ON;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta3(CC),VOR Vpmid AddSta(Ivor:%dmA).(line:%d)\r\n",n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN],(u16)__LINE__);
#endif
}
}
}
if ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] == ON )
{
if ( n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] <= VOX_CV_TC_CURRENT ) //检测到Ivol小于CV/TC电流阈值则说明耳机进入CV/TC阶段
{
if ( pmu_Info.pmu_VOX_STA & VOL_Ioff ) //检测到Ivol Ioff则VPMID升档。
{
n_Vox_Fllow_Chg->Vpmid_AddSta[VOL_CHAN] = ON;
if ( n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present >= VOUT_MAX_THD ) //Vpmid电压升到最大并且IOFF标志存在则说明耳机充满。
{
n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] = OFF;
}
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta3(CV),VOL Vpmid AddSta(Ivol:%dmA).(line:%d)\r\n",n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN],(u16)__LINE__);
#endif
}
else //未检测到Ivol Ioff则Vpmid降档
{
n_Vox_Fllow_Chg->Vpmid_SubSta[VOL_CHAN] = ON;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta3(CV),VOL Vpmid SubSta(Ivol:%dmA).(line:%d)\r\n",n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN],(u16)__LINE__);
#endif
}
}
else
{
if ( n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] > n_Vox_Fllow_Chg->IVox_Threshold_Neg[VOL_CHAN] )
{
n_Vox_Fllow_Chg->Vpmid_SubSta[VOL_CHAN] = ON;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta3(CC),VOL Vpmid SubSta(Ivol:%dmA).(line:%d)\r\n",n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN],(u16)__LINE__);
#endif
}
else
{
n_Vox_Fllow_Chg->Vpmid_AddSta[VOL_CHAN] = ON;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta3(CC),VOL Vpmid AddSta(Ivol:%dmA).(line:%d)\r\n",n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN],(u16)__LINE__);
#endif
}
}
}
}
}
break;
case Vox_Follow_Chg_Sta4: //STA4:根据IVOX电流判断PMID是否升高1、在此状态下每2s检测一次IVOX电流2、当检测到 IVOX < IVOX_THN or IVOX > IVOX_THP,则PMID 升高一个step或N个step根据实际测试设定。
if( Vox_Follow_Chg_Debounce <= VOX_FOLLOW_CHG_PMID_UP_CNT )
{
/* 每2s检测一次IVOX电流。 */
Vox_Follow_Chg_Debounce++;
n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] = g_pmu_Adc_Ivor;
n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] = g_pmu_Adc_Ivol;
}
else
{
Vox_Follow_Chg_Debounce = 0;
/* 充电效率优先 */
#ifdef FOLLOW_CHG_EFFICIENCY
if ( ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] == ON ) && ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] == ON ) )
{
if ( ( ( n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] < n_Vox_Fllow_Chg->IVox_Threshold_Neg[VOR_CHAN] ) || \
( n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] > n_Vox_Fllow_Chg->IVox_Threshold_Pos[VOR_CHAN] ) ) && \
( ( n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] < n_Vox_Fllow_Chg->IVox_Threshold_Neg[VOL_CHAN] ) || \
( n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] > n_Vox_Fllow_Chg->IVox_Threshold_Pos[VOL_CHAN] ) ) )
{
n_Vox_Fllow_Chg->Vpmid_AddSta[VOR_CHAN] = ON;
n_Vox_Fllow_Chg->Vpmid_AddSta[VOL_CHAN] = ON;
Follow_Chg_Sta = Vox_Follow_Chg_Sta2;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta4,VOx Vpmid AddSta(Vout:0x%x,Ivol:%dmA,Ivor:%dmA)(line:%d).\r\n",(uint16_t)n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present,(uint16_t)g_pmu_Adc_Ivol,(uint16_t)g_pmu_Adc_Ivor,(u16)__LINE__);
#endif
}
#ifdef _DEBUG_FOLLOW
else
{
printf("Follow CHG Sta4,VOx Ching(Vout:0x%x,Ivol:%dmA,Ivor:%dmA)(line:%d).\r\n",(uint16_t)n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present,(uint16_t)g_pmu_Adc_Ivol,(uint16_t)g_pmu_Adc_Ivor,(u16)__LINE__);
}
#endif
}
else
#endif
{
/* 充电速度优先 */
if ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] == ON )
{
/* 当检测到 IVOX < IVOX_THN or IVOX > IVOX_THP,则PMID 升高一个step或N个step根据实际测试设定。 */
if ( ( n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] < n_Vox_Fllow_Chg->IVox_Threshold_Neg[VOR_CHAN] ) || \
( n_Vox_Fllow_Chg->IVox_At_Present[VOR_CHAN] > n_Vox_Fllow_Chg->IVox_Threshold_Pos[VOR_CHAN] ) )
{
n_Vox_Fllow_Chg->Vpmid_AddSta[VOR_CHAN] = ON;
Follow_Chg_Sta = Vox_Follow_Chg_Sta2;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta4,VOR Vpmid AddSta(Vout:0x%x,Ivor:%dmA)(line:%d).\r\n",(uint16_t)n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present,(uint16_t)g_pmu_Adc_Ivor,(u16)__LINE__);
#endif
}
#ifdef _DEBUG_FOLLOW
else
{
printf("Follow CHG Sta4,VOR Ching(Vout:0x%x,Ivor:%dmA)(line:%d).\r\n",(uint16_t)n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present,(uint16_t)g_pmu_Adc_Ivor,(u16)__LINE__);
}
#endif
}
if ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] == ON )
{
if ( ( n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] > n_Vox_Fllow_Chg->IVox_Threshold_Pos[VOL_CHAN] ) || \
( n_Vox_Fllow_Chg->IVox_At_Present[VOL_CHAN] < n_Vox_Fllow_Chg->IVox_Threshold_Neg[VOL_CHAN] ) )
{
n_Vox_Fllow_Chg->Vpmid_AddSta[VOL_CHAN] = ON;
Follow_Chg_Sta = Vox_Follow_Chg_Sta2;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG Sta4,VOL Vpmid AddSta(Vout:0x%x,Ivol:%dmA)(line:%d).\r\n",(uint16_t)n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present,(uint16_t)g_pmu_Adc_Ivol,(u16)__LINE__);
#endif
}
#ifdef _DEBUG_FOLLOW
else
{
printf("Follow CHG Sta4,VOL Ching(Vout:0x%x,Ivol:%dmA)(line:%d).\r\n",(uint16_t)n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present,(uint16_t)g_pmu_Adc_Ivol,(u16)__LINE__);
}
#endif
}
}
}
break;
default:
break;
}
if( ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] == ON ) || ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] == ON ) )
{
if( ( n_Vox_Fllow_Chg->Vpmid_SubSta[VOR_CHAN] == ON ) || ( n_Vox_Fllow_Chg->Vpmid_SubSta[VOL_CHAN] == ON ) ) //当需要降压Vpmid则每降一次档位都会充电至少2s。
{
if( ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] == ON ) && ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] == ON ) )
{
if( ( n_Vox_Fllow_Chg->Vpmid_SubSta[VOR_CHAN] == ON ) && ( n_Vox_Fllow_Chg->Vpmid_SubSta[VOR_CHAN] == ON ) )
{
n_Vox_Fllow_Chg->Vpmid_SubSta_Flag = ON;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG SubSta,VOL/VOR(line:%d).\r\n",(uint16_t)__LINE__);
#endif
}
}
if( ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] == ON ) && ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] == OFF ) )
{
if( n_Vox_Fllow_Chg->Vpmid_SubSta[VOR_CHAN] == ON )
{
n_Vox_Fllow_Chg->Vpmid_SubSta_Flag = ON;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG SubSta,VOR(line:%d).\r\n",(uint16_t)__LINE__);
#endif
}
}
else
if( ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOR_CHAN] == OFF ) && ( n_Vox_Fllow_Chg->Vox_InBox_Sta[VOL_CHAN] == ON ) )
{
if( n_Vox_Fllow_Chg->Vpmid_SubSta[VOL_CHAN] == ON )
{
n_Vox_Fllow_Chg->Vpmid_SubSta_Flag = ON;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG SubSta,VOL(line:%d).\r\n",(uint16_t)__LINE__);
#endif
}
}
n_Vox_Fllow_Chg->Vpmid_SubSta[VOR_CHAN] = OFF;
n_Vox_Fllow_Chg->Vpmid_SubSta[VOL_CHAN] = OFF;
if ( n_Vox_Fllow_Chg->Vpmid_SubSta_Flag == ON )
{
if( n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present > VOUT_MIN_THD )
{
n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present = n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present - VOX_FOLLOW_CHG_PMID_DOWN_STEPS;
}
if( n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present <= n_Vox_Fllow_Chg->Vpmid_Threshold_Neg ) //当Vpmid降档到到下限阈值则开始升压。
{
n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present = n_Vox_Fllow_Chg->Vpmid_Threshold_Neg;
Follow_Chg_Sta = Vox_Follow_Chg_Sta4;
}
else
{
Follow_Chg_Sta = Vox_Follow_Chg_Sta2;
}
Vox_Follow_Chg_Debounce = 0;
n_Vox_Fllow_Chg->Vpmid_SubSta_Flag = OFF;
#ifdef _DEBUG_FOLLOW
printf("Follow CHG SubSta,(STA:0x%x,Vpmid:0x%x)(line:%d)\r\n",(u16)Follow_Chg_Sta,(u16)n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present,(u16)__LINE__);
#endif
Set_PMU_Boost_Vout( n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present );
}
}
else
{
/* PMID > PMID_THP且VOL和VOR的任意一支路电流超过阈值Ivol_THN > Ivol > Ivol_THP 或 Ivor_THN > Ivor > Ivor_THP。*/
if( ( n_Vox_Fllow_Chg->Vpmid_AddSta[VOR_CHAN] == ON ) || ( n_Vox_Fllow_Chg->Vpmid_AddSta[VOL_CHAN] == ON ) )
{
n_Vox_Fllow_Chg->Vpmid_AddSta[VOR_CHAN] = OFF;
n_Vox_Fllow_Chg->Vpmid_AddSta[VOL_CHAN] = OFF;
if( n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present < VOUT_MAX_THD )
{
n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present = n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present + VOX_FOLLOW_CHG_PMID_UP_STEPS;
}
Follow_Chg_Sta = Vox_Follow_Chg_Sta4; //当有需要升压Vpmid则需要重回Sta4。
/* 当VPMID 上升到上限阈值则说明本轮跟随充调整结束则重回StaInit。 */
if( n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present >= n_Vox_Fllow_Chg->Vpmid_Threshold_Pos )
{
n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present = n_Vox_Fllow_Chg->Vpmid_Threshold_Pos;
Follow_Chg_Sta = Vox_Follow_Chg_Sta1;
}
#ifdef _DEBUG_FOLLOW
printf("Follow CHG AddSta,(STA:0x%x,Vpmid:0x%x)(line:%d)\r\n",(uint16_t)Follow_Chg_Sta,(uint16_t)n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present,(uint16_t)__LINE__);
#endif
Set_PMU_Boost_Vout(n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present);
}
}
}
else
{
if( Follow_Chg_Sta > Vox_Follow_Chg_Sta2 )
{
Follow_Chg_Sta = Vox_Follow_Chg_InitSta;
n_Vox_Fllow_Chg->Vox_Follow_Stop = ON;
}
}
}
#endif
#if XUANHENG
/*
*******************************************************************************
* u16 CalCheckCrc16(u8 * pucFrame, u16 usLen)
*
* Description : 校验和的计算(CRC-16-CCITT-FALSE)
*
*
* Arguments : u8 *pucFrame: 数据存放地址
u16 usLen: 数据长度, 以byte为单位
* Returns :
*
* Notes :
*
*******************************************************************************
*/
uint16_t CalCheckCrc16(uint8_t *pucFrame, unsigned int usLen)
{
uint16_t wCRCin = 0xFFFF;
uint16_t wCPoly = 0x1021;
uint8_t wChar = 0;
unsigned int i;
while (usLen--)
{
wChar = *(pucFrame++);
wCRCin ^= (wChar << 8);
for(i = 0;i < 8;i++)
{
if(wCRCin & 0x8000)
{
wCRCin = (wCRCin << 1) ^ wCPoly;
}
else
{
wCRCin = wCRCin << 1;
}
}
}
return (wCRCin);
}
#else
/*
*******************************************************************************
* uint8_t Crc8Maxim(u8 *buf, u8 length)
*
* Description : 校验和的计算
*
*
* Arguments : u8 *buf: 数据存放地址
u8 length: 数据长度, 以byte为单位
* Returns :
*
* Notes :
*
*******************************************************************************
*/
uint8_t Crc8Maxim(u8 *buf, u8 length)
{
u8 i;
u8 crc = 0;
while(length--)
{
crc ^= *buf++;
for(i=0;i<8;i++)
{
if( crc&1 )
{
crc = (crc >> 1)^0x8c;
}
else
{
crc >>= 1;
}
}
}
return crc;
}
#endif
#ifdef VOX_TX
/*
*******************************************************************************
* void HandleTxCommand(VOX_BES_COMMAND_E RxCommand, e_Vox_Chan nVox_Chn_Select)
*
* Description : 发送数据包的封装,并打开相应的双向通信通道
* Command payload
* Header checksum side cmd len Data
* 1bytes 1byte 1byte 1byte 1byte Len bytes
*
* 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)
{
uint16_t dataLen = 0;
uint8_t tx_pData[COM0_Data_Lenth] = 0;
uint8_t i = 0;
#if JIELI
/*数据包头*/
tx_pData[0] = 0x00;
tx_pData[1] = BOXHEADER>>8;
tx_pData[2] = BOXHEADER;
/*指令编号*/
tx_pData[4] = TxCommand;
Vox_Type = nVox_Chn_Select;
switch(TxCommand)
{
case VHOUSE_CMD_PAIR:
/*Data Length*/
tx_pData[3] = 0x02;
if( nVox_Chn_Select == VOL_CHAN )
{
tx_pData[5] = 0x02;
Vox_Get_BES_Addr_Flag[VOL_TYPE] = 0;
}
else
if( nVox_Chn_Select == VOR_CHAN )
{
tx_pData[5] = 0x01;
Vox_Get_BES_Addr_Flag[VOR_TYPE] = 0;
}
break;
case VHOUSE_CMD_EXCH_TWS_BTADDR:
/*Data Length*/
tx_pData[3] = MAX_PACKET_SIZE;
for(i=5;i<18;i++)
{
tx_pData[i] = MAC_Addr[nVox_Chn_Select][i];
}
for(i=23;i<13;i++)
{
tx_pData[i] = Net_Info[nVox_Chn_Select][i];
}
break;
case VHOUSE_CMD_CLEAR_PAIR:
/*Data Length*/
tx_pData[3] = 0x02;
tx_pData[5] = 0x03;
break;
case VHOUSE_CMD_CLOSE_WIN_GET_VBAT: //和开盖命令一样。
case VHOUSE_CMD_OPEN_BOX: //开盖获取电量命令
/*Data Length*/
tx_pData[3] = 0x05;
tx_pData[5] = FW_VER; //Version
tx_pData[6] = bat_level * 5; //电仓电量值 0~100
tx_pData[7] = MAX_PACKET_SIZE; //max_packet_size:0x20
if( nVox_Chn_Select == VOL_CHAN )
{
if( Earphone_Vbat[VOL_CHAN] == 0 )
{
tx_pData[8] = 0xFF;
}
else
{
tx_pData[8] = Earphone_Vbat[VOR_CHAN];
}
}
else
if( nVox_Chn_Select == VOR_CHAN )
{
if( Earphone_Vbat[VOR_CHAN] == 0 )
{
tx_pData[8] = 0xFF;
}
else
{
tx_pData[8] = Earphone_Vbat[VOL_CHAN];
}
}
break;
case VHOUSE_CMD_PWROFF:
/*Data Length*/
tx_pData[3] = 0x01;
break;
case VHOUSE_CMD_CLOSE_BOX: //关盖指令
/*Data Length*/
tx_pData[3] = 0x02;
tx_pData[5] = EarPhone_Num; //耳机个数
break;
default:
break;
}
dataLen = 4 + tx_pData[3];
tx_pData[dataLen] = Crc8Maxim(tx_pData,dataLen);
#elif ZHONGKE
/*数据包头*/
tx_pData[0] = BOXHEADER>>8;
tx_pData[1] = BOXHEADER;
/*充电仓识别码*/
tx_pData[2] = BOXIDCODE;
/*耳机通道*/
tx_pData[5] = nVox_Chn_Select;
/*指令编号*/
tx_pData[3] = TxCommand;
switch(TxCommand)
{
case VHOUSE_CMD_GET_VBAT:
case VHOUSE_CMD_OPEN_WINDOW:
case VHOUSE_CMD_CLOSE_WIN_GET_VBAT:
/*Data Length*/
tx_pData[4] = 0x03;
tx_pData[6] = ( ( ChgStatus & CHG_STA_ING ) << 6 ) | bat_level; //bit 0~6 表示充电仓电量值 0~100bit 7 为 1 表示在给充电仓充电,为 0 表示没有给充电仓充电;
tx_pData[7] = 0x00;
break;
case VHOUSE_CMD_PAIR: //长按充电仓按键3s充电仓发送配对指令。
/*
发送给右耳 CMD2右耳接收到发送 CMD3 指令给充电仓,充电仓 copy 该指令给
左耳,充电仓可随即发送 CMD2 指令给左耳,左耳会发送 CMD=0x03 给充电仓,充电仓直接
copy CMD3 给右耳即可,右耳接收到发送 VHOUSE_CMD_SUCCES 指令给充电仓。
*/
/*Data Length*/
tx_pData[4] = 0x01;
break;
case VHOUSE_CMD_GET_TWS_BTADDR: //将收到的CMD3转发给对耳。
#ifdef VOX_RX
for(i=0;i<COM0_Data_Lenth;i++)
{
tx_pData[i] = RX0_Buffer[i];
}
#endif
break;
case VHOUSE_CMD_CLEAR_PAIR:
/*Data Length*/
tx_pData[4] = 0x01;
break;
case VHOUSE_CMD_CLOSE_WINDOW:
/*Data Length*/
tx_pData[4] = 0x01;
break;
case VHOUSE_CMD_PWROFF:
/*Data Length*/
tx_pData[4] = 0x01;
break;
default:
break;
}
dataLen = tx_pData[4] + 5;
tx_pData[dataLen] = Crc8Maxim(tx_pData,dataLen);
#elif XUANHENG
uint16_t Checksum = 0;
/*数据包头*/
tx_pData[0] = BOXHEADER;
/*耳机通道*/
tx_pData[1] = nVox_Chn_Select; /*传输方向Bit0-3接收端Bit4-7发送端
1双耳
2充电盒
3PC/工装
4左耳
5右耳
*/
/*指令编号*/
tx_pData[2] = TxCommand;
tx_pData[3] = TxCommand >> 8; /*小端模式:低字节在前
Bit0-7命令号
Bit8-14预留
Bit15:包类型
0:REQ
1:ACK
*/
tx_pData[4] = CoverStatus; //开关盒状态
switch(TxCommand)
{
case CMD_TWS_GET_BTADDR: //获取耳机MAC地址
/*Data Length*/
tx_pData[5] = 0x00; //小端模式低位在前长2Bytes。
tx_pData[6] = 0x00;
#ifdef VOX_RX
for(i=0;i<6;i++)
{
BES_Addr[i] = 0; //清本地耳机蓝牙地址。
}
#endif
break;
case CMD_TWS_SET_BTADDR:
/*Data Length*/
tx_pData[5] = 0x0E; //小端模式低位在前长2Bytes。
tx_pData[6] = 0x00;
#ifdef VOX_RX
for(i=0;i<6;i++)
{
tx_pData[7+i] = BES_Addr[i]; //发送耳机蓝牙地址。
}
#endif
for(i=0;i<8;i++)
{
tx_pData[13+i] = Random_Data[i]; //发送随机数。
}
break;
case CMD_SHUT_DOWN:
/*Data Length*/
tx_pData[5] = 0x01; //小端模式低位在前长2Bytes。
tx_pData[6] = 0x00;
tx_pData[7] = gShip_Mode_Flag; //船运模式0正常关机1船运模式
break;
case CMD_PAIRING_IMD: //立即执行TWS配对
/*Data Length*/
tx_pData[5] = 0x00; //小端模式低位在前长2Bytes。
tx_pData[6] = 0x00;
break;
case CMD_CLEAR_PAIR:
/*Data Length*/
tx_pData[5] = 0x00; //小端模式低位在前长2Bytes。
tx_pData[6] = 0x00;
break;
case CMD_HEARTBEAT:
/*Data Length*/
tx_pData[5] = 0x05; //小端模式低位在前长2Bytes。
tx_pData[6] = 0x00;
/*
data定义
1、D0、D12Bytes构成充电盒的版本信息D0的高4bit为充电盒硬件PCBA版本号D0低4bit和D1构成充电盒软件版本号。
2、D21Byte构成充电盒电量和充电状态D2的bit7为是否有PG接入D2的低7位表示充电盒电量信息范围0-100;
3、D31Byte构成对耳电量信息根据协议中的Side信息区分左右耳电量信息。
4、D41Byte耳机静默升级充电盒默认发0x00
*/
tx_pData[7] = HW_VER << 4;
tx_pData[7] |= FW_VER >> 8;
tx_pData[8] = FW_VER;
tx_pData[9] = ( ( ChgStatus & CHG_STA_ING ) << 6 ) | ( 5 * bat_level );
if(nVox_Chn_Select == VOL_CHAN)
{
tx_pData[10] = Bes_Bet_Level[0];
}
else
if(nVox_Chn_Select == VOR_CHAN)
{
tx_pData[10] = Bes_Bet_Level[1];
}
tx_pData[11] = 0x00;
break;
case CMD_SN: //由于SN码较长充电盒需分多次发送D0表示充第几位开始发送一次固定发送9Bytes。最后一包SN数据不够9Bytes的补0或0xff。
/*Data Length*/
tx_pData[5] = 0x0A; //小端模式低位在前长2Bytes。
tx_pData[6] = 0x00;
tx_pData[7] = SN_Num_Start;
for(i=0;i<9;i++)
{
if( (SN_Num_Start + i) > 22 )
{
tx_pData[8+i] = 0xFF;
}
else
{
tx_pData[8+i] = SN_Num[ SN_Num_Start + i ]; //发送随机数。
}
}
SN_Num_Start += 9;
break;
case CMD_GET_INTO_PAIR:
/*Data Length*/
tx_pData[5] = 0x01; //小端模式低位在前长2Bytes。
tx_pData[6] = 0x00;
tx_pData[7] = 0x01; //01进入配对状态
break;
case BES_RESET: //复位patten
return;
default:
break;
}
dataLen = (uint16_t)( tx_pData[5] | ( tx_pData[6] << 8 ) ) + 7;
Checksum = CalCheckCrc16( tx_pData, dataLen ); //计算检验和
tx_pData[ dataLen ] = Checksum;
tx_pData[ ++dataLen ] = Checksum >> 8;
#endif
/* vor、vol都使用uart0进行分时通讯。 */
VOX_EN_Type( VOX_COMM_Mode_Uart );
if(nVox_Chn_Select == VOR_CHAN)
{
SFRADDR = MFP_CTL0; //关闭VOR到UART0的开关配置P02为GPIOP03为UART0。
SFRDATA &=~ 0x0F;
SFRDATA |= 0x08;
}
else
if(nVox_Chn_Select == VOL_CHAN)
{
SFRADDR = MFP_CTL0; //关闭VOL到UART0的开关配置P03为GPIOP02为UART0。
SFRDATA &=~ 0x0F;
SFRDATA |= 0x01;
}
#if UART0_ENABLE
Uart0SendPacket(dataLen + 2, tx_pData);
#endif
if(nVox_Chn_Select == VOR_CHAN)
{
SFRADDR = P0_IE; //Set P03 As Input.
SFRDATA &=~ 0x0C;
SFRDATA |= 0x08;
}
else
if(nVox_Chn_Select == VOL_CHAN)
{
SFRADDR = P0_IE; //Set P02 As Input.
SFRDATA &=~ 0x0C;
SFRDATA |= 0x04;
}
}
#endif
#ifdef VOX_RX
/*
*******************************************************************************
* void HandleRxCommand(VOX_BES_COMMAND_E RxCommand)
*
* Description : 耳机端发送的数据包的解析及处理
* Ack payload:
* Header checksum side cmd len Data
* 1bytes 1byte 1byte 1byte 1byte Len bytes
*
* Arguments : VOX_BES_COMMAND_E RxCommand:
* Returns :
*
* Notes :
*
*******************************************************************************
*/
void HandleRxMsg(VOX_BES_COMMAND_E RxCommand)
{
uint8_t i = 0;
#if JIELI
switch(RxCommand)
{
case VHOUSE_CMD_PAIR:
for(i=0;i<18;i++)
{
MAC_Addr[Vox_Type][i] = RX0_Buffer[4+i];
}
for(i=0;i<8;i++)
{
Net_Info[Vox_Type][i] = RX0_Buffer[22+i];
}
if( Vox_Type == VOL_CHAN ) //根据耳机Side参数
{
Vox_Get_BES_Addr_Flag[VOL_TYPE] = 1; //获取左耳机发的CMD3
}
else
{
Vox_Get_BES_Addr_Flag[VOR_TYPE] = 1; //获取右耳机发的CMD3
}
break;
case VHOUSE_CMD_EXCH_TWS_BTADDR:
break;
case VHOUSE_CMD_OPEN_BOX:
case VHOUSE_CMD_CLOSE_WIN_GET_VBAT:
if( RX0_Buffer[4] == 0xE3 ) //根据耳机Side参数
{
Vox_Get_Vbat_Flag[VOL_TYPE] = 1; //获取左耳机发的Vbat
Earphone_Vbat[VOL_CHAN] = RX0_Buffer[5];
}
else
{
Vox_Get_Vbat_Flag[VOR_TYPE] = 1; //获取右耳机发的Vbat
Earphone_Vbat[VOR_CHAN] = RX0_Buffer[5];
}
break;
case VHOUSE_CMD_CLOSE_BOX:
break;
case VHOUSE_CMD_PWROFF:
break;
default:
break;
}
#elif ZHONGKE
switch(RxCommand)
{
case VHOUSE_CMD_GET_VBAT:
case VHOUSE_CMD_CLOSE_WINDOW:
case VHOUSE_CMD_OPEN_WINDOW:
case VHOUSE_CMD_CLOSE_WIN_GET_VBAT:
break;
case VHOUSE_CMD_SUCCESS:
break;
case VHOUSE_CMD_GET_TWS_BTADDR:
if( RX0_Buffer[5] == VOL_CHAN ) //根据耳机Side参数
{
Vox_Get_BES_Addr_Flag[VOL_TYPE] = 1; //获取左耳机发的CMD3
}
else
{
Vox_Get_BES_Addr_Flag[VOR_TYPE] = 1; //获取右耳机发的CMD3
}
break;
case VHOUSE_CMD_SYS_RST: //系统复位,耳机->充电仓
break;
default:
break;
}
#elif XUANHENG
uint8_t CMD_Type = 0;
CMD_Type = RX0_Buffer[1] >> 4;
if( CMD_Type & TWS_PC ) //PC/工装->盒子
{
}
else //耳机->盒子
{
switch(RxCommand)
{
case CMD_TWS_GET_BTADDR:
for(i=0;i<RX0_Buffer[5];i++)
{
BES_Addr[i] = RX0_Buffer[i+7]; //获取耳机MAC地址。
}
if( CMD_Type == TWS_VOL ) //根据耳机Side参数
{
Vox_Get_BES_Addr_Flag[VOL_TYPE] = 1; //左耳机蓝牙地址写入是否成功状态标志
}
else
{
Vox_Get_BES_Addr_Flag[VOR_TYPE] = 1; //右耳机蓝牙地址写入是否成功状态标志
}
break;
case CMD_SHUT_DOWN:
break;
case CMD_TWS_SET_BTADDR:
if( CMD_Type == TWS_VOL ) //根据耳机Side参数
{
Vox_Set_BES_Addr_Flag[VOL_TYPE] = RX0_Buffer[7]; //左耳机蓝牙地址写入是否成功状态标志
}
else
{
Vox_Set_BES_Addr_Flag[VOR_TYPE] = RX0_Buffer[7]; //右耳机蓝牙地址写入是否成功状态标志
}
break;
case CMD_CLEAR_PAIR: //按键长按10s发送此命令。
if( CMD_Type == TWS_VOL ) //根据耳机Side参数
{
Vox_Clear_Pair_Flag[VOL_TYPE] = 1; //左耳机蓝牙地址写入是否成功状态标志
}
else
{
Vox_Clear_Pair_Flag[VOR_TYPE] = 1; //右耳机蓝牙地址写入是否成功状态标志
}
break;
case CMD_HEARTBEAT:
if( CMD_Type == TWS_VOL ) //根据耳机Side参数
{
Bes_Bet_Level[VOL_TYPE] = RX0_Buffer[9] & 0x7F; //获取耳机电量
Bes_Chg_Full[VOL_TYPE] = RX0_Buffer[9] >> 7; //获取耳机是否满电
Vox_Pairing_State[VOL_TYPE] = RX0_Buffer[10]; //获取耳机配对状态;
Tws_Paired_Record[VOL_TYPE] = RX0_Buffer[11] & 0x01; //bit0:0有TWS配对记录1没有TWS配对记录bit1:0有与手机配对记录1没有和手机配对记录。
Phone_Paired_Record[VOL_TYPE] = ( RX0_Buffer[11] >> 1 ) & 0x01;
Bes_OTA_State[VOL_TYPE] = RX0_Buffer[12];
}
else
{
Bes_Bet_Level[VOR_TYPE] = RX0_Buffer[9] & 0x7F;
Bes_Chg_Full[VOR_TYPE] = RX0_Buffer[9] >> 7;
Vox_Pairing_State[VOR_TYPE] = RX0_Buffer[10];
Tws_Paired_Record[VOR_TYPE] = RX0_Buffer[11] & 0x01;
Phone_Paired_Record[VOR_TYPE] = (RX0_Buffer[11] >> 1) & 0x01;
Bes_OTA_State[VOR_TYPE] = RX0_Buffer[12];
}
break;
case CMD_SN:
if( CMD_Type == TWS_VOL ) //根据耳机Side参数
{
Bes_Set_SN_State[VOL_TYPE] = RX0_Buffer[7]; //左耳机SN写入是否成功状态标志
}
else
{
Bes_Set_SN_State[VOR_TYPE] = RX0_Buffer[7]; //右耳机SN写入是否成功状态标志
}
break;
case CMD_GET_INTO_PAIR:
if( CMD_Type == TWS_VOL ) //根据耳机Side参数
{
Bes_In_Pair_State[VOL_TYPE] = RX0_Buffer[7]; //左耳机是否进入配对状态成功状态标志
}
else
{
Bes_In_Pair_State[VOR_TYPE] = RX0_Buffer[7]; //右耳机是否进入配对状态成功状态标志
}
break;
case CMD_PAIRING_IMD:
if( CMD_Type == TWS_VOL ) //根据耳机Side参数
{
Bes_In_Pair_State[VOL_TYPE] = 1; //左耳机是否进入配对状态成功状态标志
}
else
{
Bes_In_Pair_State[VOR_TYPE] = 1; //右耳机是否进入配对状态成功状态标志
}
break;
default:
break;
}
}
#endif
}
/*
*******************************************************************************
* void HandleVoxCommMsg(void)
*
* Description : Vox 通讯功能处理函数100ms定时调用。由于和耳机通信前需要打开耳机端的TRX功能并且每次通信只能一只耳机。通过切换VOL/VOR通信开关进行通信
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void HandleVoxCommMsg(void)
{
uint16_t CrcCheckSum = 0;
uint8_t i = 0;
#if XUANHENG
uint16_t Data_Len = 0;
#endif
/*RX数据处理*/
if( Uart0_RX_Finish_Flag )
{
Uart0_RX_Finish_Flag = 0;
#ifdef _DEBUG_VOX
printf("RX0_Buffer[0]:0x%x,RX0_Buffer[1]:0x%x,RX0_Buffer[2]:0x%x,RX0_Buffer[3]:0x%x,RX0_Buffer[4]:0x%x,RX0_Buffer[5]:0x%x,RX0_Buffer[6]:0x%x,RX0_Buffer[7]:0x%x,line:%d\r\n",(u16)RX0_Buffer[0],(u16)RX0_Buffer[1],(u16)RX0_Buffer[2],(u16)RX0_Buffer[3],(u16)RX0_Buffer[4],(u16)RX0_Buffer[5],(u16)RX0_Buffer[6],(u16)RX0_Buffer[7],(u16)__LINE__);
#endif
#if JIELI
CrcCheckSum = Crc8Maxim(RX0_Buffer, RX0_Buffer[2] + 3); //求校验和
if( CrcCheckSum == RX0_Buffer[RX0_Buffer[2] + 3] )
#elif ZHONGKE
CrcCheckSum = Crc8Maxim( RX0_Buffer, RX0_Buffer[4] + 5 );
if( CrcCheckSum == RX0_Buffer[ RX0_Buffer[4] + 5 ] )
#elif XUANHENG
Data_Len = RX0_Buffer[5] | ( RX0_Buffer[6] << 8 ) + 7;
CrcCheckSum = CalCheckCrc16( RX0_Buffer, Data_Len); //计算检验和
if( CrcCheckSum == (uint16_t)(RX0_Buffer[ Data_Len + 1 ] | RX0_Buffer[ Data_Len + 2 ] << 8) ) //校验和小端模式,低位在前。
#endif
{
#if XUANHENG
HandleRxMsg((VOX_BES_COMMAND_E)RX0_Buffer[2]);
#else
HandleRxMsg((VOX_BES_COMMAND_E)RX0_Buffer[3]);
#endif
}
else
{
return;
}
}
}
#endif