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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版