STM32F4 HAL库USB 多包数据传输

2019-07-20 03:38发布

我需要用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多包传输的朋友。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
sammy902583
1楼-- · 2019-07-20 05:10
几何物联 发表于 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.

几何物联
2楼-- · 2019-07-20 06:55
 精彩回答 2  元偷偷看……
sammy902583
3楼-- · 2019-07-20 12:21
 精彩回答 2  元偷偷看……
几何物联
4楼-- · 2019-07-20 13:33
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传输的相关资料,但几乎没找到什么有用信息。
几何物联
5楼-- · 2019-07-20 16:49
 精彩回答 2  元偷偷看……

一周热门 更多>