蓝牙技术
直播中

康桃花

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

是否有办法通过 CYW20835 板的固件发送 BLE HCI 命令?

我想问您是否有办法通过 CYW20835 板的固件发送 BLE HCI 命令。

我知道 API 调用中提供了供应商特定的命令
[i]wiced_bt_dev_vendor_specific_comman
但我还没有为定义的 BLE HCI 命令找到一个。

回帖(1)

贾虎世

2025-7-10 18:13:06

是的,可以通过CYW20835的固件发送BLE HCI命令。以下是几种可行的方法和操作建议:




方法 1: 直接使用 wiced_bt_hci_send_command


WICED SDK提供了底层HCI命令接口 wiced_bt_hci_send_command(),专用于发送标准/自定义的HCI命令。

步骤




  1. 包含头文件


    #include "wiced_bt_hci.h"



  2. 构造并发送命令


    uint8_t hci_cmd_buffer[100]; // 根据命令长度调整
    uint16_t opcode = 0x0C03;     // 示例:重置命令 (0x0C03)
    uint8_t param_len = 0;        // 参数长度

    // 填充HCI命令包 (格式: [Opcode低字节, Opcode高字节, 参数长度, 参数...])
    hci_cmd_buffer[0] = opcode & 0xFF;         // OCF低字节
    hci_cmd_buffer[1] = (opcode >> 8) & 0xFF;  // OGF + OCF高字节
    hci_cmd_buffer[2] = param_len;              // 参数长度
    // 若有参数,在此继续填充...

    // 发送命令
    wiced_bt_hci_send_command(HCI_CONTROL_ON_CHIP, hci_cmd_buffer, param_len + 3);


    • 关键参数

      • opcode: 完整的HCI命令Opcode(如重置命令HCI_RESET=0x0C03)。

      • param_len: 命令参数的长度(无参数则为0)。


    • 注意事项

      • 命令格式需严格遵循蓝牙规范(Opcode小端序 + 参数)。

      • 结果通过HCI事件返回,需注册回调函数处理(见下文)。





  3. 处理异步响应

    通过注册事件回调接收命令的返回结果:


    wiced_bt_hci_register_event_callback(HCI_EVENT_COMMAND_COMPLETE, my_hci_event_callback);

    void my_hci_event_callback(uint8_t event_code, uint8_t* data, uint16_t length) {
       if (event_code == HCI_EVENT_COMMAND_COMPLETE) {
           // 解析data中的结果(包含原Opcode、返回状态等)
       }
    }





方法 2: 复用 wiced_bt_dev_vendor_specific_command


若需发送供应商特定HCI命令(Opcode在0xFC00-0xFFFF范围),可直接用:


uint8_t params[3] = {0x01, 0x02, 0x03}; // 自定义参数
wiced_bt_dev_vendor_specific_command(sizeof(params), params, NULL);



关键注意事项




  1. 参数格式验证:  



    • 严格遵循蓝牙核心规范([Vol 4, Part E])的命令格式(Opcode + 参数长度 + 参数)。

    • 示例命令:

      • 重置控制器:opcode=0x0C03, param_len=0

      • 读RSSI:opcode=0x1405, param_len=2(参数:Handle)





  2. 资源依赖



    • WICED版本:确认SDK支持底层HCI API(常见于较新版本)。若缺失wiced_bt_hci.h,需升级SDK。

    • 芯片模式:确保芯片运行在Host-Controller一体化模式(即On-Chip模式),否则HCI命令可能被忽略。




  3. 调试建议



    • 使用WICED SmartConsole或btrace工具捕获HCI流量,验证命令是否正确发送/响应。

    • 若命令未执行,检查返回的HCI Error Code(如Unknown Command表示Opcode错误)。






替代方案:高层API优先



  • 避免直接使用HCI:大多数标准操作(如扫描、连接)已有封装API。例如:
    wiced_bt_ble_set_scan_params(); // 设置扫描参数
    wiced_bt_ble_start_scan();      // 启动扫描

  • 查阅文档

    • API参考/docs/api/bt_api_[version].chm

    • HCI Opcode列表:蓝牙规范文档或hci_defs.h头文件。





总结



  • 直接发送:使用wiced_bt_hci_send_command()发送任意HCI命令,正确构造Opcode和参数。

  • 供应商命令:用wiced_bt_dev_vendor_specific_command发送Opcode范围在0xFC00-0xFFFF的命令。

  • 优先选择:尽量使用SDK封装的高层API,减少底层依赖风险。


如仍遇到问题,建议提供具体的HCI命令Opcode和参数细节,以便进一步分析。

举报

更多回帖

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