要实现 CYBLE-222014-01 模块在 PSoC Creator 中复制 EZ-Serial 固件功能,使其成为纯粹的 UART 到 BLE 桥接器并规避 EZ-Serial 配置的不便,可以按照以下详细步骤操作:
核心思路
创建 透明串口桥接 (Transparent UART Bridge):任何通过模块 UART 接口(RX/TX)收发的数据,都必须原样通过 BLE 链路透明传输,反之亦然。代码需处理数据分块、流控匹配及连接状态。
步骤详解
1. 创建新项目
- 打开 PSoC Creator。
- 选择
File > New > Project...。
- 选择
BLE 类别下的目标器件 CYBLE-222014-01。
- 项目类型选
Empty Schematic。
2. 添加关键组件
- BLE 组件 (BLE v4.2+)
- 拖入
BLE 组件,命名如 BLE_Bridge。
- 配置:
- GAP Role: Peripheral(默认)。
- Device Name: 如
UART_Bridge。
- Advertising Timeout: 设为
0 (永久广播)。
- MTU Size: 设置最大值(如
247)。
- Attribute Table Size: 增加 (如
1024),避免 Overflow。
- UART 组件 (UART v2.0+)
- 拖入
UART 组件,命名如 HW_UART。
- 配置:
- Baud Rate: 你的目标波特率(如
115200)。
- Data Bits:
8。
- Parity:
None。
- Stop Bits:
1。
- Flow Control:
Hardware (如 RTS/CTS)。
- Rx/Tx Buffer Size:
256 bytes 或更高(优化吞吐量)。
- Pin 组件
- 分配 UART 管脚:
RX, TX, RTS, CTS。
- 可选:添加
LED 管脚显示 BLE 连接状态。
- 其他组件
- Clock:为 BLE/UART 提供时钟源(如
IMO: 3MHz)。
- **Timer/Counter`:用于超时检测或数据包分块。
3. 设计自定义 GATT 服务
这是核心模块,模拟串口的虚拟管道:
- 双击
BLE 组件进入 GATT Configurator。
- 创建新服务
UART_Service,类型选 Custom。
- 在服务内添加两个主要特性:
- RX_Characteristic (模块接收 BLE 数据 → UART_TX)
- UUID: 自定义 (如
0000FFE1-0000-1000-8000-00805F9B34FB)
- Properties:
Write, Write Without Response
- Permissions:
Writeable
- TX_Characteristic (模块 UART_RX 数据 → BLE 发送)
- UUID: 自定义 (如
0000FFE2-0000-1000-8000-00805F9B34FB)
- Properties:
Read, Notify
- Permissions:
Readable
- Client Characteristic Configuration Descriptor (CCCD):
Enable Notifications
- 可添加辅助特性:
- Flow Control:用于软流控信号(如 CTS/RTS)。
- Connection State:BLE 连接状态 LED 显示。
4. 关键编程逻辑
在 main.c 中实现以下功能:
UART → BLE 传输
void UART_InterruptHandler(void) {
uint8_t uartData;
if (UART_GetRxInterruptSource() & UART_RX_STS_FIFO_NOTEMPTY) {
uartData = UART_ReadRxData(); // 读取UART数据
// 存入发送缓冲区
txBuffer[txIndex++] = uartData;
// 检查是否达到MTU或超时
if (txIndex >= MTU_SIZE || CySysTickGetValue() - lastTxTime > TX_TIMEOUT) {
if (BLE_IsNotificationEnabled(BLE_Bridge, UART_SERVICE, TX_CHAR_INDEX)) {
// 发送数据包
BLE_SendNotification(BLE_Bridge, txCharHandle, txIndex, txBuffer);
}
txIndex = 0; // 重置缓冲
lastTxTime = CySysTickGetValue();
}
}
}
BLE → UART 传输
void BLE_WriteEventHandler(uint32 event, void *eventParam) {
CYBLE_GATTS_WRITE_REQ_PARAM_T *wrReqParam = (CYBLE_GATTS_WRITE_REQ_PARAM_T *)eventParam;
if (event == CYBLE_EVT_GATTS_WRITE_REQ &&
wrReqParam->handleValPair.attrHandle == rxCharHandle) {
// 将收到的数据写入UART
UART_PutArray(wrReqParam->handleValPair.value.val, wrReqParam->handleValPair.value.len);
BLE_GATTS_WriteRsp(BLE_Bridge); // 响应写入成功
}
}
BLE 连接管理
void BLE_EventHandler(uint32 event, void *eventParam) {
switch(event) {
case CYBLE_EVT_GAP_DEVICE_CONNECTED:
LED_Write(0); // 连接时LED亮
UART_UartSetFlowControl(UART_HW_FLOW_CTRL_ENABLE); // 启用硬件流控
break;
case CYBLE_EVT_GAP_DEVICE_DISCONNECTED:
LED_Write(1); // 断开时LED灭
UART_UartSetFlowControl(UART_HW_FLOW_CTRL_DISABLE); // 禁用流控
break;
}
}
5. 优化关键点
- 数据分块与流控:
- 拆分大包:BLE 数据包最大为 MTU(建议设 247)。
- 软流控:在 BLE 服务中添加
CTS/RTS 特性,控制数据流。
- 缓冲区管理:
- 双缓冲策略:避免数据覆盖。
- 环形缓冲区:高效处理数据流。
- 低功耗优化:
- 空闲时进入
CY_SYS_PM_MODE_CPU_SLEEP。
- 断开连接后,设置广播间隔
Advertising Interval 为 1s 以上。
- MTU 协商:
6. 构建与调试
- 编译固件:
Build > Build 。
- 烧录:通过 MiniProg4 连接板载烧录口。
- 测试工具:
- 串口工具:Tera Term/PuTTY 连接模块 UART。
- BLE调试App:Nordic nRF Connect/Cypress CySmart。
- 验证逻辑:
- 在 BLE App 中连接并启用 TX 特性的
Notifications。
- 串口发送数据 → App 收到相同数据。
- App 发送数据到 RX 特性 → 串口输出相同数据。
为什么这比 EZ-Serial 更优
- 去配置化:无需 AT 命令,上电即用。
- 完全透明传输:数据无修改,适合二进制协议。
- 吞吐量优化:大 MTU + 流控支持高速传输。
- 可定制扩展:轻松添加加密、协议解析等功能。
注意事项
- 硬件流控必需:避免高速传输时数据丢失。
- 广播功率:调整
CYBLE_GAP_ADV_TX_POWER 降低功耗。
- 看门狗:添加看门狗定时器(WDT)防止死机。
按照此流程,即可在 PSoC Creator 中构建高度定制的 UART-BLE 透明桥,完全绕过 EZ-Serial 的配置复杂性,同时保留所有关键传输功能。
要实现 CYBLE-222014-01 模块在 PSoC Creator 中复制 EZ-Serial 固件功能,使其成为纯粹的 UART 到 BLE 桥接器并规避 EZ-Serial 配置的不便,可以按照以下详细步骤操作:
核心思路
创建 透明串口桥接 (Transparent UART Bridge):任何通过模块 UART 接口(RX/TX)收发的数据,都必须原样通过 BLE 链路透明传输,反之亦然。代码需处理数据分块、流控匹配及连接状态。
步骤详解
1. 创建新项目
- 打开 PSoC Creator。
- 选择
File > New > Project...。
- 选择
BLE 类别下的目标器件 CYBLE-222014-01。
- 项目类型选
Empty Schematic。
2. 添加关键组件
- BLE 组件 (BLE v4.2+)
- 拖入
BLE 组件,命名如 BLE_Bridge。
- 配置:
- GAP Role: Peripheral(默认)。
- Device Name: 如
UART_Bridge。
- Advertising Timeout: 设为
0 (永久广播)。
- MTU Size: 设置最大值(如
247)。
- Attribute Table Size: 增加 (如
1024),避免 Overflow。
- UART 组件 (UART v2.0+)
- 拖入
UART 组件,命名如 HW_UART。
- 配置:
- Baud Rate: 你的目标波特率(如
115200)。
- Data Bits:
8。
- Parity:
None。
- Stop Bits:
1。
- Flow Control:
Hardware (如 RTS/CTS)。
- Rx/Tx Buffer Size:
256 bytes 或更高(优化吞吐量)。
- Pin 组件
- 分配 UART 管脚:
RX, TX, RTS, CTS。
- 可选:添加
LED 管脚显示 BLE 连接状态。
- 其他组件
- Clock:为 BLE/UART 提供时钟源(如
IMO: 3MHz)。
- **Timer/Counter`:用于超时检测或数据包分块。
3. 设计自定义 GATT 服务
这是核心模块,模拟串口的虚拟管道:
- 双击
BLE 组件进入 GATT Configurator。
- 创建新服务
UART_Service,类型选 Custom。
- 在服务内添加两个主要特性:
- RX_Characteristic (模块接收 BLE 数据 → UART_TX)
- UUID: 自定义 (如
0000FFE1-0000-1000-8000-00805F9B34FB)
- Properties:
Write, Write Without Response
- Permissions:
Writeable
- TX_Characteristic (模块 UART_RX 数据 → BLE 发送)
- UUID: 自定义 (如
0000FFE2-0000-1000-8000-00805F9B34FB)
- Properties:
Read, Notify
- Permissions:
Readable
- Client Characteristic Configuration Descriptor (CCCD):
Enable Notifications
- 可添加辅助特性:
- Flow Control:用于软流控信号(如 CTS/RTS)。
- Connection State:BLE 连接状态 LED 显示。
4. 关键编程逻辑
在 main.c 中实现以下功能:
UART → BLE 传输
void UART_InterruptHandler(void) {
uint8_t uartData;
if (UART_GetRxInterruptSource() & UART_RX_STS_FIFO_NOTEMPTY) {
uartData = UART_ReadRxData(); // 读取UART数据
// 存入发送缓冲区
txBuffer[txIndex++] = uartData;
// 检查是否达到MTU或超时
if (txIndex >= MTU_SIZE || CySysTickGetValue() - lastTxTime > TX_TIMEOUT) {
if (BLE_IsNotificationEnabled(BLE_Bridge, UART_SERVICE, TX_CHAR_INDEX)) {
// 发送数据包
BLE_SendNotification(BLE_Bridge, txCharHandle, txIndex, txBuffer);
}
txIndex = 0; // 重置缓冲
lastTxTime = CySysTickGetValue();
}
}
}
BLE → UART 传输
void BLE_WriteEventHandler(uint32 event, void *eventParam) {
CYBLE_GATTS_WRITE_REQ_PARAM_T *wrReqParam = (CYBLE_GATTS_WRITE_REQ_PARAM_T *)eventParam;
if (event == CYBLE_EVT_GATTS_WRITE_REQ &&
wrReqParam->handleValPair.attrHandle == rxCharHandle) {
// 将收到的数据写入UART
UART_PutArray(wrReqParam->handleValPair.value.val, wrReqParam->handleValPair.value.len);
BLE_GATTS_WriteRsp(BLE_Bridge); // 响应写入成功
}
}
BLE 连接管理
void BLE_EventHandler(uint32 event, void *eventParam) {
switch(event) {
case CYBLE_EVT_GAP_DEVICE_CONNECTED:
LED_Write(0); // 连接时LED亮
UART_UartSetFlowControl(UART_HW_FLOW_CTRL_ENABLE); // 启用硬件流控
break;
case CYBLE_EVT_GAP_DEVICE_DISCONNECTED:
LED_Write(1); // 断开时LED灭
UART_UartSetFlowControl(UART_HW_FLOW_CTRL_DISABLE); // 禁用流控
break;
}
}
5. 优化关键点
- 数据分块与流控:
- 拆分大包:BLE 数据包最大为 MTU(建议设 247)。
- 软流控:在 BLE 服务中添加
CTS/RTS 特性,控制数据流。
- 缓冲区管理:
- 双缓冲策略:避免数据覆盖。
- 环形缓冲区:高效处理数据流。
- 低功耗优化:
- 空闲时进入
CY_SYS_PM_MODE_CPU_SLEEP。
- 断开连接后,设置广播间隔
Advertising Interval 为 1s 以上。
- MTU 协商:
6. 构建与调试
- 编译固件:
Build > Build 。
- 烧录:通过 MiniProg4 连接板载烧录口。
- 测试工具:
- 串口工具:Tera Term/PuTTY 连接模块 UART。
- BLE调试App:Nordic nRF Connect/Cypress CySmart。
- 验证逻辑:
- 在 BLE App 中连接并启用 TX 特性的
Notifications。
- 串口发送数据 → App 收到相同数据。
- App 发送数据到 RX 特性 → 串口输出相同数据。
为什么这比 EZ-Serial 更优
- 去配置化:无需 AT 命令,上电即用。
- 完全透明传输:数据无修改,适合二进制协议。
- 吞吐量优化:大 MTU + 流控支持高速传输。
- 可定制扩展:轻松添加加密、协议解析等功能。
注意事项
- 硬件流控必需:避免高速传输时数据丢失。
- 广播功率:调整
CYBLE_GAP_ADV_TX_POWER 降低功耗。
- 看门狗:添加看门狗定时器(WDT)防止死机。
按照此流程,即可在 PSoC Creator 中构建高度定制的 UART-BLE 透明桥,完全绕过 EZ-Serial 的配置复杂性,同时保留所有关键传输功能。
举报