[STM32F4] STM32F4 HAL库USB 多包数据传输

[复制链接]
2936|7
 楼主| Marco-Marco 发表于 2019-2-23 20:00 | 显示全部楼层 |阅读模式
我需要用STM32F429通过USB上传一张2-3Mbyte图片,根据HID的例程修改,通过USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, data_to_send, 64)函数每次上传64个字节一个包一个包地传。找到的例程基本就是用这个发送函数发送一个小于64字节的包。如果单独这样一个包一个包地循环发送,丢包会很严重,如果每个包发送中间加1ms的延时,则不会丢包。但传送效率大受影响。各方面搜索了下。说是有2种思路,一种是每一个包发送完成后会产生一个中断,函数进入EP1_IN_Callback回调函数在里面加一个标志位。但HAL库里面没有找到相应的回调函数。第二个方法是说每一个包发送前去判断是否收到主机发送的IN 令牌。  但我尝试在每次发包前去判断OTG_FS_DIEPINT1寄存器的ITTXFE位,也没有什么效果。所以请教下有用过HAL库做过USB多包传输的朋友。
小明的同学 发表于 2019-2-24 09:35 | 显示全部楼层
看看可不可以将包容量变大
小明的同学 发表于 2019-2-24 10:14 | 显示全部楼层
每个包发送完是不是有个标志位,你通过这个标志位控制。
 楼主| Marco-Marco 发表于 2019-2-24 13:54 | 显示全部楼层
小明的同学 发表于 2019-2-24 10:14
每个包发送完是不是有个标志位,你通过这个标志位控制。

就是在一直找这个标志位哈,测试了OTG_HS_DIEPINT1寄存器的ITTXFE(Bit 4 ITTXFE: IN token received when TxFIFO is empty
Applies to non-periodic IN endpoints only.
Indicates that an IN token was received when the associated TxFIFO (periodic/non-periodic)
was empty. This interrupt is asserted on the endpoint for which the IN token was received.). 就是在每一次发送前确保这个ITTXFE置1,用BUS HOUND仍然丢包严重。
 楼主| Marco-Marco 发表于 2019-2-24 17:08 | 显示全部楼层
今天周日又看了一天。基本得出结论需要通过bulk传输的方式。HID默认用中断传输,每一次主机过来轮询最快也要1ms.现在正在专注基于CDC这块例程来修改,暂时按这个帖子走。http://www.stm32cube.com/article/178。有进一步结果我会更新。
 楼主| Marco-Marco 发表于 2019-2-24 23:01 | 显示全部楼层
自问自答吧,https://bbs.21ic.com/icview-811704-1-1.html这篇**很好地解决了我的问题。采用CDC(虚拟串口)传输。实测也确实达到了860KB/s.
1223657347 发表于 2019-2-26 09:56 | 显示全部楼层
自定义USB设备类+WinUSB做驱动,想怎么传输就怎么传输
wakayi 发表于 2019-3-7 10:55 | 显示全部楼层
每包的容量是有上限的吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

155

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部