蓝牙发送数据测试

This commit is contained in:
小马_666 2024-12-11 20:03:50 +08:00
parent 2837f1fb23
commit 250073b2c0
15 changed files with 1177 additions and 519 deletions

View File

@ -9,5 +9,8 @@ encoding//StdPeriphDriver/CH58x_gpio.c=GBK
encoding//StdPeriphDriver/CH58x_sys.c=GBK
encoding//StdPeriphDriver/CH58x_uart3.c=GBK
encoding//StdPeriphDriver/inc/CH585SFR.h=GBK
encoding//StdPeriphDriver/inc/CH58x_common.h=GBK
encoding//StdPeriphDriver/inc/CH58x_gpio.h=GBK
encoding//bsp/src/bsp_flash.c=GBK
encoding//StdPeriphDriver/inc/CH58x_sys.h=GBK
encoding//StdPeriphDriver/inc/ISP585.h=GBK
encoding//bsp/inc/bsp_uart.h=UTF-8

View File

@ -18,6 +18,8 @@
}
],
"files.associations": {
"config.h": "c"
"*.dbclient-js": "javascript",
"config.h": "c",
"ch58xble_lib.h": "c"
}
}

View File

@ -23,6 +23,8 @@
#ifndef MULTICENTRAL_H
#define MULTICENTRAL_H
#include "CONFIG.h"
#ifdef __cplusplus
extern "C" {
#endif
@ -55,6 +57,11 @@ extern "C" {
// 定义启动写入CCCD客户端特性配置描述符事件的常量
#define START_WRITE_CCCD_EVT 0x0100
// 定义启动读或写操作事件的常量
#define CH2_READ_EVT 0x0200
#define CH3_WRITE_EVT 0x0400
#define CH4_NOTI_EVT 0x0800
#define CONNECT0_ITEM 0
#define CONNECT1_ITEM 1
// #define CONNECT2_ITEM 2
@ -65,6 +72,8 @@ extern "C" {
// #define CONNECT7_ITEM 7
/*********************************************************************
* MACROS
*/
@ -79,6 +88,9 @@ typedef struct
uint16_t svcStartHdl; // Discovered service start handle
uint16_t svcEndHdl; // Discovered service end handle
uint16_t charHdl; // Discovered characteristic handle
uint16_t charHd2; // Discovered characteristic handle
uint16_t charHd3; // Discovered characteristic handle
uint16_t charHd4; // Discovered characteristic handle
uint16_t cccHdl; // client characteristic configuration discovery handle
} centralConnItem_t;
@ -100,7 +112,7 @@ extern void Central_Init(void);
* Task Event Processor for the BLE Application
*/
extern uint16_t Central_ProcessEvent(uint8_t task_id, uint16_t events);
extern centralConnItem_t centralConnList[CENTRAL_MAX_CONNECTION];
/*********************************************************************
*********************************************************************/

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-03 11:13:13
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-07 16:17:02
* @LastEditTime: 2024-12-09 13:34:51
* @FilePath: \ble_-tyq_-bjq_-ch584-m\APP\multiCentral_main.c
* @Description:
*
@ -26,6 +26,8 @@
#include "multiCentral.h"
#include "bsp_uart.h"
#include "log.h"
#include "bsp_flash.h"
#undef LOG_ENABLE
@ -97,6 +99,7 @@ int main(void)
#endif
BSP_UART1_Init();//BT UART
logDebug("test log debug\n");
BSP_FLASH_Init();
Main_Circulation();
}

View File

@ -80,7 +80,7 @@
#define BLE_MEMHEAP_SIZE (1024*12)
#endif
#ifndef BLE_BUFF_MAX_LEN
#define BLE_BUFF_MAX_LEN 27
#define BLE_BUFF_MAX_LEN 251
#endif
#ifndef BLE_BUFF_NUM
#define BLE_BUFF_NUM 5
@ -89,7 +89,7 @@
#define BLE_TX_NUM_EVENT 1
#endif
#ifndef BLE_TX_POWER
#define BLE_TX_POWER LL_TX_POWEER_0_DBM
#define BLE_TX_POWER LL_TX_POWEER_4_DBM
#endif
#ifndef PERIPHERAL_MAX_CONNECTION
#define PERIPHERAL_MAX_CONNECTION 1

View File

@ -123,7 +123,7 @@ typedef struct tag_ble_clock_config
// RF-8K config
uint32_t Clock1Frequency; // RF-8K timing clock frequency(Hz)
pfnGetSysClock getClock1Value; // RF 8k 通信管理时间 (精度要求更高)
pfnGetSysClock getClock1Value; // RF 8k ͨ<EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ߣ<EFBFBD>
pfnSetSysClockIRQ SetClock1PendingIRQ;
pfnSetSysClockTign SetTign;
}bleClockConfig_t;
@ -195,7 +195,7 @@ extern const uint8_t VER_LIB[]; // LIB version
#define ABS(n) (((n) < 0) ? -(n) : (n))
#endif
/* TxPower define(Accuracy:±2dBm) */
/* TxPower define(Accuracy:<EFBFBD><EFBFBD>2dBm) */
#define LL_TX_POWEER_MINUS_20_DBM 0x01
#define LL_TX_POWEER_MINUS_15_DBM 0x03
#define LL_TX_POWEER_MINUS_10_DBM 0x05
@ -812,7 +812,7 @@ extern const uint8_t VER_LIB[]; // LIB version
#define TGAP_AUTH_TASK_ID 24 //!< Task ID override for Task Authentication control (for stack internal use only)
// v5.x
#define TGAP_ADV_TX_POWER 25 //!< Indicates the maximum power level Range: -127 ≤ N ≤ +126 Units: dBm.Default 127(Host has no preference).
#define TGAP_ADV_TX_POWER 25 //!< Indicates the maximum power level Range: -127 <EFBFBD><EFBFBD> N <20><> +126 Units: dBm.Default 127(Host has no preference).
#define TGAP_ADV_PRIMARY_PHY 26 //!< resv.
#define TGAP_ADV_SECONDARY_PHY 27 //!< LE 1M/LE 2M. Default GAP_PHY_VAL_LE_1M.
#define TGAP_ADV_SECONDARY_MAX_SKIP 28 //!< Maximum advertising events the Controller can skip before sending the AUX_ADV_IND packets on the secondary advertising channel. Default 0.
@ -1153,7 +1153,7 @@ extern const uint8_t VER_LIB[]; // LIB version
#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason
#define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authentication procedure is disallowed because too little time has elapsed since the last pairing request or security request.
#define SMP_PAIRING_FAILED_INVALID_PARAMERERS 0x0A //!< The Invalid Parameters error code indicates that the command length is invalid or that a parameter is outside of the specified range.
#define SMP_PAIRING_FAILED_DHKEY_CHECK_FAILED 0x0B //!< Indicates to the remote device that the DHKey Check value received doesnt match the one calculated by the local device.
#define SMP_PAIRING_FAILED_DHKEY_CHECK_FAILED 0x0B //!< Indicates to the remote device that the DHKey Check value received doesn<EFBFBD><EFBFBD>t match the one calculated by the local device.
#define SMP_PAIRING_FAILED_NUMERIC_COMPARISON 0x0C //!< Indicates that the confirm values in the numeric comparison protocol do not match.
#define SMP_PAIRING_FAILED_KEY_REJECTED 0x0F //!< Indicates that the device chose not to accept a distributed key.
@ -2067,13 +2067,13 @@ typedef struct
uint8_t enable; //!< bit0 Enable periodic advertising
//!< bit1 Include the ADI field in AUX_SYNC_IND PDUs
uint8_t advHandle; //!< Used to identify a periodic advertising train
uint16_t advIntervalMin; //!< Minimum advertising interval for periodic advertising.Time = N × 1.25ms.Time Range: 7.5ms to 81.91875s
uint16_t advIntervalMax; //!< Maximum advertising interval for periodic advertising.Time = N × 1.25ms.Time Range: 7.5ms to 81.91875s
uint16_t advIntervalMin; //!< Minimum advertising interval for periodic advertising.Time = N <EFBFBD><EFBFBD> 1.25ms.Time Range: 7.5ms to 81.91875s
uint16_t advIntervalMax; //!< Maximum advertising interval for periodic advertising.Time = N <EFBFBD><EFBFBD> 1.25ms.Time Range: 7.5ms to 81.91875s
uint16_t advProperties; //!< bit6 Include TxPower in the advertising PDU
uint8_t numSubevents; //!< Number of subevents.
uint8_t subInterval; //!< Interval between subevents.Time = N × 1.25ms.Time Range: 7.5 ms to 318.75 ms
uint8_t rspSlotDelay; //!< Time between the advertising packet in a subevent and the first response slot.Time = N × 1.25 ms.Time Range: 1.25ms to 317.5ms
uint8_t rspSlotSpacing; //!< Time between response slots.Time = N × 0.125ms.Time Range: 0.25ms to 31.875ms
uint8_t subInterval; //!< Interval between subevents.Time = N <EFBFBD><EFBFBD> 1.25ms.Time Range: 7.5 ms to 318.75 ms
uint8_t rspSlotDelay; //!< Time between the advertising packet in a subevent and the first response slot.Time = N <EFBFBD><EFBFBD> 1.25 ms.Time Range: 1.25ms to 317.5ms
uint8_t rspSlotSpacing; //!< Time between response slots.Time = N <EFBFBD><EFBFBD> 0.125ms.Time Range: 0.25ms to 31.875ms
uint8_t numRspSlots; //!< Number of subevent response slots.Range: 0x01 to 0xFF
}gapPawrSetParam_t;
@ -3068,7 +3068,7 @@ extern void LLE_IRQLibHandler( void );
* @return access address
* the Access Address meets the following requirements:
* It shall have no more than six consecutive zeros or ones.
* It shall not be t he advertising channel packets Access Address.
* It shall not be t he advertising channel packets<EFBFBD><EFBFBD> Access Address.
* It shall not be a sequence that differ s from the advertising channel packets' Access Address by only one bit.
* It shall not have all four octets equal.
* It shall have no more than 24 transitions.

View File

@ -456,6 +456,17 @@ __HIGH_CODE
__attribute__((weak))
void HardFault_Handler(void)
{
uint32_t v_mepc,v_mcause,v_mtval;
v_mepc=__get_MEPC();
v_mcause=__get_MCAUSE();
v_mtval=__get_MTVAL();
printf("hardfault\n");
printf("mepc:%08x\n",v_mepc);
printf("mcause:%08x\n",v_mcause);
printf("mtval:%08x\n",v_mtval);
FLASH_ROM_SW_RESET();
sys_safe_access_enable();
R16_INT32K_TUNE = 0xFFFF;
@ -463,6 +474,9 @@ void HardFault_Handler(void)
sys_safe_access_enable();
R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
sys_safe_access_disable();
while(1);
}

84
bsp/inc/bsp_master.h Normal file
View File

@ -0,0 +1,84 @@
//#ifndef __BSP_MASTER_H__
//#define __BSP_MASTER_H__
//
//
//#include "CH58x_common.h"
//#include "CH58xBLE_LIB.h"
//
//
//
//typedef enum
//{
// BLE_STATE_IDLE,
// BLE_STATE_ADV,
// BLE_STATE_CONNECT,
// BLE_STATE_DISCONNECT,
//} BleState;
//
//typedef enum
//{
// kValveClose,
// kValveOpen,
//}BtValveState;
//
//typedef struct
//{
// uint8_t buf[];
//}BleValveData;
//
//struct __attribute__((packed)) valve_data
//{
// uint8_t header;
// uint8_t valve_type; // 阀门类型
// uint8_t valve_bat; // 1B 电池电压 30=3V,18=1.8V
// uint8_t valve_status; // 1B 阀门工作状态 超欠压、过流
// uint8_t valve_connct_status; // 1B 阀门连接状态 电磁阀BLE控制盒 0=未连接 1=已连接
// uint8_t valve_switch_status; // 1B 阀门开关状态 0=未知 1=关闭 2=关闭过,未按按键恢复 3=关闭过,按下了恢复键 4=打开
// int8_t valve_temp; // 1B 阀门温度 有符号整数 25 ℃
// uint32_t valve_in_pressure; // 4B 阀门入口压力 Pa
// uint32_t valve_out_pressure; // 4B 阀门出口压力 Pa
// uint32_t valve_atm_pressure; // 4B 阀门大气压力 Pa
// uint8_t check;
// uint8_t tail;
//};
//
//
//
//void BSP_Master_Send(centralConnItem_t *centralConnList, uint8_t id, uint8_t *Data, uint8_t Len);
//int BSP_Master_Receive_Data(uint8_t *data, uint16_t len);
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//#endif // ! __BSP_MASTER_H__

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-06 16:52:29
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-07 15:10:15
* @LastEditTime: 2024-12-09 11:15:13
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\inc\bsp_uart.h
* @Description:
* @
@ -13,44 +13,30 @@
#include "CH58x_common.h"
#define MAX_VALVE_NUM 8
#define BT_START_EVT (0X01 << 0)
#define BT_REC_EVT (0X01 << 1)
#define BT_INFO_UPDATA_EVT (0X01 << 2)
#define BT_SEND_EVT (0X01 << 3)//
#define UART3_RX_PIN GPIO_Pin_20 //PB20 日志打印
#define UART3_RX_PIN GPIO_Pin_20 //PB20
#define UART3_TX_PIN GPIO_Pin_21 // PB21
#define BT_UART_TX_PIN GPIO_Pin_9 //PA9
#define BT_UART_RX_PIN GPIO_Pin_8 //PA8
typedef struct valve_data valve_data_t;
/*
线
线 MAC
线
线
线
线
线
线
*/
struct __attribute__((packed)) valve_data
typedef struct __attribute__((packed))
{
uint8_t valve_id;
uint8_t valve_mac[6];
uint8_t valve_connct_status;
uint8_t valve_switch_status;
uint8_t valve_temp;
uint32_t valve_in_pressure;
uint32_t valve_out_pressure;
uint32_t valve_atm_pressure;
};
uint8_t cmd;
uint8_t buf[];
} BtData_t;
typedef struct valve_data_list
typedef struct __attribute__((packed))
{
uint8_t valve_num;
valve_data_t valve_data[MAX_VALVE_NUM];
} valve_data_list_t ;
uint8_t len;
uint8_t buf[256];
} BTFrameData;
void BSP_UART1_Init(void);
@ -61,7 +47,8 @@ unsigned int BSP_Uart1_Send_Data(const void *buf, unsigned int len);
void BSP_UART3_Init(void);
unsigned int BSP_Uart3_Receive_Data(void *buf, unsigned int len);
unsigned int BSP_Uart3_Send_Data(const void *buf, unsigned int len);
void BSP_Shell_Loop(void);
uint8_t XOR_CheckSum(const uint8_t *data, size_t len);
extern uint8_t BtRxTaskId;
#endif // !__BSP_UART_H__

85
bsp/inc/bsp_valve.h Normal file
View File

@ -0,0 +1,85 @@
#ifndef __BSP_VALVE_H__
#define __BSP_VALVE_H__
#include "CH58x_common.h"
#define MAX_VALVE_NUM 8
typedef enum {
kValveCmdCtr = 0X01,
kValveCmdReg,
kValveCmdRem,
kValveCmdRep,
kValveCmdMax
} ValveCmdType;
typedef enum
{
WirelessValveClose,
WirelessValveOpen,
} WireLessState;
typedef struct valve_data valve_data_t;
/*
线
线 MAC
线
线
线
线
线
线
*/
struct __attribute__((packed)) valve_data
{
uint8_t valve_id;
uint8_t valve_mac[6];
uint8_t valve_connct_status;
uint8_t valve_switch_status;
uint8_t valve_temp;
uint32_t valve_in_pressure;
uint32_t valve_out_pressure;
uint32_t valve_atm_pressure;
};
typedef struct valve_data_list
{
uint8_t valve_num;
valve_data_t valve_data[MAX_VALVE_NUM];
} valve_data_list_t ;
extern valve_data_list_t valve_list;
int BSP_Bt_Valve_Ctr(uint8_t *data, uint8_t len);
int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len);
int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len);
int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len);
void BSP_Bt_Valve_Updata(void);
#endif // ! __BSP_VALVE_H__

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-06 14:49:21
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-07 12:58:09
* @LastEditTime: 2024-12-10 15:28:37
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_flash.c
* @Description: MAC地址等关键信息进行保存和读取操作
*
@ -11,6 +11,8 @@
#include "bsp_flash.h"
#include "CONFIG.h"
#include "string.h"
#include "bsp_valve.h"
void Flash_ErasePage_ReadConfigInfo(uint8_t *page_buf)
{
@ -29,10 +31,10 @@ int Flash_Write_ConfigInfo(uint8_t *page_buf)
int Flash_Set_Mac_Addr(uint8_t *mac_addr, uint8_t number)
{
uint8_t page_buf[DATA_FLASH_PAGE_SIZE] = {0};
uint8_t in_page_offset = ((FLASH_MAC_1_ADDR + number * FLASH_MAC_INFO_LEN) - FLASH_MAC_INFO_START_ADDR);
if (mac_addr == NULL)
uint8_t in_page_offset = ((FLASH_MAC_1_ADDR + number * FLASH_MAC_INFO_LEN) - FLASH_MAC_INFO_START_ADDR);
if ((mac_addr == NULL)||( number > MAX_VALVE_NUM))
{
return -1;
return -1;
}
Flash_ErasePage_ReadConfigInfo(page_buf);
for (int i = 0; i < FLASH_MAC_INFO_LEN; i++)
@ -46,9 +48,9 @@ int Flash_Set_Mac_Addr(uint8_t *mac_addr, uint8_t number)
int Flash_Get_Mac_Addr(uint8_t *mac_addr, uint8_t number)
{
__attribute__((aligned(4)))
uint8_t data[FLASH_MAC_INFO_LEN + 2]; //读写buf需要4字节对齐
char mac[16] = {20};
tmos_memcpy(data, (uint8_t *)(FLASH_MAC_1_ADDR + number * FLASH_MAC_INFO_LEN), FLASH_MAC_INFO_LEN);
uint8_t data[FLASH_MAC_INFO_LEN + 2]; // 读写buf需要4字节对齐
// char mac[16] = {0};
EEPROM_READ((FLASH_MAC_INFO_START_ADDR + number * FLASH_MAC_INFO_LEN), data, FLASH_MAC_INFO_LEN);
if (data == NULL)
{
// PRINTF("Flash_Get_Mac_Addr failed");
@ -66,7 +68,7 @@ int Flash_Get_Mac_Addr(uint8_t *mac_addr, uint8_t number)
int Flash_Set_Valve_Num(uint8_t valve_num)
{
uint8_t page_buf[DATA_FLASH_PAGE_SIZE] = {0};
uint8_t in_page_offset = (FLASH_INFO_ADDR - FLASH_MAC_INFO_START_ADDR);
uint8_t in_page_offset = (FLASH_INFO_ADDR - FLASH_MAC_INFO_START_ADDR);
Flash_ErasePage_ReadConfigInfo(page_buf);
page_buf[in_page_offset] = valve_num;
return Flash_Write_ConfigInfo(page_buf);
@ -83,13 +85,12 @@ uint8_t Flash_Get_Valve_Num(void)
void BSP_FLASH_Init(void)
{
uint32_t flash_write_flag = 0;
EEPROM_READ(FLASH_INFO_WRITE_FLAG_ADDR, &flash_write_flag, FLASH_INFO_WRITE_FLAG_LEN);
if (flash_write_flag != FLASH_INFO_WRITE_FLAG_VAL)//用以防止刷掉写入的数据
if (flash_write_flag != FLASH_INFO_WRITE_FLAG_VAL) // 用以防止刷掉写入的数据
{
flash_write_flag = FLASH_INFO_WRITE_FLAG_VAL;
//擦除数据
EEPROM_ERASE(FLASH_INFO_ADDR, DATA_FLASH_PAGE_SIZE);//擦除待写区
EEPROM_WRITE(FLASH_INFO_ADDR, &flash_write_flag, FLASH_INFO_WRITE_FLAG_LEN);
// 擦除数据
EEPROM_ERASE(FLASH_INFO_ADDR, DATA_FLASH_PAGE_SIZE); // 擦除待写区
EEPROM_WRITE(FLASH_INFO_WRITE_FLAG_ADDR, &flash_write_flag, FLASH_INFO_WRITE_FLAG_LEN);
}
}

119
bsp/src/bsp_master.c Normal file
View File

@ -0,0 +1,119 @@
// #include "bsp_master.h"
// #include "bsp_uart.h"
// #include "log.h"
// #include "multiCentral.h"
// #include "bsp_valve.h"
// #undef LOG_ENABLE
// #define LOG_ENABLE 1
// void BSP_Bt_Init(void)
// {
// }
// void BSP_Master_Send(centralConnItem_t *centralConnList, uint8_t id, uint8_t *Data, uint8_t Len)
// {
// attWriteReq_t req;
// uint8_t res;
// if (centralConnList[id].state == BLE_STATE_CONNECTED) // 检查连接状态是否为连接状态
// {
// if (centralConnList[id].procedureInProgress == TRUE)
// {
// logWarning("\n Write buy");
// }
// else
// {
// req.cmd = FALSE;
// req.sig = FALSE;
// req.handle = centralConnList[id].connHandle;
// req.len = Len;
// req.pValue = GATT_bm_alloc(centralConnList[id].connHandle, ATT_WRITE_REQ, req.len, NULL, 0);
// if (req.pValue != NULL)
// {
// tmos_memcpy(req.pValue, Data, Len);
// res = GATT_WriteCharValue(centralConnList[id].connHandle, &req, centralTaskId);
// if (res == SUCCESS)
// {
// centralConnList[id].procedureInProgress = TRUE; // 翻转读写状态
// logDebug("\n Master Write ok");
// }
// else
// {
// logDebug("\n Master Write faild= %x", res);
// GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
// }
// }
// else
// {
// logDebug("\n alloc Faild");
// }
// }
// }
// else
// {
// }
// }
// int BSP_Master_Receive_Data(uint8_t *data, uint16_t len)
// {
// int ret = 0;
// uint16_t index = 0;
// uint8_t data_buf[64] = {0};
// // 解析接收到的数据帧先寻找AA开头然后再找AA下一个字节其代表了数据长度然后找到代表长度的值的长度的下一位其为校验码校验码后为结束码0x55
// // 如果数据正确,则提取数据,不正确,则不处理
// if (len < 4)
// { // 至少需要 4 个字节:起始码、长度、校验码、结束码
// logError("BT 数据帧长度不足");
// logHexDumpAll(data, len);
// return 1;
// }
// while (index < len && data[index] != 0xAA) // 寻找起始码 0xAA
// {
// index++;
// }
// if (index >= len - 3) // 不够空间容纳长度、校验码和结束码
// {
// logError("BT 数据帧起始码错误");
// logHexDumpAll(data, len);
// return 2;
// }
// uint16_t datalength = data[index + 1]; // 读取数据长度
// if (index + 2 + datalength + 1 >= len) // 检查数据长度是否合理 数据长度 + 校验码 + 结束码
// {
// logError("BT 数据帧长度错误");
// logHexDumpAll(data, len);
// return 3; //
// }
// uint8_t rx_sum = data[index + 2 + datalength]; // 读取校验码
// uint8_t calculated_sum = XOR_CheckSum(&data[0], datalength + 2); // 计算校验码
// if (rx_sum != calculated_sum)
// {
// logError("BT 数据帧校验码错误 rx_sum = %02X, calculated_sum = %02X", rx_sum, calculated_sum);
// logHexDumpAll(data, len);
// return 4;
// }
// if (data[index + 2 + datalength + 1] != 0x55) // 检查结束码
// {
// logError("BT 数据帧结束码错误");
// logHexDumpAll(data, len);
// return 5;
// }
// // 到这一步说明数据没问题,将接收到的数据通过中心任务发送出去
// uint8_t *p_data;
// p_data = tmos_msg_allocate(length);
// if (p_data)
// {
// tmos_memcpy(p_data, data, length);
// tmos_msg_send(task_id, p_data);
// }
// tmos_msg_send(task_id, data);
// return ret;
// }

View File

@ -1,22 +1,32 @@
/*
* @Author: mbw
* @Date: 2024-12-06 16:52:30
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-11 16:35:52
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_uart.c
* @Description:
*
* Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
#include "bsp_uart.h"
#include "lwrb.h"
#include "CH58x_uart.h"
#include "shell_port.h"
#include "CH58xBLE_LIB.h"
#include "bsp_flash.h"
#include "bsp_valve.h"
#include "shell.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
#include "log.h"
#define UART1_RX_BUFFER_LENGTH 512U
#define UART1_TX_BUFFER_LENGTH 512U
#define UART1_RX_BUFFER_LENGTH 512U
#define UART1_TX_BUFFER_LENGTH 512U
#define UART3_RX_BUFFER_LENGTH 1024U
#define UART3_TX_BUFFER_LENGTH 1024U
#define UART3_RX_BUFFER_LENGTH 1024U
#define UART3_TX_BUFFER_LENGTH 1024U
lwrb_t uart1_rx_t;
lwrb_t uart1_tx_t;
@ -28,20 +38,34 @@ lwrb_t uart3_tx_t;
uint8_t uart3_tx_buf[UART3_TX_BUFFER_LENGTH] = {0};
uint8_t uart3_rx_buf[UART3_RX_BUFFER_LENGTH] = {0};
uint8_t BtRxTaskId;
static uint8_t BtRxTaskId;
BTFrameData bt_frame = {0};
#define BT_START_EVT (0X01 << 0)
#define BT_REC_EVT (0X01 << 1)
/**
* @description: 256255
* @param {uint8_t} *data
* @param {uint16_t} len
* @return {*}
*/
uint8_t XOR_CheckSum(const uint8_t *data, size_t len)
{
uint8_t sum = 0;
for (size_t i = 0; i < len; i++)
{
sum += data[i];
}
return sum;
}
//串口接收
// 串口接收
unsigned int BSP_Uart1_Receive_Data(void *buf, unsigned int len)
{
return lwrb_read(&uart1_rx_t, buf, len);
}
//串口发送数据
// 串口发送数据
unsigned int BSP_Uart1_Send_Data(const void *buf, unsigned int len)
{
unsigned int ret;
@ -51,13 +75,18 @@ unsigned int BSP_Uart1_Send_Data(const void *buf, unsigned int len)
return ret;
}
//串口接收
unsigned int BSP_Uart1_Send_String(const void *buf)
{
return BSP_Uart1_Send_Data(buf, strlen((const char *)buf));
}
// 串口接收
unsigned int BSP_Uart3_Receive_Data(void *buf, unsigned int len)
{
return lwrb_write(&uart3_rx_t, buf, len);
}
//串口发送数据
// 串口发送数据
unsigned int BSP_Uart3_Send_Data(const void *buf, unsigned int len)
{
unsigned int ret;
@ -71,7 +100,6 @@ void UART1_FifoInit(void)
{
lwrb_init(&uart1_tx_t, uart1_tx_buf, sizeof(uart1_tx_buf));
lwrb_init(&uart1_rx_t, uart1_rx_buf, sizeof(uart1_rx_buf));
}
void UART3_FifoInit(void)
@ -80,32 +108,178 @@ void UART3_FifoInit(void)
lwrb_init(&uart3_rx_t, uart3_rx_buf, sizeof(uart3_rx_buf));
}
__HIGH_CODE
__attribute__((noinline))
uint16_t BT_Rx_ProcessEvent(uint8_t task_id, uint16_t events)
/*bt接收数据处理*/
int BSP_Bt_Process(uint8_t *data, uint16_t len)
{
if(events & BT_START_EVT)
int ret = 0;
uint16_t index = 0;
uint8_t data_buf[64] = {0};
// 解析接收到的数据帧先寻找AA开头然后再找AA下一个字节其代表了数据长度然后找到代表长度的值的长度的下一位其为校验码校验码后为结束码0x55
// 如果数据正确,则提取数据,不正确,则不处理
if (len < 4)
{ // 至少需要 4 个字节:起始码、长度、校验码、结束码
logError("BT 数据帧长度不足");
logHexDumpAll(data, len);
return 1;
}
while (index < len && data[index] != 0xAA) // 寻找起始码 0xAA
{
index++;
}
if (index >= len - 3) // 不够空间容纳长度、校验码和结束码
{
logError("BT 数据帧起始码错误");
logHexDumpAll(data, len);
return 2;
}
uint16_t datalength = data[index + 1]; // 读取数据长度
if (index + 2 + datalength + 1 >= len) // 检查数据长度是否合理 数据长度 + 校验码 + 结束码
{
logError("BT 数据帧长度错误");
logHexDumpAll(data, len);
return 3; //
}
uint8_t rx_sum = data[index + 2 + datalength]; // 读取校验码
uint8_t calculated_sum = XOR_CheckSum(&data[0], datalength + 2); // 计算校验码
if (rx_sum != calculated_sum)
{
logError("BT 数据帧校验码错误 rx_sum = %02X, calculated_sum = %02X", rx_sum, calculated_sum);
logHexDumpAll(data, len);
return 4;
}
if (data[index + 2 + datalength + 1] != 0x55) // 检查结束码
{
logError("BT 数据帧结束码错误");
logHexDumpAll(data, len);
return 5;
}
// 当程序走到这里时,就说明接收到了正确的数据帧,开始解析命令
tmos_memcpy(data_buf, &data[index + 3], datalength);
switch (data[index + 2])
{
case kValveCmdCtr:
ret = BSP_Bt_Valve_Ctr(&data_buf[0], datalength);
logDebug("recv cmd: 0x01, 执行的动作是关闭阀门");
break;
case kValveCmdReg:
ret = BSP_Bt_Register_Valve(&data_buf[0], datalength);
logDebug("recv cmd: 0x02, 执行的动作是注册阀门");
break;
case kValveCmdRem:
ret = BSP_Bt_Remove_Valve(&data_buf[0], datalength);
logDebug("recv cmd: 0x03, 执行的动作是移除阀门");
break;
case kValveCmdRep:
ret = BSP_Bt_Replace_Valve(&data_buf[0], datalength);
logDebug("recv cmd: 0x04, 执行的动作是更换阀门");
break;
default:
logError("unknow cmd: %02X", data[index + 2]);
break;
}
return ret;
}
/*发送数据帧处理*/
uint8_t BT_GenerateRawFrame(BTFrameData *pRawData, const uint8_t *p_src, uint8_t src_len)
{
pRawData->len = src_len + 4;
tmos_memset(pRawData->buf, 0, sizeof(pRawData->buf));
pRawData->buf[0] = 0XAA;
pRawData->buf[1] = src_len;
tmos_memcpy(&pRawData->buf[2], p_src, src_len);
// 从帧起始符开始到校验码之前所有字节的和的模256
// 即各字节不计超过255的溢出值的二进制算术和。
pRawData->buf[pRawData->len - 2] = XOR_CheckSum(&pRawData->buf[0], pRawData->len - 2);
pRawData->buf[pRawData->len - 1] = 0X55;
logHexDumpAll(&pRawData->buf[0], pRawData->len);
return 0;
}
/**
* @brief
* @param {uint8_t} task_id
* @param {uint16_t} events
* @return {*}
*/
uint16_t BSP_Send_Process(uint8_t *pdata, uint16_t len)
{
int8_t ret = 0;
__attribute__((aligned(4))) uint8_t buf[128] = {0};
ret = BSP_Bt_Process(buf, len);
if (ret != 0)
{
logError("BT 操作失败[%d]", ret);
}
}
uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events)
{
int8_t ret = 0;
if (events & SYS_EVENT_MSG)
{
uint8_t *pMsg;
if ((pMsg = tmos_msg_receive(BtRxTaskId)) != NULL)
{
PRINT("revice data:");
for (uint8_t i = 0; i < 8; i++)
{
PRINT("%02x ", pMsg[i]);
}
PRINT("\r\n");
// Release the TMOS message
tmos_msg_deallocate(pMsg);
}
}
else if (events & BT_START_EVT)
{
lwrb_reset(&uart1_rx_t);
tmos_start_task(task_id, BT_REC_EVT, 20);
tmos_start_task(task_id, BT_INFO_UPDATA_EVT, 1000);
return (events ^ BT_START_EVT);
}
else if(events & BT_REC_EVT)
else if (events & BT_REC_EVT)
{
int len = lwrb_get_full(&uart1_rx_t);
if (len > 0)
{
uint8_t buf[128] = {0};
char *ptr = (char *)malloc(len + 1);
lwrb_read(&uart1_rx_t, ptr, len);
logHexDumpAll(ptr, len);
free(ptr);
__attribute__((aligned(4))) uint8_t buf[256] = {0};
lwrb_read(&uart1_rx_t, buf, len);
ret = BSP_Bt_Process(buf, len);
if (ret != 0)
{
logError("BT 操作失败[%d]", ret);
}
}
tmos_start_task(task_id, BT_REC_EVT, 20);
return (events ^ BT_REC_EVT);
}
else if (events & BT_SEND_EVT)
{
BSP_Uart1_Send_String("\r\n");//报警器端接收是以回车换行结尾,所以这里也加上换行
tmos_start_task(task_id, BT_SEND_EVT, 1000);
return (events ^ BT_SEND_EVT);
}
else if (events & BT_INFO_UPDATA_EVT) // 更新蓝牙连接信息
{
BSP_Bt_Valve_Updata();
return (events ^ BT_INFO_UPDATA_EVT);
}
return 0;
}
/*BT与报警器主机接口*/
void BSP_UART1_Init(void)
{
@ -121,12 +295,10 @@ void BSP_UART1_Init(void)
UART1_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY | RB_IER_THR_EMPTY);
PFIC_EnableIRQ(UART1_IRQn);
UART1_FifoInit();
BtRxTaskId = TMOS_ProcessEventRegister(BT_Rx_ProcessEvent);
BtRxTaskId = TMOS_ProcessEventRegister(BT_ProcessEvent);
tmos_set_event(BtRxTaskId, BT_START_EVT);
}
/*调试接口*/
void BSP_UART3_Init(void)
{
@ -144,7 +316,6 @@ void BSP_UART3_Init(void)
UART3_FifoInit();
userShellInit();
}
/*********************************************************************
@ -159,16 +330,16 @@ __HIGH_CODE
void UART1_IRQHandler(void)
{
uint8_t data;
switch(UART1_GetITFlag())
switch (UART1_GetITFlag())
{
case UART_II_LINE_STAT: // 线路状态错误
{
// UART1_GetLinSTA();
// UART1_GetLinSTA();
break;
}
case UART_II_RECV_RDY:
case UART_II_RECV_TOUT: // 接收数据
while(R8_UART1_RFC)
while (R8_UART1_RFC)
{
data = R8_UART1_RBR;
lwrb_write(&uart1_rx_t, &data, 1);
@ -176,7 +347,7 @@ void UART1_IRQHandler(void)
break;
case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送
if(lwrb_read(&uart1_tx_t, &data, 1))
if (lwrb_read(&uart1_tx_t, &data, 1))
{
UART1_SendByte(data);
}
@ -207,22 +378,22 @@ __HIGH_CODE
void UART3_IRQHandler(void)
{
uint8_t data;
switch(UART3_GetITFlag())
switch (UART3_GetITFlag())
{
case UART_II_LINE_STAT: // 线路状态错误
{
// UART1_GetLinSTA();
// UART1_GetLinSTA();
break;
}
case UART_II_RECV_RDY:
case UART_II_RECV_TOUT: //接收超时
while(R8_UART3_RFC)
case UART_II_RECV_TOUT: // 接收超时
while (R8_UART3_RFC)
{
shellHandler(&shell, R8_UART3_RBR);
}
break;
case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送
if(lwrb_get_full(&uart3_tx_t))
if (lwrb_get_full(&uart3_tx_t))
{
lwrb_read(&uart3_tx_t, &data, 1);
UART3_SendByte(data);
@ -241,3 +412,10 @@ void UART3_IRQHandler(void)
break;
}
}
int reboot(void)
{
PFIC_SystemReset();
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
reboot, reboot, "reboot");

243
bsp/src/bsp_valve.c Normal file
View File

@ -0,0 +1,243 @@
/*
* @Author: mbw
* @Date: 2024-12-09 11:40:10
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-11 15:43:47
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_valve.c
* @Description:
*
* Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
#include "bsp_valve.h"
#include "bsp_flash.h"
#include "CH58xBLE_LIB.h"
#include "bsp_uart.h"
#include "bsp_master.h"
#include "multiCentral.h"
/*
+ + + id + mac + ()() + +
+ + + id + mac + + +
*/
#undef LOG_ENABLE
#define LOG_ENABLE 1
#include "log.h"
valve_data_list_t valve_list = {0};
int BSP_Valve_Close(uint8_t valve_id)
{
uint8_t num = Flash_Get_Valve_Num();
if ((valve_id > 8) && (num == 0))
{
logError("BSP_Valve_Close: valve id error");
return -1;
}
logDebug("BSP_Valve_Close: valve id: %d", valve_id);
// TODO:检查是否连接, 如果连接,则发送数据,将关闭阀门指令发送过去,然后等待数据接收响应如果接收到响应是关闭状态0x01则返回成功否则失败
// BSP_Master_Send(centralConnList, CONNECT0_ITEM, 0x01, 1);
return 0;
}
/*用于控制阀门的状态
* id: 1-8
* mac_addr: 6
* status: 0- 1-
*/
int BSP_Bt_Valve_Ctr(uint8_t *data, uint8_t len)
{
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
if ((data[0] >= 1) && (data[0] <= 8))
{
Flash_Get_Mac_Addr(mac_addr, data[0] - 1);
}
else
{
logError("BSP_Bt_Valve_Ctr: id error");
return -1;
}
if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) != TRUE)
{
logError("mac addr error read mac addr : %02X %02X %02X %02X %02X %02X != bt_rx mac addr: %02X %02X %02X %02X %02X %02X",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5], data[1], data[2], data[3], data[4], data[5], data[6]);
return -2;
}
/*如果到这里了说明ID和MAC地址对应没问题则关闭对应阀门*/
return BSP_Valve_Close(data[0]);
}
/*注册阀门信息*/
int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len)
{
size_t i = 0;
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
if ((data[0] >= 1) && (data[0] <= 8))
{
Flash_Get_Mac_Addr(mac_addr, data[0] - 1);
}
else
{
logError("valve id error");
return 1;
}
for (; i < FLASH_MAC_INFO_LEN; i++)
{
if (mac_addr[i] != 0xFF)
break;
}
if (i == FLASH_MAC_INFO_LEN) // 说明此处未写入数据那就在此处写入注册MAC地址
{
if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) != 0)
{
logError("register valve error");
return 2;
}
tmos_start_task(BtRxTaskId, BT_INFO_UPDATA_EVT, 10);
}
else
{
logError("valve info has been registered"); // 这个ID号已经注册了
return 3;
}
return 0;
}
/*移除阀门信息*/
int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len)
{
size_t i = 0;
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
if ((data[0] >= 1) && (data[0] <= 8))
{
Flash_Get_Mac_Addr(mac_addr, data[0] - 1);
}
else
{
logError("valve id error");
return -1;
}
for (; i < FLASH_MAC_INFO_LEN; i++)
{
if (mac_addr[i] != data[i + 1])
break;
}
if (i == FLASH_MAC_INFO_LEN) // 说明MAC地址没问题那么就将其擦除
{
tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN);
if (Flash_Set_Mac_Addr(mac_addr, data[0] - 1) != 0)
{
logError("移除阀门信息失败");
return -2;
}
tmos_start_task(BtRxTaskId, BT_INFO_UPDATA_EVT, 10);
}
else
{
logError("valve mac addr error"); // 这个ID号已经注册了
return -3;
}
return 0;
}
/*更换阀门信息*/
int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len)
{
size_t i = 0;
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
if ((len == 0) || (len < 12))
{
return -1;
}
if ((data[0] >= 1) && (data[0] <= 8))
{
Flash_Get_Mac_Addr(mac_addr, data[0] - 1);
}
else
{
logError("valve id error");
return -2;
}
for (; i < FLASH_MAC_INFO_LEN; i++)
{
if (mac_addr[i] != data[i + 1])
break;
}
if (i == FLASH_MAC_INFO_LEN) // 说明MAC地址没问题
{
tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN);
if (Flash_Set_Mac_Addr(mac_addr, data[0] - 1) != 0)
{
logError("擦除阀门信息失败");
return -3;
}
if (Flash_Set_Mac_Addr(&data[7], data[0] - 1) != 0)
{
logError("更换阀门信息失败");
return -4;
}
tmos_start_task(BtRxTaskId, BT_INFO_UPDATA_EVT, 10);
}
return 0;
}
/*更新阀门信息*/
void BSP_Bt_Valve_Updata(void)
{
uint8_t cnt = 0;
uint8_t mac[6] = {0};
uint8_t num = Flash_Get_Valve_Num();
logInfo("BSP_Bt_Valve_Updata");
tmos_memset(&valve_list, 0, sizeof(valve_data_list_t));
for (int i = 0; i < MAX_VALVE_NUM; i++)//这个循环是为了将数据拷贝到valve_list中 并且保证id号和flash对应起来
{
if(Flash_Get_Mac_Addr(mac, i) == 0)
{
if (tmos_isbufset(mac, 0xFF, 6) == FALSE)//不是默认值
{
tmos_memcpy(valve_list.valve_data[cnt].valve_mac, mac, 6);//这样做的目的就是读取方便只需要根据flash中读取到的数量进行读取前N个值
valve_list.valve_data[cnt].valve_id = i + 1;
cnt++;
logDebug(" updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X", i + 1, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
else
{
tmos_memset(&valve_list.valve_data[i], 0, sizeof(valve_data_t));
}
}
else
{
logError("BSP_Bt_Valve_Updata: flash read error");
}
}
}
/*接收从机的状态上报数据,并对所有数据进行整理*/
void BSP_Bt_Valve_Rx_Data(uint8_t *data, uint8_t len)
{
uint8_t i = 0;
}
void BSP_Valve_Init(void)
{
uint8_t num = Flash_Get_Valve_Num();
logInfo("num: %d", num);
logInfo("BSP_Valve_Init");
valve_list.valve_num = num;
for (int i = 0; i < num; i++)
{
valve_list.valve_data[i].valve_id = i + 1;
Flash_Get_Mac_Addr(valve_list.valve_data[i].valve_mac, i);
}
logInfo("BSP_Valve_Init end");
}