你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F系列:USB接口提速问题

[复制链接]
wylew 提问时间:2018-1-24 17:13 /
在中断函数中触发输入输出中断后,判定为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......
再网上看到这个博客https://www.stmcu.org.cn/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......
想请教下这两个函数和速率的问题,还有这个计算传输大小和包个数的公式是怎么理解呢?如果对问题还有疑问,本人会及时回应,拜托大家了,谢谢!
收藏 1 评论22 发布时间:2018-1-24 17:13

举报

22个回答
wylew 回答时间:2018-1-26 17:50:37
是问题没有说清楚吗?
自已顶帖
奏奏奏 回答时间:2018-1-26 19:18:43
楼主的传输是用USB的CDC虚拟串口模式吗?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wylew 回答时间:2018-1-26 23:43:05
奏奏奏 发表于 2018-1-26 19:18
楼主的传输是用USB的CDC虚拟串口模式吗?

是的,将目标板当成设备,通过USB接口连接到linux主机上,用dd命令测试读写速率的
maxtch 回答时间:2018-1-29 11:50:39
只是一说,如果你用的是 STM32F2/F4/F7 系列,可以外挂一片 PHY 用 USB 2.0 480Mbps 速率。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

无薪税绵 回答时间:2018-1-29 12:42:52
感觉这两句有问题:
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的版本试试。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

wylew 回答时间:2018-1-29 15:06:45
无薪税绵 发表于 2018-1-29 12:42
感觉这两句有问题:
endpoint_size |= (UX_DCD_OTG_FS_DOEPTSIZ_XFRSIZ_MASK & (endpoint.wMaxPacketSize * ...

首先很感谢您的回复
按照链接那样修改,确实有丢包现象,然后根据您的建议修改,也有丢包现象,但速率又有所提升,您能帮忙理解这两句的含义吗?不是很明白这两句怎么来的......方便加联系方式吗?qq308676264
wylew 回答时间:2018-1-29 15:27:20
maxtch 发表于 2018-1-29 11:50
只是一说,如果你用的是 STM32F2/F4/F7 系列,可以外挂一片 PHY 用 USB 2.0 480Mbps 速率。 ...

接口芯片不是外接,而是集成到控制器中的
maxtch 回答时间:2018-1-29 15:30:41
wylew 发表于 2018-1-29 15:27
接口芯片不是外接,而是集成到控制器中的

我只是说如果集成的速度你觉得不够用,可以考虑换用外接的。
wylew 回答时间:2018-1-29 15:49:07
maxtch 发表于 2018-1-29 15:30
我只是说如果集成的速度你觉得不够用,可以考虑换用外接的。

这样啊,不过集成的速率是有很大的提升空间,现在一直在做这个优化速率的工作,就像一楼的问题,通过修改该处,还有协议栈的其他地方,现在设备写速率能有40MB/s左右,但会有丢包现象。。。设备读速率还没改这个地方,速率只有3MB/s。。。不过应该都能提升的
123下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版