OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4803|回复: 5

STM32F4 HAL库USB 多包数据传输

[复制链接]

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-11-27
在线时间
21 小时
发表于 2019-2-23 20:02:27 | 显示全部楼层 |阅读模式
37金钱
我需要用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多包传输的朋友。

最佳答案

查看完整内容[请看2#楼]

如果您要Host收完立刻再送的话: /** * @brief USBD_CUSTOM_HID_DataIn * handle data IN Stage * @param pdev: device instance * @param epnum: endpoint index * @retval status */ static uint8_t USBD_CUSTOM_HID_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) { /* Ensure that the FIFO is empty before a new transfer, this condition ...
专注以传感器应用和物联网为主的电子开发www.jhe-iot.com
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2019-2-23 20:02:28 | 显示全部楼层
几何物联 发表于 2019-2-23 20:03
我需要用STM32F429通过USB上传一张2-3Mbyte图片,根据HID的例程修改,通过USBD_CUSTOM_HID_SendReport(&hUs ...

如果您要Host收完立刻再送的话:

/**
  * @brief  USBD_CUSTOM_HID_DataIn
  *         handle data IN Stage
  * @param  pdev: device instance
  * @param  epnum: endpoint index
  * @retval status
  */
static uint8_t  USBD_CUSTOM_HID_DataIn (USBD_HandleTypeDef *pdev,
                              uint8_t epnum)
{
  
  /* Ensure that the FIFO is empty before a new transfer, this condition could
  be caused by  a new transfer before the end of the previous transfer */
  ((USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassData)->state = CUSTOM_HID_IDLE;

//
// 在这个地方加代码SendReport()
//


  return USBD_OK;
}


HID用Interrupt endpoint本来就比较慢, 高速传输通常会用用Bulk transfer.

回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-11-27
在线时间
21 小时
 楼主| 发表于 2019-2-23 20:03:02 | 显示全部楼层
我需要用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多包传输的朋友。
专注以传感器应用和物联网为主的电子开发www.jhe-iot.com
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2019-2-24 10:29:21 | 显示全部楼层
另外在Descriptor的地方找

  0x20,        /* bInterval: Polling Interval (20 ms) */


试试看把这个数值设小一点, 有没有用.

回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-11-27
在线时间
21 小时
 楼主| 发表于 2019-2-24 14:28:21 | 显示全部楼层
sammy902583 发表于 2019-2-24 10:26
如果您要Host收完立刻再送的话:

/**

感谢回复。按您的方法把sendReport函数放到USBD_CUSTOM_HID_DataIn 函数里面去发,没有丢包。但是时间上太慢。效果和我在void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)回调函数里面加个标志位,然后使用sendreport函数前判断这个标志位是一样的结果和速度。然后您说的0x20,        /* bInterval: Polling Interval (20 ms) */这个值我之前就改为了0x01. 经过测试计算基本上每个包之间确实是延时了大概1ms.  所以我想bulk传输是唯一的方法就是用bulk传输了。您这边是否有用HAL库开发设置Bulk传输的相关资料或者建议。其实我之前就已经百度了相关STM32 bulk传输的相关资料,但几乎没找到什么有用信息。
专注以传感器应用和物联网为主的电子开发www.jhe-iot.com
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-11-27
在线时间
21 小时
 楼主| 发表于 2019-2-24 23:03:06 | 显示全部楼层
本帖最后由 几何物联 于 2019-2-24 23:46 编辑

微信图片_20190224235355.png 自问自答吧,http://bbs.21ic.com/icview-811704-1-1.html这篇文章很好地解决了我的问题。采用CDC(虚拟串口)传输。实测也确实达到了860KB/s.
专注以传感器应用和物联网为主的电子开发www.jhe-iot.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 02:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表