STM32F系列transfer_callback函数和transfer_request函数具体区别是什么

2019-07-14 14:37发布

在中断函数中触发输入输出中断后,判定为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......
想请教下这两个函数和速率的问题,还有这个计算传输大小和包个数的公式是怎么理解呢?如果对问题还有疑问,本人会及时回应,拜托大家了,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
wang222221
1楼-- · 2019-07-15 10:09
peternie 发表于 2019-1-14 22:09
接口芯片不是外接,而是集成到控制器中的

我只是说如果集成的速度你觉得不够用,可以考虑换用外接的。
peternie
2楼-- · 2019-07-15 15:49
wang222221 发表于 2019-1-14 22:17
我只是说如果集成的速度你觉得不够用,可以考虑换用外接的。

这样啊,不过集成的速率是有很大的提升空间,现在一直在做这个优化速率的工作,就像一楼的问题,通过修改该处,还有协议栈的其他地方,现在设备写速率能有40MB/s左右,但会有丢包现象。。。设备读速率还没改这个地方,速率只有3MB/s。。。不过应该都能提升的
peternie
3楼-- · 2019-07-15 20:23
 精彩回答 2  元偷偷看……
hnllyhsh
4楼-- · 2019-07-15 23:02
peternie 发表于 2019-1-14 22:09
接口芯片不是外接,而是集成到控制器中的

貌似ST有“on-chip Hi-speed PHY ”的只有F7X2、F7X3系列,其它都是Full-speed的PHY,极速就是12Mbit/S,你用的那颗芯片?你靠dd报告的速度可信吗?为啥不是MCU来统计结果回传?
peternie
5楼-- · 2019-07-16 01:27
高速丢包这个有可能是电路的干扰造成,这块要通过软件硬件综合分析。选择一个最合适的速度。追求速度软硬件各项成本开销都有
peternie
6楼-- · 2019-07-16 06:05
hnllyhsh 发表于 2019-1-14 23:02
貌似ST有“on-chip Hi-speed PHY ”的只有F7X2、F7X3系列,其它都是Full-speed的PHY,极速就是12Mbit/S,你用的那颗芯片?你靠dd报告的速度可信吗?为啥不是MCU来统计结果回传?

芯片似乎用的是3500,至于速率,因为缺少Windows下的驱动,只能接在linux主机上,但在linux主机上能测试虚拟串口的工具似乎没找到。。。你有推荐的吗?

一周热门 更多>