[蓝牙芯片] 【CH585M测评】2 、基于CH585M的蓝牙与USB交互

[复制链接]
 楼主| yangjiaxu 发表于 2025-2-16 22:32 | 显示全部楼层 |阅读模式
本帖最后由 yangjiaxu 于 2025-2-16 22:36 编辑
#技术资源# #申请原创# @21ic小管家
本次带来的是基于CH585M芯片的蓝牙与USB数据交互,其实本来是想加入NFC,实现蓝牙与USB共存的阅读器,但是暂时没有将NFC功能加入其中,不过关于USB与蓝牙的交互是暂时可以实现的,后续将NFC添加进来就可以了。本次是采用官方提供的BLE_USB例程为模板来介绍的。
沁恒原厂提供的BLE_USB例程是蓝牙与USB透传功能,USB模拟CH340从而将数据传出。打开例程之后找到关于Peripheral_ProcessEvent的子函数,该函数实现的是所有外围应用程序任务事件处理器。调用此函数来处理任务的所有事件。事件包括定时器、消息和任何其他用户定义的事件。其中也包含USB与BLE的事件交互。将例程烧录到开发板之后,进行仿真运行,手机端APP采用“蓝牙调试器”软件APP,利用该软件APP实现蓝牙的设置连接与通讯。USB端利用数据线接入FS USB接口,会在电脑上虚拟出来一个USB串口CH340,波特率为115200,一切配置好之后,APP部分配置如下:
419669f37307ac96347575032d59ba0d
这里要注意的是,关于UUID这部分要设置正确,否则是通讯不上的,以上参数配置完成之后,点击连接则可以正常通讯。
接下来是代码部分,
  1. USB发送至蓝牙部分的代码:
  2.     if(events & SBP_PROCESS_USBDATA_EVT)
  3.     {
  4.         while(RingMemUSB.CurrentLen)
  5.         {
  6.             uint8_t buf[peripheralMTU - 3];
  7.             if(RingMemUSB.CurrentLen > peripheralMTU - 3)
  8.             {
  9.                 RingMemCopy(&RingMemUSB, buf, peripheralMTU - 3);
  10.                 if(app_usb_notify(buf, peripheralMTU - 3))
  11.                 {
  12.                     tmos_start_task(Peripheral_TaskID, SBP_PROCESS_USBDATA_EVT, 80);
  13.                     break;
  14.                 }
  15.                 RingMemDelete(&RingMemUSB, peripheralMTU - 3);
  16.             }
  17.             else
  18.             {
  19.                 RingMemCopy(&RingMemUSB, buf, RingMemUSB.CurrentLen);
  20.                 if(app_usb_notify(buf, RingMemUSB.CurrentLen))
  21.                 {
  22.                     tmos_start_task(Peripheral_TaskID, SBP_PROCESS_USBDATA_EVT, 80);
  23.                     break;
  24.                 }
  25.                 RingMemDelete(&RingMemUSB, RingMemUSB.CurrentLen);
  26.             }
  27.         }
  28.         return (events ^ SBP_PROCESS_USBDATA_EVT);
  29.     }
  1. 蓝牙发送至USB部分的代码:
  2.     if(events & SBP_PROCESS_BLEDATA_EVT)
  3.     {
  4.         if(RingMemBLE.CurrentLen)
  5.         {
  6.             USBSendData();
  7.             tmos_start_task(Peripheral_TaskID, SBP_PROCESS_BLEDATA_EVT, 5);
  8.         }
  9.         return (events ^ SBP_PROCESS_BLEDATA_EVT);
  10.     }

效果如下:
4a10cdcd9f94b812f823bf2f38561139
0d4fe606a2ec3300ddd611054de1280d
后续可以在这两个事件里,分别添加NFC部分的功能,即可实现支持蓝牙与USB的NFC读写器了,但是这里要注意的是:“单个中断服务程序所占用的时间不宜过长,否则长期打断低功耗蓝牙工作会导致连接断开。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

783

主题

3316

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部