蓝牙技术
直播中

李泽坚

8年用户 1429经验值
私信 关注
[问答]

CYBLE-222014-01在PSoC™ Creator上复制EZ-Serial固件,怎么实现?

为了使CYBLE-222014-01模块充当纯粹而简单的 UART 通信桥,我想在PSoC™ Creator 中创建一个项目,复制 EZ-Serial 固件的功能。 这种方法可以解决使用 EZ-Serial 固件时通过终端配置设置所带来的不便和缺乏直观性的问题,通过使其更具可定制性。

回帖(1)

莫联雪

2025-7-3 18:16:55

要实现 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 服务


这是核心模块,模拟串口的虚拟管道:



  1. 双击 BLE 组件进入 GATT Configurator

  2. 创建新服务 UART_Service,类型选 Custom

  3. 在服务内添加两个主要特性:

    • 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



  4. 可添加辅助特性:

    • 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 协商

    • CYBLE_EVT_GATT_CONNECT_IND 事件中主动请求更大 MTU:
      BLE_GattExchangeMtuReq(BLE_Bridge, 247); 





6. 构建与调试



  1. 编译固件Build > Build

  2. 烧录:通过 MiniProg4 连接板载烧录口。

  3. 测试工具

    • 串口工具:Tera Term/PuTTY 连接模块 UART。

    • BLE调试App:Nordic nRF Connect/Cypress CySmart。


  4. 验证逻辑

    • 在 BLE App 中连接并启用 TX 特性的 Notifications

    • 串口发送数据 → App 收到相同数据。

    • App 发送数据到 RX 特性 → 串口输出相同数据。





为什么这比 EZ-Serial 更优



  1. 去配置化:无需 AT 命令,上电即用。

  2. 完全透明传输:数据无修改,适合二进制协议。

  3. 吞吐量优化:大 MTU + 流控支持高速传输。

  4. 可定制扩展:轻松添加加密、协议解析等功能。




注意事项



  • 硬件流控必需:避免高速传输时数据丢失。

  • 广播功率:调整 CYBLE_GAP_ADV_TX_POWER 降低功耗。

  • 看门狗:添加看门狗定时器(WDT)防止死机。


按照此流程,即可在 PSoC Creator 中构建高度定制的 UART-BLE 透明桥,完全绕过 EZ-Serial 的配置复杂性,同时保留所有关键传输功能。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分