完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
版本: 2.2.7 构建ID: 202308112000 问题描述 使用USB,使用CherryUSB 我之所以想问这个,是因为RTThread自带了很多的USB的功能,但是我在想如果使用CherryUSB是否比使用 自带的更好。 所以我的操作一开始是这样的 1、RTThread使能自带的USB,使能了大容量设备MSC,测试正常 2、使用CherryUSB里面的虚拟串口-通过 2.1、RTThread使能自带的USB作为大容量设备,大容量设备无法使用 3、使用CherryUSB里面的虚拟RNDIS网口-通过 RTThread使能自带的USB作为大容量设备,大容量设备无法使用 我这么使用比较担心的一个点是,RTThread使能自带的USB和CherryUSB的功能很多都是一样的。 是否会因为这个导致USB就不正常了。 5、如果只是使能CherryUSB、不使用RTThread使能自带的USB的功能 =》效果:所有的功能都无法使用,需要使能RTThread里面自带的USB功能比如一些不冲突的 例如:RTThread使能U盘 CherryUSB使能虚拟网口 结果:CherryUSB虚拟网口 - 正常 RTThread的U盘 - 无法使用 结论 说这些就是说,我目前还没有办法直接使用CherryUSB,需要依赖于RTThread提供的USB功能,但是这 里面有冲突了,因为感觉CherryUSB还是用起来也挺爽的,应该缺少了一些配置,但是目前文档里面也说的 很简单,还不知道具体原因。 问 有朋友知道如何能够正常的使用CherryUSB,而不开启RTThread自带的USB功能吗? 比如CherryUSB使能U盘,RTThread就不使能这些设备的具体功能了,只是设置为USB Device即可 补充 我用的配置方式是,RTThread Setting这个可视化的功能,感觉用起来挺不错的,很直观,很欣赏。 |
|
相关推荐
1个回答
|
|
|
根据您的问题描述,您在使用RT-Thread时遇到了同时使用RT-Thread自带的USB功能和CherryUSB库的兼容性问题。您希望同时使用RT-Thread自带的USB MSC(大容量存储设备)和CherryUSB提供的虚拟串口或RNDIS网口功能,但发现两者不能同时工作。 问题分析: 1. RT-Thread自带的USB协议栈和CherryUSB都是完整的USB协议栈实现,它们都期望独占USB外设资源(包括硬件IP和中断等)。 2. 当您尝试同时启用两个USB协议栈时,它们会互相冲突,因为一个USB外设(如USB OTG)在同一时间只能由一个协议栈管理。 解决方案: 您有两个选择: 选择一:只使用RT-Thread自带的USB协议栈 - RT-Thread的USB协议栈支持多种设备类(如MSC、HID、CDC等),但可能不支持您需要的所有功能(比如RNDIS)。您可以查看RT-Thread的文档,确认是否支持RNDIS。如果不支持,您可以考虑在RT-Thread的USB协议栈基础上实现,或者选择CherryUSB。 选择二:只使用CherryUSB协议栈 - CherryUSB是一个独立的、轻量级的USB协议栈,支持多种设备类和复合设备(Composite Device)。您可以配置CherryUSB来同时支持MSC和虚拟串口(CDC)或RNDIS。这样,您就可以在一个USB接口上实现多个功能,而不需要两个协议栈。 由于您已经尝试了CherryUSB的虚拟串口和RNDIS,并且希望同时使用MSC,那么推荐您使用CherryUSB来实现复合设备。 具体步骤(使用CherryUSB): 1. 在RT-Thread Studio中,禁用RT-Thread自带的USB协议栈(包括MSC设备驱动)。 2. 在项目中集成CherryUSB,并配置为复合设备(Composite Device)。 3. 在CherryUSB的配置中,同时启用MSC、CDC(虚拟串口)或RNDIS。 注意:复合设备意味着一个USB设备可以同时提供多个功能(接口)。这样,您的设备在连接到主机时,会同时被识别为多个设备(例如,一个U盘和一个串口,或者一个U盘和一个网卡)。 如何配置CherryUSB为复合设备? 在CherryUSB中,您可以通过配置描述符来组合多个接口。例如,同时配置一个MSC接口和一个CDC接口(或RNDIS接口)。 示例配置(伪代码): 您需要在CherryUSB的配置文件中(如`usb_config.h`)定义多个设备类,并正确设置描述符。 对于MSC+CDC复合设备,可以这样: - 定义两个接口:一个用于MSC,一个用于CDC。 - 注意端点不能冲突(每个接口使用不同的端点)。 同样,对于MSC+RNDIS复合设备,也是类似。 由于配置复合设备需要一定的USB知识,您需要参考CherryUSB的文档和示例。 在RT-Thread中使用CherryUSB: 1. 确保RT-Thread的包管理器(如果使用)中已经添加了CherryUSB包。或者您也可以手动将CherryUSB源码添加到项目中。 2. 在RT-Thread的`rtconfig.h`中,关闭RT-Thread自带的USB驱动(如`RT_USING_USB_DEVICE`)。 3. 初始化CherryUSB,并配置所需的设备类。 示例初始化代码(在RT-Thread中): ```c #include #include "usb_core.h" void usb_thread_entry(void *parameter) { // 初始化CherryUSB usb_core_init(); while (1) { // CherryUSB的主循环处理 usb_core_task(); rt_thread_mdelay(10); } } int main(void) { rt_thread_t tid; tid = rt_thread_create("usb", usb_thread_entry, RT_NULL, 1024, 8, 10); if (tid != RT_NULL) { rt_thread_startup(tid); } return 0; } ``` 同时,您需要根据CherryUSB的文档,实现MSC的回调函数(读写存储设备)以及CDC或RNDIS的回调函数。 总结: 由于两个USB协议栈不能同时存在,建议您使用CherryUSB来实现复合设备,从而在一个USB协议栈下同时支持MSC和虚拟串口(或RNDIS)。这样避免了资源冲突,并且能够满足您的需求。 如果您在配置复合设备时遇到问题,可以查阅CherryUSB的示例代码(通常有复合设备的示例)或者在其GitHub仓库中寻求帮助。 注意:在切换协议栈时,请确保正确配置USB硬件时钟和引脚,这些通常在board.c或类似的文件中完成。 希望这些信息对您有所帮助! 在RT-Thread中合理使用CherryUSB与自带USB协议栈的关键在于避免同时启用两个协议栈,因为它们会竞争同一个USB外设资源。以下是优化建议和具体操作步骤: 1. 核心原则:二选一
2. 推荐方案:使用CherryUSB实现复合设备若需同时使用MSC、虚拟串口(CDC)、RNDIS网卡,应禁用RT-Thread自带USB,用CherryUSB配置复合设备: 步骤:
3. 调试技巧
4. 备选方案:RT-Thread自带协议栈若只需基础功能(如MSC+CDC),可仅用RT-Thread自带USB:
5. 性能对比
总结
|
||
|
|
||
只有小组成员才能发言,加入小组>>
184个成员聚集在这个小组
加入小组rtstudio是否可像keil加载ini解决虚拟串口与mcu串口通讯?
1212 浏览 0 评论
【Vision Board创客营连载体验】基于RA8D1-Vision Board的自动路径规划小车
1776 浏览 1 评论
【Vision Board创客营连载体验】基于Vision Board的垃圾分类
2156 浏览 0 评论
【Vision Board创客营连载体验】使用 Vision Board 做一个 UVC Camera
1777 浏览 0 评论
【Vision Board创客营连载体验】TinyMaix进行手写数字识别
2006 浏览 0 评论
1464浏览 5评论
在RT-Thread Studio中新建的stm32f407-atk-explorer工程运行qemu失败,是什么原因引起的?
1766浏览 3评论
为什么rt_device_read()只能读取到两个字节数据?
363浏览 3评论
连得上热点,但是ping baidu.com出现timeout,请问跟什么有关?
421浏览 3评论
420浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:16 , Processed in 0.611926 second(s), Total 44, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1098
