本帖最后由 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部分配置如下:
这里要注意的是,关于UUID这部分要设置正确,否则是通讯不上的,以上参数配置完成之后,点击连接则可以正常通讯。
接下来是代码部分,
USB发送至蓝牙部分的代码:
if(events & SBP_PROCESS_USBDATA_EVT)
{
while(RingMemUSB.CurrentLen)
{
uint8_t buf[peripheralMTU - 3];
if(RingMemUSB.CurrentLen > peripheralMTU - 3)
{
RingMemCopy(&RingMemUSB, buf, peripheralMTU - 3);
if(app_usb_notify(buf, peripheralMTU - 3))
{
tmos_start_task(Peripheral_TaskID, SBP_PROCESS_USBDATA_EVT, 80);
break;
}
RingMemDelete(&RingMemUSB, peripheralMTU - 3);
}
else
{
RingMemCopy(&RingMemUSB, buf, RingMemUSB.CurrentLen);
if(app_usb_notify(buf, RingMemUSB.CurrentLen))
{
tmos_start_task(Peripheral_TaskID, SBP_PROCESS_USBDATA_EVT, 80);
break;
}
RingMemDelete(&RingMemUSB, RingMemUSB.CurrentLen);
}
}
return (events ^ SBP_PROCESS_USBDATA_EVT);
}
蓝牙发送至USB部分的代码:
if(events & SBP_PROCESS_BLEDATA_EVT)
{
if(RingMemBLE.CurrentLen)
{
USBSendData();
tmos_start_task(Peripheral_TaskID, SBP_PROCESS_BLEDATA_EVT, 5);
}
return (events ^ SBP_PROCESS_BLEDATA_EVT);
}
效果如下:
后续可以在这两个事件里,分别添加NFC部分的功能,即可实现支持蓝牙与USB的NFC读写器了,但是这里要注意的是:“单个中断服务程序所占用的时间不宜过长,否则长期打断低功耗蓝牙工作会导致连接断开。”
|