473 lines
12 KiB
C
473 lines
12 KiB
C
/************************************************************************************
|
||
* @Copyright (c) :(C)2021, Qindao ieslab Co., Ltd
|
||
* @FileName :ble_driver.h
|
||
* @Author :QDIES PLATFORM TEAM
|
||
* @Version :V1.1
|
||
* @Date :2021-7
|
||
* @Description :
|
||
************************************************************************************/
|
||
|
||
#ifndef __BLE_DRIVER_H
|
||
#define __BLE_DRIVER_H
|
||
|
||
#include "type.h"
|
||
#include <string.h>
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif
|
||
|
||
/*---------------- 配置宏开关,可根据MCU类型或主从模式使用情况进行选择 --------------------*/
|
||
//#define HDSC_HC32L13x 1 //华大13x系列
|
||
//#define HDSC_HC32L196 (!HDSC_HC32L13x)//华大196系列
|
||
|
||
#define BLE_CENTRAL_SLAVE_MOD 0 //驱动是否为主从模式都支持,0从机,1主从机
|
||
|
||
/*------------------------------------*/
|
||
#define BLE_POW_PORT (GpioPortE) //电源控制
|
||
#define BLE_POW_PIN (GpioPin4)
|
||
|
||
#define BLE_CON_PORT (GpioPortA) //连接状态指示
|
||
#define BLE_CON_PIN (GpioPin4)
|
||
#define BLE_CON_IRQ PORTA_IRQn
|
||
#define BLE_CON_PRIORITY IrqLevel2 //中断优先级
|
||
|
||
#define BLE_LOWPOWER_PORT (GpioPortA) //唤醒蓝牙
|
||
#define BLE_LOWPOWER_PIN (GpioPin2)
|
||
|
||
#define BLE_RXPORT_IRQ PORTA_IRQn
|
||
#define BLE_RXPORT_PRIORITY IrqLevel2 //中断优先级
|
||
|
||
#define BLE_CONorRX_IRQHandler PORTA_IRQHandler
|
||
//#define BLE_TX_IRQHandler PORTA_IRQHandler
|
||
|
||
#define BLE_CON_MSG 0xAA //蓝牙连接
|
||
#define BLE_DISCON_MSG 0xBB //蓝牙断开
|
||
#define BLE_CON_NOMSG 0X00
|
||
|
||
#define CENTRAL_MODE 0xAA //主机模式
|
||
#define SLAVE_MODE 0xBB //从机模式
|
||
#define MODE_ERROR 0x00 //主从切换失败
|
||
|
||
|
||
#define SCAN_END 0x00 //扫描结束或未开始
|
||
#define SCAN_ING 0xBB //扫描中
|
||
#define SACN_START_ORDER 0xAA //启动扫描
|
||
#define SACN_STOP_ORDER 0xBB //停止扫描
|
||
#define SCAN_START 0xCC //开始扫描
|
||
|
||
#define CON_START_ORDER 0xAA //建立连接
|
||
#define CON_STOP_ORDER 0xBB //断开连接
|
||
#define CON_END 0xAA //连接结束或未开始
|
||
#define CON_ING 0xBB //连接中
|
||
#define CON_START 0xCC //开始连接
|
||
|
||
#define CHK_KEY_WORD 0xAA //查询关键字
|
||
#define SET_KEY_WORD 0xBB //修改关键字
|
||
#define CLR_KEY_WORD 0xCC //取消关键字
|
||
|
||
#define CHK_WHITE_LIST 0xAA //查询白名单
|
||
#define SET_WHITE_LIST 0xBB //修改白名单
|
||
#define CLR_WHITE_LIST 0xCC //取消白名单
|
||
|
||
#define CHK_NAME_MAC 0xAA //查询蓝牙名称及MAC
|
||
#define SET_NAME_MAC 0xBB //修改蓝牙名称及MAC
|
||
|
||
#define CHK_BLE_SEC 0xAA //查询蓝牙加密配对
|
||
#define SET_BLE_SEC 0xBB //启用蓝牙加密配对
|
||
#define CLR_BLE_SEC 0xCC //取消蓝牙加密配对
|
||
|
||
#define CHK_BLE_PIN 0xAA //查询蓝牙配对密码
|
||
#define SET_BLE_PIN 0xBB //设置蓝牙配对密码
|
||
|
||
//任务完成情况
|
||
#define BLE_TASK_FAIL 0xA8
|
||
#define BLE_TASK_SUCCESS 0xA9
|
||
#define BLE_TASK_INIT 0xB0
|
||
|
||
#define BLE_NAME_MAX_LEN 12 //蓝牙名称的最大长度
|
||
|
||
//初始化状态机状态号BLE
|
||
enum BLE_MAIN_STA
|
||
{
|
||
S_BLE_IDLE = 0 ,
|
||
S_BLE_MAIN_INIT ,
|
||
S_BLE_MAIN_CENTRAL_SWITCH ,
|
||
S_BLE_MAIN_SCAN ,
|
||
S_BLE_MAIN_CONNECT ,
|
||
S_BLE_MAIN_NAME_MAC ,
|
||
S_BLE_MAIN_ADV_DATA ,
|
||
S_BLE_MAIN_ADV_PARAM ,
|
||
S_BLE_MAIN_KEY_WORD ,
|
||
S_BLE_MAIN_WHITE_LIST ,
|
||
S_BLE_MAIN_CHK_STATUS ,
|
||
S_BLE_MAIN_SEC_PIN ,
|
||
};
|
||
|
||
enum BLEINIT_STA
|
||
{
|
||
S_BLEINIT_POWER_ON = 1 , //模块送电
|
||
S_BLEINIT_POWER_WAIT ,
|
||
S_BLEINIT_POWER_DW , //开始断电复位
|
||
S_BLEINIT_POWER_DW_R ,
|
||
S_BLEINIT_ATS , //发送初始化AT指令
|
||
S_BLEINIT_ADV0_CTL , //关闭广播
|
||
S_BLEINIT_VER , //查询软件版本
|
||
S_BLEINIT_NAME , //查询广播名称
|
||
S_BLEINIT_NAME_SET , //设置广播名称
|
||
S_BLEINIT_MAC , //查询模块物理地址
|
||
S_BLEINIT_MAC_SET , //设置模块物理地址
|
||
S_BLEINIT_MAC_SAVE , //保存MAC
|
||
S_BLEINIT_MAC_RESET , //保存MAC后需复位
|
||
S_BLEINIT_TXPOW , //查询发射功率
|
||
S_BLEINIT_TXPOW_SET , //设置发射功率
|
||
S_BLEINIT_ADVPERIOD , //查询广播间隔时间
|
||
S_BLEINIT_ADVPERIOD_SET , //设置广播间隔时间
|
||
S_BLEINIT_CONPERIOD , //查询广播间隔时间
|
||
S_BLEINIT_CONPERIOD_SET , //设置广播间隔时间
|
||
S_BLEINIT_ADVMFID_SET , //设置广播数据
|
||
S_BLEINIT_ADV_CTL , //打开广播
|
||
S_BLEINIT_END
|
||
};
|
||
|
||
#if BLE_CENTRAL_SLAVE_MOD
|
||
//BLE主从模式切换状态
|
||
enum BLEMODESWITCH_STA
|
||
{
|
||
// S_BLE_SWITCH_IDLE = 0 ,
|
||
S_BLE_SWITCH_CENTRAL = 1 , //主机模式
|
||
S_BLE_SWITCH_CENTRAL_CHK , //先查询链接状态
|
||
S_BLE_SWITCH_CENTRAL_DISCON , //断开连接
|
||
S_BLE_SWITCH_ADV0 , //停止广播
|
||
S_BLE_SWITCH_STATUS , //查询当前主从模式
|
||
S_BLE_SWITCH_SET_CENTRAL , //切换主机模式
|
||
S_BLE_SWITCH_SLAVE ,
|
||
S_BLE_SWITCH_SLAVE_CHK , //先查询链接状态
|
||
S_BLE_SWITCH_SLAVE_DISCON , //断开连接
|
||
S_BLE_SWITCH_STATUS_SLAVE ,
|
||
S_BLE_SWITCH_SET_SLAVE , //切换从机模式
|
||
S_BLE_SWITCH_ADV1 , //开启广播
|
||
};
|
||
|
||
//BLE开始扫描状态
|
||
enum BLESCAN_STA
|
||
{
|
||
// S_BLE_SCAN_IDLE = 0 ,
|
||
S_BLE_SCAN_START = 1 ,
|
||
S_BLE_SCAN_DISCON , //断开连接
|
||
S_BLE_SCAN_ING , //启动扫描
|
||
S_BLE_SCAN_OVERTIME , //扫描超时
|
||
S_BLE_SCAN_STOP ,
|
||
S_BLE_SCAN_END ,
|
||
S_BLE_SCAN_END_OVERTIME ,
|
||
};
|
||
|
||
//BLE更新MAC白名单状态
|
||
enum BLEWHITELIST_STA
|
||
{
|
||
S_BLE_WHITE_LIST = 1 , //修改白名单
|
||
S_BLE_WHITE_LIST_R ,
|
||
S_BLE_WHITE_LIST_CLR , //取消白名单
|
||
S_BLE_WHITE_LIST_CLR_R ,
|
||
S_BLE_WHITE_LIST_CHK , //差白名单
|
||
S_BLE_WHITE_LIST_CHK_R ,
|
||
S_BLE_WHITE_LIST_SAVE , //保存
|
||
};
|
||
|
||
#endif
|
||
//BLE建立连接状态
|
||
enum BLECON_STA
|
||
{
|
||
S_BLE_CON_START = 1 ,
|
||
S_BLE_CON_STATE_CHEK ,
|
||
S_BLE_CON_DISCON , //断开连接
|
||
S_BLE_CON_DISCON_WAIT , //断开连接延时
|
||
S_BLE_CON_CLRBNDE ,
|
||
S_BLE_CON_RECON , //重新根据MAC连接
|
||
S_BLE_CON_RECON_R ,
|
||
S_BLE_CON_RECON_XIAODOU ,
|
||
S_BLE_CON_STOP , //断开连接
|
||
S_BLE_CON_END ,
|
||
};
|
||
|
||
//BLE修改蓝牙名称及MAC状态
|
||
enum BLECHANGEMAC_STA
|
||
{
|
||
S_BLE_MAC_SET_START = 1 ,
|
||
S_BLE_MAC_DISCON , //断开连接
|
||
S_BLE_MAC_ADV0 , //停止广播
|
||
S_BLE_MAC_NAME , //修改蓝牙名称
|
||
S_BLE_MAC_MAC , //修改MAC
|
||
S_BLE_MAC_SAVE , //修改完MAC要保存
|
||
S_BLE_MAC_RESET , //修改完成后复位
|
||
S_BLE_MAC_ADV1 ,
|
||
S_BLE_MAC_CHK_START ,
|
||
S_BLE_MAC_NAME_CHK ,
|
||
S_BLE_MAC_MAC_CHK ,
|
||
};
|
||
|
||
//BLE更新广播数据状态
|
||
enum BLEUPDATEADVDATA_STA
|
||
{
|
||
S_BLE_UPDATE_ADV_START = 1 ,
|
||
S_BLE_UPDATE_ADV , //更新广播数据
|
||
S_BLE_UPDATE_ADV_RD_MAC ,
|
||
};
|
||
|
||
//BLE更新广播参数状态
|
||
enum BLECHANGEADVPARA_STA
|
||
{
|
||
S_BLE_CHANGE_ADV_START = 1 ,
|
||
S_BLE_CHANGE_ADV0 , //停止广播
|
||
S_BLE_CHANGE_ADV_PARAM , //修改广播间隔
|
||
S_BLE_CHANGE_CON_PARAM , //修改连接间隔
|
||
S_BLE_CHANGE_TX_POWER , //修改发射功率
|
||
S_BLE_CHANGE_SCAN_TIMES , //修改扫描次数
|
||
S_BLE_CHANGE_SAVE , //修改完成后保存
|
||
S_BLE_CHANGE_ADV1 , //开启广播
|
||
};
|
||
|
||
//BLE更新关键字状态
|
||
enum BLECHANGEKEYWORD_STA
|
||
{
|
||
S_BLE_SET_KEY_WORD = 1 , //修改关键字
|
||
S_BLE_SET_KEY_WORD_R ,
|
||
S_BLE_CHK_KEY_WORD , //查询关键字
|
||
S_BLE_CHK_KEY_WORD_R ,
|
||
S_BLE_CLEAR_KEY_WORD , //取消关键字
|
||
S_BLE_CLEAR_KEY_WORD_R ,
|
||
S_BLE_KEY_WORD_SAVE , //保存
|
||
};
|
||
|
||
//BLE查询蓝牙主从模式及连接状态
|
||
enum BLECHKSTATUS_STA
|
||
{
|
||
S_BLE_CHK_STATUS = 1 , //查询主从模式及连接状态
|
||
S_BLE_CHK_STATUS_R ,
|
||
};
|
||
|
||
//BLE查询或设置加密配对状态
|
||
enum BLESEC_STA
|
||
{
|
||
S_BLE_CHK_SEC = 1 , //查询SEC
|
||
S_BLE_CHK_SEC_R ,
|
||
S_BLE_CHK_PIN , //查询PIN
|
||
S_BLE_SET_SEC_ADV0 ,
|
||
S_BLE_SET_SEC_ADV0_R ,
|
||
S_BLE_SET_PIN , //设置PIN
|
||
S_BLE_SET_PIN_R ,
|
||
S_BLE_SET_SEC , //设置SEC
|
||
S_BLE_SET_SEC_R ,
|
||
|
||
S_BLE_SET_SEC_ADV1 ,
|
||
S_BLE_CLR_SEC , //取消
|
||
S_BLE_CLR_SEC_R ,
|
||
S_BLE_SEC_RESET ,
|
||
S_BLE_SEC_SAVE , //保存
|
||
};
|
||
|
||
|
||
//AT指令通用状态,子状态机状态
|
||
typedef enum{
|
||
// AT_REQUEST_IDLE = 0 ,
|
||
BLE_AT_REQUEST_SEND = 1 ,
|
||
BLE_AT_REQUEST_CHECK ,
|
||
BLE_AT_REQUEST_WT ,
|
||
}BLE_TYP_STATE_AT_REQUEST;
|
||
|
||
|
||
//模组AT指令编号
|
||
typedef enum {
|
||
AT_CODE_AT = 0 , //AT
|
||
AT_CODE_VER_CHK , //版本检查
|
||
AT_CODE_NAME_CHK , //广播名称查询
|
||
AT_CODE_NAME , //广播名称设置
|
||
AT_CODE_MAC_CHK , //查询MAC
|
||
AT_CODE_MAC , //设置MAC
|
||
AT_CODE_TXPOWER_CHK , //发射功率查询
|
||
AT_CODE_TXPOWER , //发射功率设置
|
||
AT_CODE_ADVPARAM_CHK , //广播间隔查询
|
||
AT_CODE_ADVPARAM , //广播间隔设置
|
||
AT_CODE_CONPARAM_CHK , //连接间隔查询
|
||
AT_CODE_CONPARAM , //连接间隔设置
|
||
AT_CODE_ADVMFID , //广播数据设置
|
||
AT_CODE_ADV0 , //关闭广播
|
||
AT_CODE_ADV1 , //打开广播
|
||
AT_CODE_DISCON , //断开所有连接
|
||
AT_CODE_SLAVE , //设置为从机模式
|
||
#if BLE_CENTRAL_SLAVE_MOD
|
||
AT_CODE_CENTRAL , //设置为主机模式
|
||
AT_CODE_SCAN , //扫描周围设备
|
||
AT_CODE_CONNECT , //连接指定设置
|
||
AT_CODE_STOP_SCAN , //停止扫描
|
||
AT_CODE_WHITE_LIST_SET , //设置MAC白名单
|
||
AT_CODE_WHITE_LIST_CLR , //取消MAC白名单
|
||
AT_CODE_WHITE_LIST_CHK , //查询MAC白名单
|
||
#endif
|
||
AT_CODE_SCAN_TIMES , //扫描次数
|
||
AT_CODE_KEY_CHK , //查询关键字
|
||
AT_CODE_KEY_SET , //修改关键字
|
||
AT_CODE_KEY_CLR , //取消关键字
|
||
AT_CODE_RESET , //蓝牙软复位
|
||
AT_CODE_SAVE , //蓝牙保存参数
|
||
AT_CODE_STATUS , //蓝牙查询主从模式及连接状态
|
||
AT_CODE_SEC_CHK , //查询蓝牙加密配对
|
||
AT_CODE_SEC_SET , //设置蓝牙加密配对
|
||
AT_CODE_SEC_CLR , //取消蓝牙加密配对
|
||
AT_CODE_PIN_CHK , //查询蓝牙配对密码
|
||
AT_CODE_PIN , //设置蓝牙配对密码
|
||
AT_CODE_CLRBNDE , //加密配对启用时,建立连接前需发送清除命令
|
||
|
||
AT_CODE_ALL
|
||
} BLE_TYP_AT_CMDCODE;
|
||
|
||
//AT指令等待应答时间
|
||
typedef enum { //使用100ms定时器
|
||
BLE_WT_0S = 0,
|
||
BLE_WT_halfS = 5,
|
||
BLE_WT_1S = 10,
|
||
BLE_WT_2S = 20,
|
||
BLE_WT_5S = 50,
|
||
} BLE_TYP_AT_WAIT_TIME;
|
||
|
||
//AT指令重试次数
|
||
typedef enum {
|
||
BLE_RETRY_0 = 0,
|
||
BLE_RETRY_1,
|
||
BLE_RETRY_2,
|
||
BLE_RETRY_3,
|
||
BLE_RETRY_4,
|
||
BLE_RETRY_5,
|
||
BLE_RETRY_15 = 15,
|
||
} BLE_TYP_AT_RETRY_COUNT;
|
||
|
||
//AT指令状态机执行结果
|
||
typedef enum {
|
||
ResultBusy = 0,
|
||
ResultOk,
|
||
ResultError,
|
||
ResultFail
|
||
} BLE_TYP_RESULT_CODE;
|
||
|
||
//连接状态
|
||
typedef enum {
|
||
BleNoCon = 0,
|
||
BleSlaveCon,
|
||
BleMasterCon
|
||
} TYP_CON_STATUS;
|
||
|
||
//供电状态状态
|
||
typedef enum {
|
||
BlePowerOk = 0,
|
||
BlePowerWrong, //故障,强制断电状态
|
||
BlePowerFactory //厂区模式期间断电状态
|
||
} TYP_POWER_STATUS;
|
||
//******************************* 结构体定义*************************************
|
||
|
||
typedef struct
|
||
{
|
||
unsigned char AtCode; //指令编号
|
||
unsigned char CaseAtNum; //应答处理编号
|
||
unsigned char ErrorLimit; //最大尝试出错次数
|
||
// unsigned char ExpectLen; //期待应答数据长度
|
||
char* pAtCmdStr; //指令内容指针
|
||
// char* pExpectData; //期待应答数据内容指针
|
||
unsigned short int WaitTime;//等待应答最大时间,ms
|
||
} BLE_STRUCT_AT_CMD, *P_BLE_STRUCT_AT_CMD;
|
||
|
||
typedef union
|
||
{
|
||
struct
|
||
{
|
||
u8 at_err:1 ; //查询AT异常
|
||
u8 ver_err:1 ; //查询版本异常
|
||
u8 name_chk_err:1 ; //查询蓝牙名称异常
|
||
u8 name_set_err:1 ; //设置蓝牙名称异常
|
||
u8 mac_chk_err:1 ; //查询蓝牙MAC异常
|
||
u8 mac_set_err:1 ; //设置蓝牙MAC异常
|
||
|
||
};
|
||
mtype32_ err_byte;
|
||
} BLE_STATE_ERR; //蓝牙状态错误指示
|
||
|
||
typedef struct
|
||
{
|
||
u8 Ble_cur_mode; //当前主从模式
|
||
u8 Ble_scan_state; //当前扫描状态,扫描未开始、扫描中、扫描结束
|
||
u8 Ble_con_state; //当前的连接状态
|
||
u8 Ble_power_flag; //当前的供电状态
|
||
u8 Ble_con_MAC[12]; //连接时的MAC
|
||
u8 Ble_adv_data[13]; //广播数据
|
||
u8 Ble_key_word_len; //关键字长度
|
||
u8 Ble_key_word[12]; //关键字内容
|
||
u8 Ble_white_list[15][6]; //MAC白名单
|
||
u8 Ble_softverson[2]; //蓝牙版本
|
||
u8 Ble_name[12]; //蓝牙名称
|
||
u8 Ble_mac[6]; //蓝牙MAC
|
||
u8 Ble_cur_sec; //蓝牙当前的加密配对状态
|
||
u8 Ble_cur_pin[3]; //蓝牙当前使用的配对密码,密码不超过六位
|
||
|
||
} BLE_WORK_STATE;
|
||
|
||
//******************************* 外部变量***************************************
|
||
|
||
|
||
//******************************* 外部接口函数***********************************
|
||
void BleInit(void);
|
||
void BleMainMachine(void);
|
||
u8 BleIfIdle(void);
|
||
u8 BleIfSleep(void);
|
||
void BlePreSleep(void);
|
||
void BleWakeSleep(void);
|
||
|
||
void BlePowerOff(void);
|
||
void BlePowerOn(void) ;
|
||
u8 BleIfPowerOn(void);
|
||
void BleForcePowerOff(TYP_POWER_STATUS data);
|
||
|
||
u8 format_ascii2hex(u8 *dest, u8 *sour, u8 sourlen);
|
||
//任务启动接口
|
||
void BleStartInitTask(void); //初始化启动
|
||
void BleCentralSwitchTask(u8 switch_type); //主从切换启动
|
||
u8 BleGetCurMode(void); //获取当前的模式
|
||
|
||
|
||
u8 BleConMacTask(u8 con_oeder,u8 *con_mac); //连接或断开连接
|
||
u8 BleGetCurConState(void); //查询当前连接状态
|
||
void BleNameMacTask(u8 opr_type,u8* name_src);//启动修改蓝牙名称及MAC
|
||
u8 BleUpdataAdvDataTask(u8* snd_data); //启动更新广播数据
|
||
void BleChangeAdvParaTask(void); //启动变更蓝牙参数
|
||
void BleKeyWordTask(u8 type,u8* key_word,u8 key_len);//启动变更蓝牙关键字
|
||
u8 BleGetCurKeyWord(u8* key_addr); //查询当前关键字
|
||
void BleChkStatusTask(void); //启动查询当前的主从模式及连接状态
|
||
u8 BleSecChkOrSetTask(u8 sec_type); //启动查询、设置、取消蓝牙加密配对
|
||
u8 BleChkCurSecState(u8 **cur_pin); //获取蓝牙当前的加密配对状态及PIN
|
||
|
||
#if BLE_CENTRAL_SLAVE_MOD
|
||
void BleMacWhiteListTask(u8 type,u8* list_addr);//启动MAC白名单
|
||
u8 BleScanTask(u8 scan_order); //启动或关闭扫描
|
||
u8 BleGetCurScanState(void); //获取当前扫描状态
|
||
#endif
|
||
|
||
void BleGetFirmVerson(u8* verson_addr); //获取蓝牙版本号
|
||
void BleGetCurMacAddr(u8 *cur_mac); //获取当前蓝牙的MAC
|
||
void Ble_IODeInit(void);
|
||
void BleClearResetCount(void);
|
||
TYP_POWER_STATUS BleGetPowerState(void);
|
||
//u8 BleCheckConInitMsg(void);
|
||
//u8 BleClrConInitMsg(void);
|
||
//u8 BleCheckTxInitMsg(void);
|
||
//u8 BleClrTxInitMsg(void);
|
||
|
||
//#pragma pack()
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif
|
||
|
||
|
||
|