1、将双向通信的具体场景提到vox_Comm_Handle函数中 #1

Closed
rb_peng wants to merge 1 commits from master into main
17 changed files with 837 additions and 534 deletions

View File

@ -34,21 +34,21 @@
/******************************************************************************\
Variables definitions
\******************************************************************************/
extern int8_t ADC_Offset_Error; //ADC Offset Error 校准值寄存器
//extern int8_t ADC_Offset_Error; //ADC Offset Error 校准值寄存器
extern uint8_t Vor_Isense_Gain_Error;
//extern uint8_t Vor_Isense_Gain_Error;
extern uint8_t Vol_Isense_Gain_Error;
//extern uint8_t Vol_Isense_Gain_Error;
extern int8_t Vor_Isense_Offset_Error;
//extern int8_t Vor_Isense_Offset_Error;
extern int8_t Vol_Isense_Offset_Error;
//extern int8_t Vol_Isense_Offset_Error;
extern uint8_t ADC_Chn_Num;
extern uint16_t g_Value_Adc;
//extern uint16_t g_Value_Adc;
extern uint16_t g_Value_Adc_Avg;
//extern uint16_t g_Value_Adc_Avg;
extern int16_t g_Vntc_Adc;
@ -60,7 +60,7 @@ extern int16_t g_Vbat_Adc;
extern int16_t g_pmu_Adc_Vout;
extern uint8_t g_ADC_Chn;
//extern uint8_t g_ADC_Chn;
/* ADCͨµÀö¾Ù¡£ */
typedef enum {

View File

@ -36,9 +36,74 @@
#define TWS_BOX 0x02
#define TWS_PC 0x03
/*100ms调用周期*/
#define KEY_TWS_PAIR_TIMER 3
#define KEY_TWS_PAIR_CNT 10
#define Vox_COM_MSG_Tim 20
#if XUANHENG
#define BOXHEADER (0xAAU) //VOX通讯数据包头
#else
#define BOXHEADER (0x55AAUL) //VOX通讯数据包头
#define EARPHONE_HEADER_HIGH (0x55U)
#define EARPHONE_HEADER_LOW (0xAAU)
#define BOXIDCODE (0xFFU) //VOX通讯耳机->仓数据包头
#endif
#define Vox_TX_Interval (2U) //Vox定时发送指令时间间隔
#define Vox_TX_Interval_2 (4U)
#define TIM_SHUTDOWN_DEBOUNCE (600UL) //关机前debounce时间
/******************************************************************************\
Typedef definitions
\******************************************************************************/
#ifdef VOX_COMM_ENABLE
/* 双向通讯功能场景参数。 */
typedef struct VOX_COMM
{
#ifdef VOX_COVER_ENABLE
uint8_t Cover_Close_Flag :1; //关盖发码标志位
uint8_t Cover_Open_Flag :1; //开盖发码标志位
uint8_t Vox_Chg_Full_Flag :1; //耳机充满发关机码标志位
#else
uint8_t Vol_GetInto_Box_Flag :1; //VOL耳机入盒发码标志位
uint8_t Vor_GetInto_Box_Flag :1; //VOR耳机入盒发码标志位
uint8_t Vol_Chg_Full_Flag :1; //VOL耳机充满发码标志位
uint8_t Vor_Chg_Full_Flag :1; //VOR耳机充满发码标志位
#endif
uint8_t Key_L_2S_Flag :1; //按键2s发码标志位
uint8_t Key_LL_8s_Flag :1; //按键8s发码标志位
/*发码相关计时器*/
uint8_t Msg_TX_Debounce;
uint8_t Msg_TX_Debounce1;
/*按键发码相关计时器*/
uint8_t Key_TWS_Pair_Tim;
uint8_t Key_TWS_Clear_Pair_Tim;
uint8_t Key_TWS_Pair_Cnt;
}Vox_Comm_Cfg;
extern Vox_Comm_Cfg gVox_Comm;
#endif
#if JIELI
@ -57,19 +122,19 @@ typedef enum {
typedef enum _VOX_BES_COMMAND_E
{
VHOUSE_CMD_PAIR = 0x01, //充电仓发起的配对信息
VHOUSE_CMD_PAIR = 0x01, //充电仓发起的配对信息
VHOUSE_CMD_EXCH_TWS_BTADDR = 0x02, //交换对耳的蓝牙地址信息。
VHOUSE_CMD_CLEAR_PAIR = 0x03, //清配对信息
VHOUSE_CMD_CLEAR_PAIR = 0x03, //清配对信息
VHOUSE_CMD_OPEN_BOX = 0x06, //开盖获取电量包
VHOUSE_CMD_OPEN_BOX = 0x06, //开盖获取电量包
VHOUSE_CMD_CLOSE_WIN_GET_VBAT = 0x07, //关盖获取电量包
VHOUSE_CMD_RST = 0x08, //
VHOUSE_CMD_RST = 0x08, //
VHOUSE_CMD_PWROFF = 0x80, //关机消息
VHOUSE_CMD_PWROFF = 0x80, //关机消息
VHOUSE_CMD_CLOSE_BOX = 0x81,
@ -175,14 +240,17 @@ typedef enum _VOX_BES_COMMAND_E
\******************************************************************************/
#ifdef VOX_RX
extern uint8_t Vox_Get_Vbat_Flag[2]; //耳机配对状态VOL:低4bitVOR:高4bit。0是无效1是正在配对2是配对成功3不处理保持当前状态。
extern idata uint8_t Vox_Get_Vbat_Flag[2]; //耳机配对状态VOL:低4bitVOR:高4bit。0是无效1是正在配对2是配对成功3不处理保持当前状态。
extern uint8_t Vox_Get_BES_Addr_Flag[2] ;
extern idata uint8_t Vox_Get_BES_Addr_Flag[2] ;
#endif
extern void Vox_Comm_Cfg_Clear(void);
extern void HandleTxCommand(VOX_BES_COMMAND_E TxCommand, e_Vox_Chan nVox_Chn_Select);
extern void Vox_Comm_Handle(void);
extern void HandleVoxCommMsg(void);

View File

@ -278,7 +278,7 @@
#define VFLOAT_SET CHG_VFLOAT_4_200V //配置浮充电压。
#define VFLOAT_VOLTAGE_SET (4200UL) //配置浮充电压实际电压值用于仓复充单位mv。
#define VFLOAT_VOLTAGE_SET ( 4200UL ) //配置浮充电压实际电压值用于仓复充单位mv。
#define PRECHG_TIM_SET PRECHG_TMR_EN_1H //配置涓流充超时时间。
@ -304,21 +304,42 @@
#define VOX_CHG_FULL_5V_LEAST_CNT 40 //配置关盖条件下VOX 耳机充满后VOX输出5V持续时间100ms * 40
#define HALL_OPEN_VOX_5V_DEBOUNCE 5 //配置开盖动作后VOX 输出5V持续时间100ms * 5单位100ms。
#define HALL_OPEN_VOX_0V_DEBOUNCE 5 //配置开盖动作后VOX 输出0V持续时间100ms * 5单位100ms。
#define HALL_EVENT_VOX_5V_DEBOUNCE 5 //配置开盖动作后VOX 输出5V持续时间100ms * 5单位100ms。
#define VOX_OCP_HICUUP_DEBOUNCE 5 //配置关盖条件下VOX 打嗝时间100ms * 5单位100ms。
#define HALL_CLOSE_VOX_5V_HOLD_CNT 3 //配置关盖动作后VOX 输出5V持续时间100ms * 3单位100ms。
#define VOX_0V_WAKEUP_EAR 0 //VOX持续输出0V以唤醒耳机
#if VOX_0V_WAKEUP_EAR
#define HALL_CLOSE_VOX_0V_DEBOUNCE 5 //配置关盖动作后VOX 输出0V持续时间100ms * 3单位100ms。
#define HALL_OPEN_VOX_0V_DEBOUNCE 5 //配置开盖动作后VOX 输出0V持续时间100ms * 5单位100ms。
#define Key_VOLTAGE_HOLD_CNT 5 //配置长按或超长按动作后VOX 输出0V持续时间15ms * 5单位15ms。
#endif
/* 双向通讯协议选择 */
#define JIELI 0 //杰理耳机芯片
#define JIELI 1 //杰理耳机芯片
#define ZHONGKE 0 //中科蓝讯耳机芯片
#define XUANHENG 1 //玄恒耳机芯片
#define XUANHENG 0 //玄恒耳机芯片
/* 主副耳机选择:双向通讯耳机配对时使用 */
#define MASTER_TYPE VOR_TYPE //主通道
#define MASTER_SIDE VOR_CHAN //主耳机
#define SLAVE_TYPE VOL_TYPE //副通道
#define SLAVE_SIDE VOL_CHAN //主耳机
/* Vox跟随充参数设置。(100ms调用周期) */

View File

@ -23,7 +23,7 @@
#include "config.h"
/*Function Select功能选择宏定义*/
//#define SY8837 //合封芯片SY8838
//#define SY8837 //非合封芯片SY8837
#define TIMER1_ENABLE 0 //Timer1 定时周期1ms。(120Bytes)
@ -51,6 +51,8 @@
#if VOX_ENABLE
#define VOX_COMM_ENABLE //双向通讯处理功能
#define VOX_TX //959Bytes
#define VOX_RX //739Bytes
@ -73,7 +75,7 @@
#define SLEEP_ENABLE 1 //110Bytes
#define TIM_WKUP //定时唤醒功能
//#define TIM_WKUP //定时唤醒功能
#define ADC_ENABLE 1 //587Bytes
@ -87,14 +89,14 @@
#define BAT_VALUE 1 //171Bytes
//#define _DEBUG_ALL //打开打印功能
#define _DEBUG_ALL //打开打印功能
#ifdef _DEBUG_ALL
#define UART0_ENABLE //UART0功能,Debug Log。(133Bytes)
// #define _DEBUG_MAIN
// #define _DEBUG_KEY
#define _DEBUG_MAIN
#define _DEBUG_KEY
// #define _DEBUG_VOX
// #define _DEBUG_FOLLOW
// #define _DEBUG_HALL
@ -145,9 +147,7 @@ typedef enum{false = 0, true = !false} bool;
#define ON true
#define OFF false
#ifdef XIAOMI
#include "stdlib.h"
#endif
#include "reg883x.h"

View File

@ -44,21 +44,25 @@
#define C_TIM1_Reload (65535 - T1MS) //1ms
extern bit F_sys_tim1_tick;
extern void Sys_Tim1_Init(void );
#endif
extern bit F_sys_tim_1ms;
extern bit F_sys_tim_5ms;
extern bit F_sys_tim_10ms;
extern bit F_sys_tim_250ms;
extern bit F_sys_tim_100ms;
extern bit F_sys_tim_1s;
extern bit F_sys_tim1_tick;
extern bit F_sys_tim2_tick;
extern void Sys_Tim0_Init(void );
extern void Sys_Tim0_Handler(void );

View File

@ -52,7 +52,7 @@ extern char putchar (char ch);
#endif
#define COM1_Data_Lenth 32
#define COM1_Data_Lenth 38
#ifdef VOX_RX

View File

@ -36,10 +36,6 @@
extern bit Vox_Output_Short_Flag;
#define IVOX_THN 20 //耳机跟随充电流下降阈值
#define IVOX_THP 200 //耳机跟随充电流上升阈值
#define VOL_TYPE 0x00
#define VOR_TYPE 0x01
@ -72,7 +68,7 @@ extern bit Vox_Output_Short_Flag;
extern bit Vox_Vout_Enable; //Vox功率输出标志位
extern uint8_t EarPhone_Num;
extern idata uint8_t EarPhone_Num;
#else
@ -290,27 +286,6 @@ SFRDATA |= (VOX_LIGHT_TO_HAVEY_128 << 2) | VOX_HAVEY_TO_LIGHT_8;
#define Vox_Pull_Up_50k_Pos_Msk (0x1U << Vox_Pull_Up_50k_Pos)
#define Vox_Pull_Up_50k Vox_Pull_Up_50k_Pos_Msk
#if XUANHENG
#define BOXHEADER (0xAAU) //VOX通讯数据包头
#else
#define BOXHEADER (0x55AAUL) //VOX通讯数据包头
#define EARPHONE_HEADER_HIGH (0x55U)
#define EARPHONE_HEADER_LOW (0xAAU)
#define BOXIDCODE (0xFFU) //VOX通讯耳机->仓数据包头
#endif
#define Vox_TX_Interval (2U) //Vox定时发送指令时间间隔
#define Vox_TX_Interval_2 (4U)
#define TIM_SHUTDOWN_DEBOUNCE (600UL) //关机前debounce时间
/******************************************************************************\
Variables definitions
\******************************************************************************/

View File

@ -34,39 +34,39 @@
\******************************************************************************/
int8_t ADC_Offset_Error; //ADC Offset Error 校准值寄存器
static int8_t ADC_Offset_Error; //ADC Offset Error 校准值,有符号数
int8_t Bat_ADC_Offset_Error;
static int8_t Bat_ADC_Offset_Error;//电池 ADC Offset Error 校准值,有符号数
uint8_t Vor_Isense_Gain_Error;
static uint8_t Vor_Isense_Gain_Error;//Vor 电流ADC GAIN Error 校准值,无符号数
uint8_t Vol_Isense_Gain_Error;
static uint8_t Vol_Isense_Gain_Error;//Vol 电流ADC GAIN Error 校准值,无符号数
int8_t Vor_Isense_Offset_Error;
static int8_t Vor_Isense_Offset_Error;//Vor 电流ADC Offset Error 校准值,无符号数
int8_t Vol_Isense_Offset_Error;
static int8_t Vol_Isense_Offset_Error;//Vol 电流ADC Offset Error 校准值,无符号数
uint8_t ADC_Chn_Num;
static uint8_t g_ADC_Chn;//ADC采样通道
uint16_t g_Value_Adc;
static uint8_t Adc_Index;//ADC采样次数计数器
uint16_t g_Value_Adc_Avg;
static bit ADC_Cal_Over_Flag;//ADC采样完成标志位
int16_t g_Vntc_Adc;
static uint16_t g_Value_Adc;//ADC采样码值
int16_t g_pmu_Adc_Ivol;
static uint16_t g_Value_Adc_Avg;//ADC多次采样值和
int16_t g_pmu_Adc_Ivor;
uint8_t ADC_Chn_Num; //ADC采样通道计数器
int16_t g_Vbat_Adc;
int16_t g_Vntc_Adc;//NTC通道ADC采样码值
int16_t g_pmu_Adc_Vout;
int16_t g_pmu_Adc_Ivol;//Vol通道电流ADC采样码值
uint8_t g_ADC_Chn;
int16_t g_pmu_Adc_Ivor;//Vor通道电流ADC采样码值
uint8_t Adc_Index;
int16_t g_Vbat_Adc;//Bat通道ADC采样码值
bit ADC_Cal_Over_Flag;
int16_t g_pmu_Adc_Vout;//Vout通道ADC采样码值
/******************************************************************************\
Functions definitions
@ -99,8 +99,6 @@ void Adc_Init(void)
SFRADDR = IRQ_EN10; //Enable ADC Interrupt(INT6).
SFRDATA |= 0x01;
#if 1
ADC_Offset_Error = (int8_t)( ( ADC_OFFSET & 0x0F ) - 8 ); //获取ADC Offset Error校准值。
Bat_ADC_Offset_Error = (int8_t)( ADC_OFFSET >> 4 );
@ -114,8 +112,6 @@ void Adc_Init(void)
Vor_Isense_Gain_Error = IVOR_GAIN;
#endif
EX6 = 1; //ADC IRQ Enable
}
@ -123,10 +119,10 @@ void Adc_Init(void)
*******************************************************************************
* void PMU_ADC_Chn_Data(PMU_ADC_CHANNELS_E pmu_Adc_Chn)
*
* Description : 使使,8
* Description : 使使,8
ADC值
*
* Arguments : NONE
* Arguments : PMU_ADC_CHANNELS_E pmu_Adc_Chn
* Returns : NONE
@ -159,9 +155,7 @@ void PMU_ADC_Chn_Data( PMU_ADC_CHANNELS_E pmu_Adc_Chn )
g_Value_Adc_Avg = ( (uint32_t)g_Value_Adc_Avg * 2500 ) >> 10 ; //ADC的LSB = 2500mV / 1024 = 2.44mV
g_pmu_Adc_Ivol = (int32)( (int16)( g_Value_Adc_Avg - Vol_Isense_Offset_Error ) ) * 100 / (int16)( 500 + 2 * Vol_Isense_Gain_Error ) ; //IVOL电压位VOL的电流放大5倍送给ADC例如100mA电流ADC采样电压为500mV。
#ifdef _DEBUG_ADC
// printf("Vol:Adc_Avg:%d,Ivol:%d,Offset_Error:%d,Gain_Error:%d,temp:%d\r\n",(u16)g_Value_Adc_Avg,(u16)g_pmu_Adc_Ivol,(u16)Vol_Isense_Offset_Error,(u16)Vol_Isense_Gain_Error,(u16)( ( g_Value_Adc_Avg - Vol_Isense_Offset_Error ) ));
#endif
if( g_pmu_Adc_Ivol < 0 ) //只处理正电流
{
g_pmu_Adc_Ivol = 0;
@ -171,12 +165,10 @@ void PMU_ADC_Chn_Data( PMU_ADC_CHANNELS_E pmu_Adc_Chn )
case ADC_IVOR:
g_Value_Adc_Avg = ( (uint32_t)g_Value_Adc_Avg * 2500 ) >> 10 ; //ADC的LSB = 2500mV / 1024 = 2.44mV
g_Value_Adc_Avg = ( (uint32_t)g_Value_Adc_Avg * 2500 ) >> 10 ; //ADC的LSB = 2500mV / 1024 = 2.44mV
g_pmu_Adc_Ivor = (int32)( (int16)( g_Value_Adc_Avg - Vor_Isense_Offset_Error ) ) * 100 / (int16)( 500 + 2 * Vor_Isense_Gain_Error ) ; //IVOR电压位VOR的电流放大5倍送给ADC例如100mA电流ADC采样电压为500mV。
#ifdef _DEBUG_ADC
// printf("Vor:Adc_Avg:%d,Ivor:%d,Offset_Error:%d,Gain_Error:%d,temp:%d\r\n",(u16)g_Value_Adc_Avg,(u16)g_pmu_Adc_Ivor,(u16)Vor_Isense_Offset_Error,(u16)Vor_Isense_Gain_Error,(u16)( ( g_Value_Adc_Avg - Vor_Isense_Offset_Error ) ));
#endif
if( g_pmu_Adc_Ivor < 0 ) //只处理正电流
{
g_pmu_Adc_Ivor = 0;
@ -186,7 +178,7 @@ void PMU_ADC_Chn_Data( PMU_ADC_CHANNELS_E pmu_Adc_Chn )
case ADC_BAT:
g_Value_Adc_Avg = ((uint32_t)( g_Value_Adc_Avg ) * 2500) >> 10 ; //ADC的LSB = 2500mV / 1024 = 2.44mV
g_Value_Adc_Avg = ((uint32_t)( g_Value_Adc_Avg ) * 2500) >> 10 ; //ADC的LSB = 2500mV / 1024 = 2.44mV
g_Vbat_Adc = g_Value_Adc_Avg << 1; //VBAT的2分压。
@ -201,9 +193,9 @@ void PMU_ADC_Chn_Data( PMU_ADC_CHANNELS_E pmu_Adc_Chn )
case ADC_VOUT:
g_Value_Adc_Avg = ( (int32_t)( g_Value_Adc_Avg - ADC_Offset_Error ) * 2500 ) >> 10 ; //ADC的LSB = 2500mV / 1024 = 2.44mV
g_Value_Adc_Avg = ( (int32_t)( g_Value_Adc_Avg - ADC_Offset_Error ) * 2500 ) >> 10 ; //ADC的LSB = 2500mV / 1024 = 2.44mV
g_pmu_Adc_Vout = g_Value_Adc_Avg << 1; //VOUT的2分压。
g_pmu_Adc_Vout = g_Value_Adc_Avg << 1; //VOUT的2分压。
if( g_pmu_Adc_Vout <0 )
{
@ -217,16 +209,13 @@ void PMU_ADC_Chn_Data( PMU_ADC_CHANNELS_E pmu_Adc_Chn )
ADC_Cal_Over_Flag = FALSE;
#ifdef _DEBUG_ADC
printf("adc chn:%d,adc_value:%d,Ivol:%d,Vbat:%d,Vout:%d,Ivor:%d,Vntc:%d.\r\n",(uint16_t)ADC_Chn_Num,(uint16_t)g_Value_Adc_Avg,(uint16_t)g_pmu_Adc_Ivol,(uint16_t)g_Vbat_Adc,(uint16_t)g_pmu_Adc_Vout,(uint16_t)g_pmu_Adc_Ivor,(uint16_t)g_Vntc_Adc);
#endif
}
else
{
g_ADC_Chn = pmu_Adc_Chn;
ADC_CTL1 = ( pmu_Adc_Chn << 4 ) | 0x01; //ADC Start Enable,Set Channel N Enabel.
ADC_CTL1 = ( pmu_Adc_Chn << 4 ) | 0x01; //ADC Start Enable,Set Channel N Enabel.
g_Value_Adc_Avg = 0;

View File

@ -21,13 +21,14 @@
#include "vox_module.h"
#include "vox_comm.h"
#include "system.h"
#include "vox_comm.h"
#include "bat.h"
#include "hall.h"
#include "key.h"
/******************************************************************************\
Macro definitions
\******************************************************************************/
#define MAX_PACKET_SIZE 0x20
/******************************************************************************\
@ -72,28 +73,482 @@ bit gShip_Mode_Flag; //
#elif JIELI
uint8_t Vox_Type;
idata uint8_t Vox_Type;
uint8_t Net_Info[2][13];
idata uint8_t MAC_Addr[2][18];
uint8_t Earphone_Vbat[2]; //对耳电量
idata uint8_t Earphone_Vbat[2]; //对耳电量
#endif
#ifdef VOX_RX
uint8_t Vox_Get_Vbat_Flag[2]; //耳机配对状态VOL:低4bitVOR:高4bit。0是无效1是正在配对2是配对成功3不处理保持当前状态。
uint8_t Vox_Get_BES_Addr_Flag[2];
idata uint8_t Vox_Get_Vbat_Flag[2]; //耳机配对状态VOL:低4bitVOR:高4bit。0是无效1是正在配对2是配对成功3不处理保持当前状态。
idata uint8_t Vox_Get_BES_Addr_Flag[2];
//idata uint8_t BES_Addr[6] = {0}; //À¶ÑÀ¶ú»úµØÖ·£¬Vox_Bes_Addr[0][6]£ºVOL£»Vox_Bes_Addr[1][6]£ºVOR
#endif
#ifdef VOX_COMM_ENABLE
/* 双向通讯功能参数。 */
Vox_Comm_Cfg gVox_Comm;
/******************************************************************************\
Functions definitions
\******************************************************************************/
/*
*******************************************************************************
* void Vox_Comm_Cfg_Init(void)
*
* Description : Vox ()
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void Vox_Comm_Cfg_Clear(void)
{
#ifdef VOX_COVER_ENABLE
gVox_Comm.Cover_Close_Flag = FALSE;
gVox_Comm.Cover_Open_Flag = FALSE;
gVox_Comm.Vox_Chg_Full_Flag = FALSE;
#else
gVox_Comm.Vol_GetInto_Box_Flag = FALSE;
gVox_Comm.Vor_GetInto_Box_Flag = FALSE;
gVox_Comm.Vol_Chg_Full_Flag = FALSE;
gVox_Comm.Vor_Chg_Full_Flag = FALSE;
#endif
gVox_Comm.Key_L_2S_Flag = FALSE;
gVox_Comm.Key_LL_8s_Flag = FALSE;
/*发码相关计时器*/
gVox_Comm.Msg_TX_Debounce = 0;
gVox_Comm.Msg_TX_Debounce1 = 0;
/*按键发码相关计时器*/
gVox_Comm.Key_TWS_Pair_Tim = 0;
gVox_Comm.Key_TWS_Clear_Pair_Tim= 0;
gVox_Comm.Key_TWS_Pair_Cnt = 0;
}
/*
*******************************************************************************
* void Vox_Comm_Handle(void)
*
* Description : Vox (100ms调用周期)
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void Vox_Comm_Handle(void)
{
if( gVox_Comm.Cover_Open_Flag ) /* 发码:开盖码。 */
{
if( gVox_Comm.Msg_TX_Debounce <= Vox_COM_MSG_Tim )
{
if( ( gVox_Comm.Msg_TX_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( ( gVox_Comm.Msg_TX_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
}
gVox_Comm.Msg_TX_Debounce++;
}
else
{
Vox_Comm_Cfg_Clear();
}
}
else
if( gVox_Comm.Cover_Close_Flag ) /*发码:关盖码*/
{
if( gVox_Comm.Msg_TX_Debounce <= Vox_COM_MSG_Tim ) //发送关盖指令。
{
if( (gVox_Comm.Msg_TX_Debounce % 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( (gVox_Comm.Msg_TX_Debounce % 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
}
gVox_Comm.Msg_TX_Debounce++;
return;
}
/*发码:获取耳机电量码*/
if( gVox_Comm.Msg_TX_Debounce1 <= Vox_COM_MSG_Tim ) //关盖后5s发送获取电量命令。
{
if( (gVox_Comm.Msg_TX_Debounce1 % 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( (gVox_Comm.Msg_TX_Debounce1 % 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
}
gVox_Comm.Msg_TX_Debounce1++;
return;
}
Vox_Comm_Cfg_Clear();
}
else
if( gVox_Comm.Vox_Chg_Full_Flag ) /* 发码Vox耳机充满发关机码。 */
{
if( gVox_Comm.Msg_TX_Debounce <= Vox_COM_MSG_Tim )
{
if( (gVox_Comm.Msg_TX_Debounce % 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( (gVox_Comm.Msg_TX_Debounce % 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
}
gVox_Comm.Msg_TX_Debounce++;
}
else
{
Vox_Comm_Cfg_Clear();
}
}
else
if( gVox_Comm.Key_L_2S_Flag ) /*按键2s发码配对码*/
{
if ( CoverStatus == OPEN )
{
if( gVox_Comm.Key_TWS_Pair_Tim < 1 )
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_TWS_GET_BTADDR,MASTER_SIDE);
#else
HandleTxCommand(VHOUSE_CMD_PAIR,MASTER_SIDE); //右耳发配对指令,区分耳机通道。
#endif
#endif
Vox_Get_BES_Addr_Flag[SLAVE_TYPE] = 0x00;
Vox_Get_BES_Addr_Flag[MASTER_TYPE] = 0x00;
#ifdef _DEBUG_KEY
printf("Key Pair TX MASTER(line:%d).\r\n",(uint16_t)__LINE__);
#endif
}
else
{
if(gVox_Comm.Key_TWS_Pair_Cnt > KEY_TWS_PAIR_CNT) //耳机蓝牙地址置换超时10s关闭蓝牙地址置换开启VOX 5V。
{
gVox_Comm.Key_TWS_Pair_Cnt = 0;
#if XUANHENG
HandleTxCommand(CMD_PAIRING_IMD,MASTER_SIDE);
HandleTxCommand(CMD_PAIRING_IMD,SLAVE_SIDE);
#endif
Event_key = KEY_EVENT_Empty;
gVox_Comm.Key_L_2S_Flag = FALSE;
OpenCover_TX_Cmd_Flag = TRUE;
#if VOX_ENABLE
#ifdef VOX_ADT_ENABLE
Vol_State = VOX_GET_INTO_BOX;
Vor_State = VOX_GET_INTO_BOX;
#else
VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V
#endif
#endif
#ifdef _DEBUG_KEY
printf("Key Pair TimeOut(line:%d).\r\n",(uint16_t)__LINE__);
#endif
return;
}
else
{
if( Vox_Get_BES_Addr_Flag[MASTER_TYPE] == 0x01 ) /*收到右耳回复的CMD3指令。*/
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_EXCH_TWS_BTADDR,SLAVE_SIDE); /*获取到右耳回复的CMD3指令转发给左耳。*/
#elif ZHONGKE
HandleTxCommand( VHOUSE_CMD_GET_TWS_BTADDR, SLAVE_SIDE ); /*获取到右耳回复的CMD3指令转发给左耳。*/
#elif XUANHENG
HandleTxCommand( CMD_TWS_SET_BTADDR, SLAVE_SIDE );
#endif
#endif
Vox_Get_BES_Addr_Flag[MASTER_TYPE] = 0x02;
#ifdef _DEBUG_KEY
printf("Key Pair Get SLAVE(line:%d).\r\n",(uint16_t)__LINE__);
#endif
}
else
if( Vox_Get_BES_Addr_Flag[MASTER_TYPE] == 0x02 )
{
if( Vox_Get_BES_Addr_Flag[SLAVE_TYPE] != 0x00 )
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_EXCH_TWS_BTADDR,MASTER_SIDE); /*获取到右耳回复的CMD3指令转发给左耳。*/
#elif ZHONGKE
HandleTxCommand( VHOUSE_CMD_GET_TWS_BTADDR, MASTER_SIDE ); /*获取到右耳回复的CMD3指令转发给左耳。*/
#elif XUANHENG
HandleTxCommand( CMD_TWS_SET_BTADDR, MASTER_SIDE );
#endif
#endif
Vox_Get_BES_Addr_Flag[MASTER_TYPE] = 0x00;
Vox_Get_BES_Addr_Flag[SLAVE_TYPE] = 0x00;
gVox_Comm.Key_TWS_Pair_Tim = 0;
gVox_Comm.Key_TWS_Pair_Cnt = 0;
Event_key = KEY_EVENT_Empty;
gVox_Comm.Key_L_2S_Flag = FALSE;
OpenCover_TX_Cmd_Flag = TRUE;
#if VOX_ENABLE
#ifdef VOX_ADT_ENABLE
Vol_State = VOX_NONE_IN_BOX;
Vor_State = VOX_NONE_IN_BOX;
#else
VOX_EN_Type(VOX_ADT_Mode); //VOX Enable 5V
#endif
#endif
#ifdef _DEBUG_KEY
printf("Key Pair Get MASTER(line:%d).\r\n",(uint16_t)__LINE__);
#endif
return;
}
else
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_TWS_GET_BTADDR,SLAVE_SIDE);
#else
HandleTxCommand(VHOUSE_CMD_PAIR,SLAVE_SIDE); //右耳发配对指令,区分耳机通道。
#endif
#endif
#ifdef _DEBUG_KEY
printf("Key Pair TX SLAVE(line:%d).\r\n",(uint16_t)__LINE__);
#endif
}
}
}
}
if(gVox_Comm.Key_TWS_Pair_Tim >= KEY_TWS_PAIR_TIMER) //3s重发一次。重发5次后超时
{
gVox_Comm.Key_TWS_Pair_Cnt++;
gVox_Comm.Key_TWS_Pair_Tim = 0;
#ifdef _DEBUG_KEY
printf("Key Pair Cnt:%d.(line:%d)\r\n",(uint16_t)gVox_Comm.Key_TWS_Pair_Cnt,(uint16_t)__LINE__);
#endif
}
else
{
gVox_Comm.Key_TWS_Pair_Tim++;
}
}
else
{
Vox_Comm_Cfg_Clear();
}
}
else
if( gVox_Comm.Key_LL_8s_Flag ) /*按键8s发码清配对码*/
{
if( gVox_Comm.Key_TWS_Clear_Pair_Tim < Vox_COM_MSG_Tim ) //每隔200ms发送一次持续时间3s。
{
if( !( gVox_Comm.Key_TWS_Clear_Pair_Tim % Vox_TX_Interval_2 ) )
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_CLEAR_PAIR,VOR_CHAN);
#else
HandleTxCommand(VHOUSE_CMD_CLEAR_PAIR,VOR_CHAN);
#endif
#endif
}
else
if( !( gVox_Comm.Key_TWS_Clear_Pair_Tim % Vox_TX_Interval ) )
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_CLEAR_PAIR,VOL_CHAN);
#else
HandleTxCommand(VHOUSE_CMD_CLEAR_PAIR,VOL_CHAN);
#endif
#endif
}
gVox_Comm.Key_TWS_Clear_Pair_Tim++;
}
else
{
Event_key = KEY_EVENT_Empty;
OpenCover_TX_Cmd_Flag = TRUE;
Vox_Comm_Cfg_Clear();
#if VOX_ENABLE
#ifdef VOX_ADT_ENABLE
Vol_State = VOX_NONE_IN_BOX;
Vor_State = VOX_NONE_IN_BOX;
#else
VOX_EN_Type(VOX_ADT_Mode); //VOX Enable 5V
#endif
#endif
}
}
}
#endif
#ifdef VOX_TX
#if XUANHENG
/*
@ -113,7 +568,7 @@ uint8_t Vox_Get_BES_Addr_Flag[2];
*******************************************************************************
*/
uint16_t CalCheckCrc16(uint8_t *pucFrame, unsigned int usLen)
static uint16_t CalCheckCrc16(uint8_t *pucFrame, unsigned int usLen)
{
uint16_t wCRCin = 0xFFFF;
uint16_t wCPoly = 0x1021;
@ -161,7 +616,7 @@ uint8_t Vox_Get_BES_Addr_Flag[2];
*
*******************************************************************************
*/
uint8_t Crc8Maxim(u8 *buf, u8 length)
static uint8_t Crc8Maxim(u8 *buf, u8 length)
{
u8 i;
u8 crc = 0;
@ -185,7 +640,6 @@ uint8_t Vox_Get_BES_Addr_Flag[2];
#endif
#ifdef VOX_TX
/*
*******************************************************************************
* void HandleTxCommand(VOX_BES_COMMAND_E RxCommand, e_Vox_Chan nVox_Chn_Select)
@ -211,6 +665,7 @@ void HandleTxCommand(VOX_BES_COMMAND_E TxCommand, e_Vox_Chan nVox_Chn_Select)
uint8_t tx_pData[COM1_Data_Lenth] = 0;
uint8_t i = 0;
uint8_t Exch_BtAddr = 0;
#if JIELI
@ -248,16 +703,28 @@ void HandleTxCommand(VOX_BES_COMMAND_E TxCommand, e_Vox_Chan nVox_Chn_Select)
case VHOUSE_CMD_EXCH_TWS_BTADDR:
/*Data Length*/
tx_pData[3] = MAX_PACKET_SIZE;
for(i=5;i<18;i++)
if( nVox_Chn_Select == VOL_CHAN )
{
tx_pData[i] = MAC_Addr[nVox_Chn_Select][i];
Exch_BtAddr = VOR_CHAN;
}
else
if( nVox_Chn_Select == VOR_CHAN )
{
Exch_BtAddr = VOL_CHAN;
}
for(i=5;i<23;i++)
{
tx_pData[i] = MAC_Addr[Exch_BtAddr][i-5];
}
for(i=23;i<13;i++)
for(i=23;i<36;i++)
{
tx_pData[i] = Net_Info[nVox_Chn_Select][i];
tx_pData[i] = Net_Info[Exch_BtAddr][i-23];
}
break;
@ -664,7 +1131,8 @@ static void HandleRxMsg(VOX_BES_COMMAND_E RxCommand)
MAC_Addr[Vox_Type][i] = RX1_Buffer[4+i];
}
for(i=0;i<8;i++)
for(i=0;i<13;i++)
{
Net_Info[Vox_Type][i] = RX1_Buffer[22+i];
}
@ -924,7 +1392,7 @@ void HandleVoxCommMsg(void)
Uart1_RX_Finish_Flag = FALSE;
#ifdef _DEBUG_VOX
printf("RX1_Buffer[0]:0x%x,RX1_Buffer[1]:0x%x,RX1_Buffer[2]:0x%x,RX1_Buffer[3]:0x%x,RX1_Buffer[4]:0x%x,RX1_Buffer[5]:0x%x,RX1_Buffer[6]:0x%x,line:%d\r\n",(u16)RX1_Buffer[0],(u16)RX1_Buffer[1],(u16)RX1_Buffer[2],(u16)RX1_Buffer[3],(u16)RX1_Buffer[4],(u16)RX1_Buffer[5],(u16)RX1_Buffer[6],(u16)__LINE__);
// 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,RX0_Buffer[8]:0x%x,RX0_Buffer[9]:0x%x,RX0_Buffer[10]:0x%x,RX0_Buffer[11]: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)RX0_Buffer[8],(u16)RX0_Buffer[9],(u16)RX0_Buffer[10],(u16)RX0_Buffer[11],(u16)__LINE__);
#endif
#if JIELI

View File

@ -53,7 +53,7 @@ uint8_t LED_On_Timer; //led
bit LED_On_Flag; //led显示复位标志位1灯效复位。
#ifdef PWM_ENABLE
uint8_t Breathing_Light_Cnt; //呼吸灯流水计数器
idata uint8_t Breathing_Light_Cnt; //呼吸灯流水计数器
#endif
/******************************************************************************\

View File

@ -26,6 +26,8 @@
#include "sleep.h"
#include "system.h"
#include "display_ui.h"
#include "vox_comm.h"
/******************************************************************************\
Macro definitions
@ -41,7 +43,7 @@ bit CoverEvent_Flg; //Hall
#if HALL_ENABLE
uint8_t Hall_Sta_bk;
uint8_t Hall_Sta_bk=0xFF;
/******************************************************************************\
Functions definitions
@ -109,7 +111,9 @@ uint8_t Hall_Sta_bk;
#endif
}
Vox_Comm_Cfg_Clear();
CoverEvent_Flg = TRUE;
Boost_Open_Flag = FALSE;

View File

@ -42,10 +42,6 @@
#define KEY_PRESS_8S_CNT 535 //按键按下计数8s(调用周期15ms)
#define KEY_TWS_PAIR_TIMER 20
#define KEY_TWS_PAIR_CNT 5
#define KEY_TWS_PAIR_CLEAR_CNT 180
#define KEY_LL_TX_Interval 8 //Vox定时发送指令时间间隔
@ -63,17 +59,20 @@ bit Key_Press_l_irq;
bit Key_Press_ll_irq;
KEY_EVENT_E Event_key;
#if 0
uint8_t Key_TWS_Pair_Tim;
uint8_t Key_TWS_Clear_Pair_Tim;
uint8_t Key_TWS_Pair_Cnt;
#endif
uint16_t Key_Press_Debounce;
uint8_t Key_Lift_Debounce;
uint8_t Key_Voltage_Hold_Timer;
/******************************************************************************\
Functions definitions
\******************************************************************************/
@ -147,7 +146,9 @@ uint8_t Key_Lift_Debounce;
Key_Lift_Flag = TRUE;
Key_Lift_Debounce = 0;
Key_Voltage_Hold_Timer = 0;
if( (Key_Press_Debounce <= KEY_PRESS_500MS_CNT) ) //松开按键按下时间小于500ms则识别为短按显示电量
{
Key_Press_short_irq_led = TRUE;
@ -163,6 +164,8 @@ uint8_t Key_Lift_Debounce;
if( nKey_Press_2s_Flag )
{
Key_Press_l_irq = TRUE;
Key_Press_ll_irq = FALSE;
}
}
@ -175,7 +178,8 @@ uint8_t Key_Lift_Debounce;
Key_Press_Debounce = 0;
}
/* 用于按键发码VOX先升压一段时间用于唤醒耳机后发码。 */
if( Key_Lift_Flag && gBoost_Prepared_Flag )
{
if( Key_Press_l_irq )
@ -213,18 +217,32 @@ uint8_t Key_Lift_Debounce;
return;
}
#if VOX_0V_WAKEUP_EAR /*长按后5V持续N00ms后0V持续N00ms保证耳机能被唤醒之后发长按码。*/
if( Key_Voltage_Hold_Timer < Key_VOLTAGE_HOLD_CNT ) //转0V N00ms
{
VOX_EN_Type(VOX_PD1K_Mode);
Key_Voltage_Hold_Timer++;
return;
}
#endif
Key_Press_l_irq = FALSE;
/*todo*/
Event_key = KEY_EVENT_L_2S;
Key_TWS_Pair_Tim = 0;
Vox_Comm_Cfg_Clear();
gVox_Comm.Key_L_2S_Flag = TRUE; //按键2s发码。
#ifdef VOX_TX
/*耳机配对*/
Vox_Get_BES_Addr_Flag[VOL_TYPE] = 0x00;
Vox_Get_BES_Addr_Flag[VOR_TYPE] = 0x00;
#endif
#ifdef _DEBUG_KEY
printf("long 2s press\r\n");
#endif
@ -285,231 +303,34 @@ uint8_t Key_Lift_Debounce;
return;
}
#if VOX_0V_WAKEUP_EAR /*长按后5V持续N00ms后0V持续N00ms保证耳机能被唤醒之后发长按码。*/
if( Key_Voltage_Hold_Timer < Key_VOLTAGE_HOLD_CNT ) //转0V N00ms
{
VOX_EN_Type(VOX_PD1K_Mode);
Key_Voltage_Hold_Timer++;
return;
}
#endif
Boost_Open_Flag = FALSE;
Key_Press_ll_irq = FALSE;
Vox_Comm_Cfg_Clear();
Key_TWS_Clear_Pair_Tim = 0;
gVox_Comm.Key_LL_8s_Flag = TRUE;
Key_Press_ll_irq = FALSE;
/*todo*/
Event_key = KEY_EVENT_LL_8S;
#ifdef _DEBUG_KEY
printf("supper long 8s press.(line:%d)\r\n",(u16)__LINE__);
#endif
}
#if 1
if ( CoverStatus == OPEN )
{
if( Event_key == KEY_EVENT_L_2S ) //长按2s充电仓发送配对指令。
{
if( Key_TWS_Pair_Tim < 1 )
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_TWS_GET_BTADDR,VOL_CHAN);
#else
HandleTxCommand(VHOUSE_CMD_PAIR,VOL_CHAN); //右耳发配对指令,区分耳机通道。
#endif
#endif
Vox_Get_BES_Addr_Flag[VOL_TYPE] = 0x00;
Vox_Get_BES_Addr_Flag[VOR_TYPE] = 0x00;
#ifdef _DEBUG_KEY
printf("Key Pair TX VOR(line:%d).\r\n",(uint16_t)__LINE__);
#endif
}
else
{
if(Key_TWS_Pair_Cnt > KEY_TWS_PAIR_CNT) //耳机蓝牙地址置换超时10s关闭蓝牙地址置换开启VOX 5V。
{
Key_TWS_Pair_Cnt = 0;
#if XUANHENG
HandleTxCommand(CMD_PAIRING_IMD,VOR_CHAN);
HandleTxCommand(CMD_PAIRING_IMD,VOL_CHAN);
#endif
Event_key = KEY_EVENT_Empty;
OpenCover_TX_Cmd_Flag = TRUE;
#if VOX_ENABLE
#ifdef VOX_ADT_ENABLE
Vol_State = VOX_GET_INTO_BOX;
Vor_State = VOX_GET_INTO_BOX;
#else
VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V
#endif
#endif
#ifdef _DEBUG_KEY
printf("Key Pair TimeOut(line:%d).\r\n",(uint16_t)__LINE__);
#endif
return;
}
else
{
if( Vox_Get_BES_Addr_Flag[VOL_TYPE] == 0x01 ) /*收到右耳回复的CMD3指令。*/
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_EXCH_TWS_BTADDR,VOR_CHAN); /*获取到右耳回复的CMD3指令转发给左耳。*/
#elif ZHONGKE
HandleTxCommand( VHOUSE_CMD_GET_TWS_BTADDR, VOR_CHAN ); /*获取到右耳回复的CMD3指令转发给左耳。*/
#elif XUANHENG
HandleTxCommand( CMD_TWS_SET_BTADDR, VOR_CHAN );
#endif
#endif
Vox_Get_BES_Addr_Flag[VOL_TYPE] = 0x02;
#ifdef _DEBUG_KEY
printf("Key Pair Get VOR(line:%d).\r\n",(uint16_t)__LINE__);
#endif
}
else
if( Vox_Get_BES_Addr_Flag[VOL_TYPE] == 0x02 )
{
if( Vox_Get_BES_Addr_Flag[VOR_TYPE] != 0x00 )
{
#ifdef VOX_TX
#if JIELI
HandleTxCommand(VHOUSE_CMD_EXCH_TWS_BTADDR,VOL_CHAN); /*获取到右耳回复的CMD3指令转发给左耳。*/
#elif ZHONGKE
HandleTxCommand( VHOUSE_CMD_GET_TWS_BTADDR, VOL_CHAN ); /*获取到右耳回复的CMD3指令转发给左耳。*/
#elif XUANHENG
HandleTxCommand( CMD_TWS_SET_BTADDR, VOL_CHAN );
#endif
#endif
Vox_Get_BES_Addr_Flag[VOL_TYPE] = 0x00;
Vox_Get_BES_Addr_Flag[VOR_TYPE] = 0x00;
Key_TWS_Pair_Tim = 0;
Key_TWS_Pair_Cnt = 0;
Event_key = KEY_EVENT_Empty;
OpenCover_TX_Cmd_Flag = TRUE;
#if VOX_ENABLE
#ifdef VOX_ADT_ENABLE
Vol_State = VOX_NONE_IN_BOX;
Vor_State = VOX_NONE_IN_BOX;
#else
VOX_EN_Type(VOX_ADT_Mode); //VOX Enable 5V
#endif
#endif
#ifdef _DEBUG_KEY
printf("Key Pair Get VOL(line:%d).\r\n",(uint16_t)__LINE__);
#endif
return;
}
else
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_TWS_GET_BTADDR,VOR_CHAN);
#else
HandleTxCommand(VHOUSE_CMD_PAIR,VOR_CHAN); //右耳发配对指令,区分耳机通道。
#endif
#endif
#ifdef _DEBUG_KEY
printf("Key Pair TX VOL(line:%d).\r\n",(uint16_t)__LINE__);
#endif
}
}
}
}
if(Key_TWS_Pair_Tim > KEY_TWS_PAIR_TIMER) //2s重发一次。重发5次后超时
{
Key_TWS_Pair_Cnt++;
Key_TWS_Pair_Tim = 0;
#ifdef _DEBUG_KEY
printf("Key Pair Cnt:%d.(line:%d)\r\n",(uint16_t)Key_TWS_Pair_Cnt,(uint16_t)__LINE__);
#endif
}
else
{
Key_TWS_Pair_Tim++;
}
}
else
if( Event_key == KEY_EVENT_LL_8S )
{
if( Key_TWS_Clear_Pair_Tim < KEY_TWS_PAIR_CLEAR_CNT ) //每隔200ms发送一次持续时间3s。
{
if( !( Key_TWS_Clear_Pair_Tim % KEY_LL_TX_Interval_2 ) )
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_CLEAR_PAIR,VOR_CHAN);
#else
HandleTxCommand(VHOUSE_CMD_CLEAR_PAIR,VOR_CHAN);
#endif
#endif
}
else
if( !( Key_TWS_Clear_Pair_Tim % KEY_LL_TX_Interval ) )
{
#ifdef VOX_TX
#if XUANHENG
HandleTxCommand(CMD_CLEAR_PAIR,VOL_CHAN);
#else
HandleTxCommand(VHOUSE_CMD_CLEAR_PAIR,VOL_CHAN);
#endif
#endif
}
Key_TWS_Clear_Pair_Tim++;
}
else
{
Event_key = KEY_EVENT_Empty;
OpenCover_TX_Cmd_Flag = TRUE;
Key_TWS_Clear_Pair_Tim = 0;
#if VOX_ENABLE
#ifdef VOX_ADT_ENABLE
Vol_State = VOX_NONE_IN_BOX;
Vor_State = VOX_NONE_IN_BOX;
#else
VOX_EN_Type(VOX_ADT_Mode); //VOX Enable 5V
#endif
#endif
}
}
}
#endif
}
}
}
#endif

View File

@ -15,7 +15,7 @@
* History:
* Revision Date Author Desc
* 1.0.0 2024/11/01 Alex build this file
* DescriptionPWM功能中4PWM_PRE0PWM0_RELPWMx_CMP设置不同通道PWM输出的占空比
* DescriptionPWM功能中4PWM_PRE0PWM0_RELPWMx_CMP设置不同通道PWM输出的占空比
******************************************************************************
*/
#include "pwm.h"

View File

@ -33,15 +33,17 @@
Variables definitions
\******************************************************************************/
uint8_t cnt_sys_tim_5ms;
static uint8_t cnt_sys_tim_5ms;
uint8_t cnt_sys_tim_10ms;
static uint8_t cnt_sys_tim_10ms;
uint8_t cnt_sys_tim_250ms;
static uint8_t cnt_sys_tim_250ms;
uint16_t cnt_sys_tim_100ms;
static uint16_t cnt_sys_tim_100ms;
uint8_t cnt_sys_tim_1s;
static uint8_t cnt_sys_tim_1s;
static uint8_t F_sys_tim_tick;
bit F_sys_tim_1ms;
@ -55,11 +57,11 @@ bit F_sys_tim_100ms;
bit F_sys_tim_1s;
uint8_t F_sys_tim_tick;
#if TIMER1_ENABLE
bit F_sys_tim1_tick;
bit F_sys_tim2_tick;
#endif
/******************************************************************************\
Functions definitions
@ -83,6 +85,7 @@ void Sys_Tim0_Handler(void)
if(F_sys_tim_tick == 0)
return;
F_sys_tim_tick = 0;
//system tick
F_sys_tim_1ms = TRUE;
@ -91,6 +94,7 @@ void Sys_Tim0_Handler(void)
if(cnt_sys_tim_5ms >= 5)
{
cnt_sys_tim_5ms = 0;
F_sys_tim_5ms = TRUE;
}
@ -98,7 +102,8 @@ void Sys_Tim0_Handler(void)
cnt_sys_tim_10ms++;
if(cnt_sys_tim_10ms >= 10)
{
cnt_sys_tim_10ms = 0;
cnt_sys_tim_10ms = 0;
F_sys_tim_10ms = TRUE;
}
@ -107,6 +112,7 @@ void Sys_Tim0_Handler(void)
if(cnt_sys_tim_100ms >= 100)
{
cnt_sys_tim_100ms = 0;
F_sys_tim_100ms = TRUE;
}
@ -115,6 +121,7 @@ void Sys_Tim0_Handler(void)
if(cnt_sys_tim_250ms>=250)
{
cnt_sys_tim_250ms = 0;
F_sys_tim_250ms = TRUE;
//-----------------250ms-------------------------
@ -122,6 +129,7 @@ void Sys_Tim0_Handler(void)
if(cnt_sys_tim_1s >= 4)
{
cnt_sys_tim_1s = 0;
F_sys_tim_1s = TRUE;
}
}

View File

@ -21,6 +21,7 @@
#include "system.h"
#include "vox_module.h"
#include "sleep.h"
#include "vox_comm.h"
/******************************************************************************\
Macro definitions

View File

@ -133,6 +133,11 @@ void System_Drivers_Machine(void)
#if VOX_ENABLE
#ifdef VOX_COMM_ENABLE
/*双向通讯功能处理函数*/
Vox_Comm_Handle();
#endif
#ifdef VOX_ADT_ENABLE
/*Vox 过流保护两只耳机都每隔200ms打嗝一次*/

View File

@ -51,13 +51,6 @@ bit Vox_Output_Short_Flag;
/******************************************************************************\
Macro definitions
\******************************************************************************/
/*100ms调用周期*/
#define KEY_TWS_PAIR_TIMER 2
#define KEY_TWS_PAIR_CNT 6
#define Vox_COM_MSG_Tim 20
#if VOX_FOLLOW_CHG
#define VOX_FOLLOW_CHG_NOWCURCHK_CNT 5
@ -70,9 +63,9 @@ bit Vox_Output_Short_Flag;
\******************************************************************************/
#if VOX_FOLLOW_CHG
uint8_t Vox_Follow_Init_Deb;
idata uint8_t Vox_Follow_Init_Deb;
uint16_t Vox_Follow_Chg_Debounce;
idata uint16_t Vox_Follow_Chg_Debounce;
g_Vox_Fllow_Chg_Cfg Vox_Fllow_Chg;
@ -80,7 +73,7 @@ e_Vox_Follow_Chg_Sta Follow_Chg_Sta;
#endif
uint8_t EarPhone_Num;
idata uint8_t EarPhone_Num;
bit Vox_Ocp_Flag;
@ -174,7 +167,6 @@ bit OpenCover_TX_Cmd_Flag;
default:
break;
}
}
/*
@ -261,7 +253,6 @@ bit OpenCover_TX_Cmd_Flag;
default:
break;
}
}
#else
@ -377,7 +368,6 @@ bit Vol_GetOut_Box_Flag; //Vol
*
*******************************************************************************
*/
void Vol_Det_Machine(void)
{
static uint8_t nVol_Loadon_Det_Debounce; //loadon标志检测延时计数
@ -920,7 +910,9 @@ void Vox_Det_Machine(void)
{
static bit Get_CHIP_STA1_Flag0;
static bit Get_CHIP_STA1_Flag1;
static bit nVox_Comm_Flag;
static bit nVox_Comm_Over_Flag;
static bit Cover_Close_Flag;
@ -977,7 +969,9 @@ void Vox_Det_Machine(void)
Get_CHIP_STA1_Flag0 = FALSE;
Get_CHIP_STA1_Flag1 = FALSE;
nVox_Comm_Flag = FALSE;
nVox_Comm_Over_Flag = FALSE;
CoverEvent_Flg1 = TRUE;
@ -1037,8 +1031,9 @@ void Vox_Det_Machine(void)
CoverEvent_Flg = FALSE;
}
/* 开关盖后VOX先升压5.2V 一段时间唤醒耳机后转入ADT获取盒内耳机数量。 */
if( Vox_Voltage_Hold_Timer < HALL_OPEN_VOX_5V_DEBOUNCE ) //开盖后5V N00ms。
if( Vox_Voltage_Hold_Timer < HALL_EVENT_VOX_5V_DEBOUNCE ) //开盖后5V N00ms。
{
Vox_Voltage_Hold_Timer++;
@ -1079,13 +1074,12 @@ void Vox_Det_Machine(void)
printf( "Open/Close Box,Earphones In Box(Num:%d)(VoxSta:0x%x).\r\n",(u16)EarPhone_Num, (u16)(CHIP_STA1) );
#endif
}
}
/* 发送开盖指令*/
if( Cover_Open_Flag ) /*开盖后5V持续N00ms后0V持续N00ms保证耳机能被唤醒之后发开盖码。*/
{
#if 1
#if VOX_0V_WAKEUP_EAR
if( Vox_TX_Timer < HALL_OPEN_VOX_0V_DEBOUNCE ) //转0V N00ms
{
VOX_EN_Type(VOX_PD1K_Mode);
@ -1094,68 +1088,63 @@ void Vox_Det_Machine(void)
}
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_GET_VBAT,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_GET_VBAT,VOR_CHAN); //右耳发开盖指令,区分耳机通道。
#elif XUANHENG
HandleTxCommand(CMD_HEARTBEAT,VOR_CHAN);
#endif
#endif
{
#ifdef VOX_COMM_ENABLE
}
Vox_Output_Debounce++;
/* 双向通讯,开盖发码。 */
if( !nVox_Comm_Flag )
{
Vox_Comm_Cfg_Clear();
gVox_Comm.Cover_Open_Flag = TRUE; //置开盖发码标志位
nVox_Comm_Flag = TRUE;
#ifdef _DEBUG_VOX
printf("TX Comm Cover Open.(line:%d)\r\n ", (u16)__LINE__);
#endif
return;
}
else
#endif
{
#ifdef VOX_COMM_ENABLE
if( !gVox_Comm.Cover_Open_Flag ) //开盖发码完成
#endif
{
if ( !nVox_Comm_Over_Flag )
{
nVox_Comm_Over_Flag = TRUE;
VOX_EN_Type(VOX_ADT_Mode);
OpenCover_TX_Cmd_Flag = TRUE;
Vox_Vout_Enable = OFF;
#ifdef _DEBUG_VOX
printf("Open Box CMD TX Over.\r\n");
#endif
}
}
else
{
VOX_EN_Type(VOX_ADT_Mode);
Vox_Output_Debounce = 0;
Get_CHIP_STA1_Flag1 = TRUE;
OpenCover_TX_Cmd_Flag = TRUE;
Vox_Vout_Enable = OFF;
#ifdef _DEBUG_VOX
printf("Open Box CMD TX Over.\r\n");
#endif
return;
}
}
else
{
if( Event_key == KEY_EVENT_Empty )
{
if( OpenCover_TX_Cmd_Flag )
{
OpenCover_TX_Cmd_Flag = FALSE;
CHIP_STA1_BK = CHIP_STA1 & ( VOR_LoadOn | VOL_LoadOn );
}
else
if( Event_key == KEY_EVENT_Empty )
{
if( OpenCover_TX_Cmd_Flag )
{
OpenCover_TX_Cmd_Flag = FALSE;
nVox_Comm_Over_Flag = TRUE;
CHIP_STA1_BK = CHIP_STA1 & ( VOR_LoadOn | VOL_LoadOn );
}
else
{
if( nVox_Comm_Over_Flag )
{
/*耳机出入盒判断*/
if( CHIP_STA1_BK != ( CHIP_STA1 & ( VOR_LoadOn | VOL_LoadOn ) ) ) //查询耳机loadon状态loadon状态改变则说明有耳机出入盒。
@ -1236,85 +1225,45 @@ void Vox_Det_Machine(void)
Wkup_Earphone_Flag = FALSE;
}
else
{
{
#ifdef VOX_COMM_ENABLE
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
}
#if VOX_0V_WAKEUP_EAR /*关盖后5V持续N00ms后0V持续N00ms保证耳机能被唤醒之后发关盖码。*/
if( Vox_TX_Timer < HALL_CLOSE_VOX_0V_DEBOUNCE ) //转0V N00ms
{
VOX_EN_Type(VOX_PD1K_Mode);
Vox_TX_Timer++;
return;
}
if( Vox_Output_Debounce <= Vox_COM_MSG_Tim ) //关盖后5s发送获取电量命令。
else
#endif
{
if( (Vox_Output_Debounce % Vox_TX_Interval_2) == 0 ) //200ms发送一次
/* 双向通讯,关盖发码。 */
if( !nVox_Comm_Flag )
{
#ifdef VOX_TX
Vox_Comm_Cfg_Clear();
#if JIELI
HandleTxCommand(VHOUSE_CMD_CLOSE_WIN_GET_VBAT,VOL_CHAN); //左耳发开盖指令,区分耳机通道。
#elif ZHONGKE
HandleTxCommand(VHOUSE_CMD_GET_TWS_BTADDR,VOL_CHAN); //左耳发开盖指令,区分耳机通道。
#elif XUANHENG
HandleTxCommand(CMD_TWS_GET_BTADDR,VOL_CHAN);
gVox_Comm.Cover_Close_Flag = TRUE; //置关盖发码标志位
nVox_Comm_Flag = TRUE;
#ifdef _DEBUG_VOX
printf("TX Comm Cover Close.(line:%d)\r\n ", (u16)__LINE__);
#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_GET_TWS_BTADDR,VOR_CHAN); //右耳发开盖指令,区分耳机通道。
#elif XUANHENG
HandleTxCommand(CMD_TWS_GET_BTADDR,VOR_CHAN);
#endif
#endif
return;
}
else
{
if( gVox_Comm.Cover_Close_Flag ) //关盖发码中
{
return;
}
}
Vox_Output_Debounce++;
return;
}
}
#endif
}
/*Vox 过流保护两只耳机都每隔500ms打嗝一次*/
@ -1356,6 +1305,8 @@ void Vox_Det_Machine(void)
printf("VOX Vout 5V(STA1:0x%x,line:%d).\r\n",(uint16_t)CHIP_STA1, (uint16_t)__LINE__);
#endif
Cover_Close_Flag1 = FALSE;
Vox_Voltage_Hold_Timer = 0;
}
else
{
@ -1394,51 +1345,40 @@ void Vox_Det_Machine(void)
}
}
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++;
{
#ifdef VOX_COMM_ENABLE
if( !Vox_Getinto_Sleep_Flag )
{
Vox_Getinto_Sleep_Flag = TRUE;
Vox_Comm_Cfg_Clear();
gVox_Comm.Vox_Chg_Full_Flag = TRUE;
#ifdef _DEBUG_VOX
printf("TX Comm Vox Chg Full.(line:%d)\r\n ", (u16)__LINE__);
#endif
}
else
{
if( !Vox_Getinto_Sleep_Flag )
{
Vox_Getinto_Sleep_Flag = TRUE;
VOX_EN_Type(VOX_ADT_Mode);
Vox_Vout_Enable = OFF;
#ifdef _DEBUG_VOX
printf("VOX Get Into Sleep.\r\n");
#endif
{
#ifdef VOX_COMM_ENABLE
if( !gVox_Comm.Vox_Chg_Full_Flag )
#endif
{
if ( !nVox_Comm_Over_Flag )
{
nVox_Comm_Over_Flag = TRUE;
VOX_EN_Type(VOX_ADT_Mode);
Vox_Vout_Enable = OFF;
#ifdef _DEBUG_VOX
printf("VOX Get Into Sleep.\r\n");
#endif
}
}
}
}
}
}
}
@ -1484,7 +1424,7 @@ void Vox_Det_Machine(void)
*******************************************************************************
* void Vox_Follow_Chg( g_Vox_Fllow_Chg_Cfg *g_Vox_Fllow_Chg )
*
* Description : Vox (40ms调用周期)
* Description : Vox (100ms调用周期)
*
* Arguments : g_Vox_Fllow_Chg_Cfg *g_Vox_Fllow_Chg
@ -1499,7 +1439,7 @@ void Vox_Follow_Chg( g_Vox_Fllow_Chg_Cfg *n_Vox_Fllow_Chg )
{
static bit nVpmid_Value_Setting;
switch (Follow_Chg_Sta)
switch ( Follow_Chg_Sta )
{
case Vox_Follow_Chg_InitSta: //STA0:PMID=5.2V可以保证耳机一定能进入充电状态,并持续一段时间保证耳机能开始抽电。
@ -1959,8 +1899,7 @@ void Vox_Follow_Chg( g_Vox_Fllow_Chg_Cfg *n_Vox_Fllow_Chg )
#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
DisCharge_Boost_Open(OFF, n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present);
DisCharge_Boost_Open(OFF, n_Vox_Fllow_Chg->Vpmid_Threshold_At_Present);
}
}
}