/************************************************************************************ * @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 #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