Files
CHJ/user/Device/BLE.c
2026-03-20 21:16:58 +08:00

319 lines
9.1 KiB
C
Executable File
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.

/****************************************************************************
** BLE.c
**
** Copyright (c) Siargo Ltd. 2020
** All Rights Reserved.
**
** BY DMY
**
** 蓝牙无线通讯模块
**
**
** 历史文件
** 2026-03-09 V1000
*****************************************************************************/
/* Includes ----------------------------------------------------------------*/
#include "../main/SystemInclude.h"
/* -------------------定义变量--------------------------------------*/
extern DMA_HandleTypeDef DMA_Handle_UartRx , DMA_Handle_UartTx ;
static u8 BLE_resp = BLE_WAIT;
uint8_t Series[12]={0,1,2,3,4,5,6,7,8,9,10,11};
uint8_t BLE_count;
uint8_t BLE_flag;
u8 BLE_at_response_check(u8 *resp, u8 check_resp)
{// 等待处理模组返回的信息
u8 count = 0;
while(*resp != check_resp)
{
delay_ms(10);
count++;
if(count == 100) //等待1s如果仍然没有更新则表示模组没有返回可能卡死了
return 1;
}
return 0;
}
u8 BLE_at_cmd_write(char *pbuf)
{
BLE_resp = BLE_WAIT;
BLE_SendData((u8*)pbuf, strlen(pbuf));
return BLE_at_response_check(&BLE_resp, BLE_OK);
}
u8 BLE_at_rec_process(char *inbuf, u8 data_len)// 处理模组传给MCU的数据根据需求自行填写
{
int i = 0;
u8 resp;
if (strstr(inbuf,"ERROR\r"))
{
resp = BLE_ERROR;
} else if(strstr(inbuf,"OK\r")) {
resp = BLE_OK;
} else {
resp = BLE_OTHER;
}
return resp;
}
void BLE_lp_exit(void)
{
LHL_GPIO_WritePin(BLE_CTS_GPIO, BLE_CTS_PIN, GPIO_PIN_SET);
delay_ms(1);
LHL_GPIO_WritePin(BLE_CTS_GPIO, BLE_CTS_PIN, GPIO_PIN_RESET);
delay_ms(1);
}
void BLE_lp_enter(void)
{
BLE_at_cmd_write("AT+SLEEP=0,1\r\n");
}
void BLE_metering_packet_send(void)
{
char tx_buf[256];
BLE_lp_exit();
BLE_at_cmd_write(tx_buf);
BLE_at_cmd_write("AT+ADS=1,0,1000\r\n");
}
void BLE_identification_packet_send(void)
{
char tx_buf[256];
BLE_lp_exit();
BLE_at_cmd_write(tx_buf);
BLE_at_cmd_write("AT+ADS=1,0,100\r\n");
}
void BLE_beacon_check(void)
{
BLE_count++;
if(BLE_count == 236)
BLE_flag = BLE_FLAG_ID;// 计时到,标记发送 ID 包
else if(BLE_count == 240){
BLE_count = 0;;// 计时到,重置计数器
BLE_flag = BLE_FLAG_METER;// 标记发送计量包
}
else
;
}
void BLE_beacon_done(void)
{
if(BLE_flag == BLE_FLAG_METER){
BLE_metering_packet_send();
BLE_flag = 0;
}
else if(BLE_flag == BLE_FLAG_ID){
BLE_identification_packet_send();
BLE_flag = 0;
}
else
;
}
/**
* @brief 清除接收标志
*/
static inline void ClearRxFlag(void)
{
comState.state.ReceivedData = 0;
}
/******蓝牙部分*************************************************************************************************************/
void BLE_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// CTS 输入模式 (用于流控检测)
GPIO_InitStruct.Pin = BLE_CTS_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Current = GPIO_CURRENT_2mA;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.SchmittTrigger = ENABLE;
GPIO_InitStruct.Alternate = GPIOx_AF_GPIO; // // AF为普通IO
LHL_GPIO_Init(BLE_CTS_GPIO, &GPIO_InitStruct);
// RST
GPIO_InitStruct.Pin = BLE_RST_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Current = GPIO_CURRENT_2mA;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.SchmittTrigger = ENABLE;
GPIO_InitStruct.Alternate = GPIOx_AF_GPIO; // // AF为普通IO
LHL_GPIO_Init(BLE_RST_GPIO, &GPIO_InitStruct);
//3. 默认拉高复位脚
LHL_GPIO_WritePin(BLE_CTS_GPIO, BLE_CTS_PIN, GPIO_PIN_RESET);
LHL_GPIO_WritePin(BLE_RST_GPIO, BLE_RST_PIN, GPIO_PIN_SET);
delay_ms(1000);
char tx_buf[256];
BLE_at_cmd_write("+++"); // 进入 AT 指令模式
// 设置蓝牙名称SIARGO + 序列号 (Hex格式)
sprintf(tx_buf, "AT+NAME=1,53494152%x%x%x%x%x%x%x%x%x%x\r\n", Series[1], Series[2], Series[3],
Series[4], Series[5], Series[6], Series[7], Series[8], Series[9], Series[10] );
BLE_at_cmd_write(tx_buf);
// 发送 AT+EXIT 退出 AT 模式,进入透传模式
// 此后,模块将不再解析 AT 指令,所有串口数据将直接透传给 MCU
BLE_at_cmd_write("AT+EXIT\r\n");
}
void BLE_HardwareReset(void)
{
// 拉低复位
LHL_GPIO_WritePin(BLE_RST_GPIO, BLE_RST_PIN, GPIO_PIN_RESET);
delay_ms(BLE_RESET_HOLD_TIME);
// 拉高释放
LHL_GPIO_WritePin(BLE_RST_GPIO, BLE_RST_PIN, GPIO_PIN_SET);
delay_ms(BLE_RESET_WAIT_TIME);
}
void BLE_SendData(uint8_t *pData, uint16_t len)
{
if (pData == NULL || len == 0) return;
// 停止之前传输
// LHL_DMA_Stop(&DMA_Handle_UartTx);
// // 拷贝并发送
// memcpy(comState.TxdData, pData, len);
MBBuf.TxdLen = len;
MBBuf.TxPointer =pData ;
StartDMAForTxdMainUartData();
}
void BLEModBusReturnDevice(void)
{
MBBuf.RxPointer[0] = 0x01; // 从机地址
MBBuf.RxPointer[1] = 0x2B; // 功能码 (自定义)
MBBuf.RxPointer[2] = 0x0E; // 长度
MBBuf.RxPointer[3] = 0x01;
MBBuf.RxPointer[4] = 0x01;
MBBuf.RxPointer[5] = 0xFF;
MBBuf.RxPointer[6] = 0x05;
MBBuf.RxPointer[7] = 0x03;
MBBuf.RxPointer[8] = 0x00;
MBBuf.RxPointer[9] = 0x0D;
// 硬编码字符串 "SIARGO-MF5700"
MBBuf.RxPointer[10] = 0x53;//S
MBBuf.RxPointer[11] = 0x49; //I
MBBuf.RxPointer[12] = 0x41;//A
MBBuf.RxPointer[13] = 0x52;//R
MBBuf.RxPointer[14] = 0x47;//G
MBBuf.RxPointer[15] = 0x4F;//O
MBBuf.RxPointer[16] = 0x2D;//-
MBBuf.RxPointer[10] = 0x56; // V
MBBuf.RxPointer[11] = 0x4D; // M
MBBuf.RxPointer[12] = 0x31; // 1
MBBuf.RxPointer[13] = 0x30; // 0
MBBuf.RxPointer[14] = 0x30; // 0
MBBuf.RxPointer[15] = 0x30; // 0
MBBuf.RxPointer[23] = 0x02;//XULEIHAO (类型号?)
MBBuf.RxPointer[24] = 0x0C; // 序列号长度
MBBuf.RxPointer[25] = Series[0]; // 填充10位序列号
MBBuf.RxPointer[26] = Series[1];
MBBuf.RxPointer[27] = Series[2];
MBBuf.RxPointer[28] = Series[3];
MBBuf.RxPointer[29] = Series[4];
MBBuf.RxPointer[30] = Series[5];
MBBuf.RxPointer[31] = Series[6];
MBBuf.RxPointer[32] = Series[7];
MBBuf.RxPointer[33] = Series[8];
MBBuf.RxPointer[34] = Series[9];
MBBuf.RxPointer[35] = Series[10];
MBBuf.RxPointer[36] = Series[11];
MBBuf.RxPointer[37] = 0x02;
MBBuf.RxPointer[38] = 0x04;
// MBBuf.RxPointer[39] = MAJ_VERSION; // 固件版本
// MBBuf.RxPointer[40] = SUB_VERSION;
// MBBuf.RxPointer[41] = REV_VERSION;
// MBBuf.RxPointer[42] = BUD_VERSION;
MBBuf.RxPointer[39] = 0x0a; // 固件版本
MBBuf.RxPointer[40] = 0x0b;
MBBuf.RxPointer[41] = 0x0c;
MBBuf.RxPointer[42] = 0x0d;
MBBuf.RxPointer[43] = 0x03;
MBBuf.RxPointer[44] = 0x01;
MBBuf.RxPointer[45] = 0x00;
MBBuf.RxPointer[46] = 0x04;
MBBuf.RxPointer[47] = 0x01;
MBBuf.RxPointer[48] = 0x00;
MBBuf.TxdLen =49;
}
void BLEModBusReturnData(void)
{
u8 tx_Length;
tx_Length = 0;
MBBuf.RxPointer[tx_Length++] = 0x01;
MBBuf.RxPointer[tx_Length++] = 0x42;
MBBuf.RxPointer[tx_Length++] = 0x0c;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x3A;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x3C;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x3E;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x37;
//MBBuf.RxPointer[tx_Length++] = 0x00;
// MBBuf.RxPointer[tx_Length++] = 0x48;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x50;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x51;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x90;
MBBuf.RxPointer[2] = tx_Length - 3;
MBBuf.TxdLen=tx_Length;
}
void BLEModBusReturnparameter(void)
{
u8 tx_Length;
tx_Length = 0;
MBBuf.RxPointer[tx_Length++] = 0x01;
MBBuf.RxPointer[tx_Length++] = 0x43;
MBBuf.RxPointer[tx_Length++] = 0x12;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x83;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x85;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x8B;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x96;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x98;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x9A;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0x9C;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0xF2;
MBBuf.RxPointer[tx_Length++] = 0x00;
MBBuf.RxPointer[tx_Length++] = 0xF0;
MBBuf.RxPointer[2] = tx_Length - 3;
MBBuf.TxdLen=tx_Length;
}
/**
* @brief 启动蓝牙初始化流程
* @note 此函数只做硬件复位和设置开始标志,不会阻塞
*/
void BLE_Application_Init(void)
{
/* ==================== 第 1 步:硬件初始化 ==================== */
// 1.1 调用底层驱动初始化 GPIO (CTS/RTS/RST)
BLE_init();
//硬件复位
// LHL_GPIO_WritePin(BLE_RST_GPIO, BLE_RST_PIN, GPIO_PIN_RESET);
}