完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
在中断函数中触发输入输出中断后,判定为IN端点或OUT端点,即调用一个transfer_callback函数,该函数处理了0端点和非0端点(分为非0-IN端点和非0-OUT端点)的数据......然同时当调用cdc_acm_read和cdc_acm_write函数收发数时,会一路调用一个transfer_request函数,在该函数中也对IN端点和OUT端点做了数据处理,仔细对比了下,transfer_callback函数和transfer_request函数中对IN端点和OUT端点的处理程序非常相似,两者的具体区别能帮忙分析下吗?再有,在两个函数中,当为OUT端点时,传输大小和包个数的计数代码为:
endpoint_size = ((fifo_length - 1 + endpoint.wMaxPacketSize) / endpoint.wMaxPacketSize) * endpoint.wMaxPacketSize; endpoint_size |= ((fifo_length - 1 + endpoint.wMaxPacketSize) / endpoint.wMaxPacketSize) << UX_DCD_OTG_FS_DIEPTSIZ_PKTCNT_SHIFT; 不动这两个代码,USB的写速率只能接近2MB/s...... 再网上看到这个博客http://www.stmcu.org/module/forum/thread-613504-1-1.html,将这两个代码在transfer_request函数中改为如下: endpoint_size |= (UX_DCD_OTG_FS_DOEPTSIZ_XFRSIZ_MASK & (endpoint.wMaxPacketSize * (fifo_length - 1 + endpoint.wMaxPacketSize))); endpoint_size |= (UX_DCD_OTG_FS_DOEPTSIZ_PKTCNT_SHIFT & (((fifo_length - 1 + endpoint.wMaxPacketSize) / endpoint.wMaxPacketSize) << 19)); 而这时USB的写速率能达到20MB/s,测试了下,有时候会丢包1...... 想请教下这两个函数和速率的问题,还有这个计算传输大小和包个数的公式是怎么理解呢?如果对问题还有疑问,本人会及时回应,拜托大家了,谢谢! |
|
相关推荐
22个回答
|
|
|
|
|
|
|
|
|
楼主的传输是用USB的CDC虚拟串口模式吗?
|
|
|
|
|
|
是的,将目标板当成设备,通过USB接口连接到linux主机上,用dd命令测试读写速率的 |
|
|
|
|
|
|
|
|
|
|
|
感觉这两句有问题:
endpoint_size |= (UX_DCD_OTG_FS_DOEPTSIZ_XFRSIZ_MASK & (endpoint.wMaxPacketSize * (fifo_length - 1 + endpoint.wMaxPacketSize))); endpoint_size |= (UX_DCD_OTG_FS_DOEPTSIZ_PKTCNT_SHIFT & (((fifo_length - 1 + endpoint.wMaxPacketSize) / endpoint.wMaxPacketSize) << 19)); 不断地进行或运算,总有一天会变成全1的。 应该是改为: endpoint_size = (UX_DCD_OTG_FS_DOEPTSIZ_XFRSIZ_MASK & (endpoint.wMaxPacketSize * (fifo_length - 1 + endpoint.wMaxPacketSize))); endpoint_size |= (UX_DCD_OTG_FS_DOEPTSIZ_PKTCNT_SHIFT & (((fifo_length - 1 + endpoint.wMaxPacketSize) / endpoint.wMaxPacketSize) << 19)); 这样才可靠吧。 还有,按楼主提供的链接,里面讲述的是Cube的版本过低会出现丢包,楼主可以更新Cube的版本试试。 |
|
|
|
|
xieweibin 发表于 2019-1-14 21:45 首先很感谢您的回复 按照链接那样修改,确实有丢包现象,然后根据您的建议修改,也有丢包现象,但速率又有所提升,您能帮忙理解这两句的含义吗?不是很明白这两句怎么来的......方便加联系方式吗?qq308676264 |
|
|
|
|
|
接口芯片不是外接,而是集成到控制器中的 |
|
|
|
|
|
|
|
|
|
|
|
这样啊,不过集成的速率是有很大的提升空间,现在一直在做这个优化速率的工作,就像一楼的问题,通过修改该处,还有协议栈的其他地方,现在设备写速率能有40MB/s左右,但会有丢包现象。。。设备读速率还没改这个地方,速率只有3MB/s。。。不过应该都能提升的 |
|
|
|
|
xieweibin 发表于 2019-1-14 21:45 在非0的OUT端点中,DOEPTSIZ_XFRSIZ为[18:0]位,DOEPTSIZ_PKTCNT为[28:19]位 计算传输大小时: endpoint_size = (0x0007FFFF & (endpoint.wMaxPacketSize * (fifo_length - 1 + endpoint.wMaxPacketSize))); 计算数据包个数: endpoint_size |= ((fifo_length - 1 + endpoint.wMaxPacketSize) / endpoint.wMaxPacketSize) << 19; 其中,fifo_length为读取的端点长度 这样,合理吗? 再有,fifo_length和endpoint.wMaxPacketSize是一个意思吧,为什么又需要定义一个fifo_length呢? |
|
|
|
|
|
貌似ST有“on-chip Hi-speed PHY ”的只有F7X2、F7X3系列,其它都是Full-speed的PHY,极速就是12Mbit/S,你用的那颗芯片?你靠dd报告的速度可信吗?为啥不是MCU来统计结果回传? |
|
|
|
|
|
高速丢包这个有可能是电路的干扰造成,这块要通过软件硬件综合分析。选择一个最合适的速度。追求速度软硬件各项成本开销都有
|
|
|
|
|
hnllyhsh 发表于 2019-1-14 23:02 芯片似乎用的是3500,至于速率,因为缺少Windows下的驱动,只能接在linux主机上,但在linux主机上能测试虚拟串口的工具似乎没找到。。。你有推荐的吗? |
|
|
|
|
|
硬件上面现在没有动,只考虑软件上面,cdc类驱动用了三个端点,一个中断端点,两个批量端点,就是现在在IN和OUT批量端点上的传输大小和数据包个数上修改,但没有设计好合理的大小和个数。。。
|
|
|
|
|
|
St的mcu有3500吗?你连自己用的芯片都是似乎……
|
|
|
|
|
|
因为对USB phy操作不多,而且也没研究太长时间,所以对这个不是特别的清晰,查了下,USB phy芯片用的是USB3500,并且嵌入了USB控制芯片内部
|
|
|
|
|
peternie 发表于 2019-1-14 22:47 fifo_length为端点长度 endpoint.wMaxPacketSize是最大允许封包值 不是同一概念。 丢包的问题,看看是不是优先级太低导致的问题。 |
|
|
|
|
|
代表的含义是不一样,fifo_length的值根据不同的端点采用不同的传输方式而改变,控制传输时为8,高速批量传输时为512......您说的那个优先级太低,指的是什么的优先级?还有,就像我这BULK-OUT端点的传输大小和包个数可以这样计算,那对应的BULK-IN端点又该如何设计呢?
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 09:58 , Processed in 1.138989 second(s), Total 110, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2232