本帖最后由 lxyppc 于 2012-2-13 13:35 编辑
疑問是关于OTG设备库的
在otgd_fs_int.c这个库文件中定义了一个名为USBD_Data_Buffer的缓冲
在中断函数OTGD_FS_Handle_RxStatusQueueLevel_ISR中
所有ep在接收时都会将数据写到这个buffer中
疑問如下
1. 这个buffer的大小为RX_FIFO_SIZE字节,而RX_FIFO的单位是32-Bit words(见RM0008 Rev12, 28.16.2 - OTG_FS_GRXFSIZ) 。为什么库会用RX_FIFO_SIZE来定义一个缓冲的大小,而没有x4。
2. 所有的Ep在接收时都使用这个buffer。一次bulk传输可能由多个frame的数据组成。在这多个frame中如果加入了一次interrupt传输,那么这次interrupt传输的数据是否会影响到最終bulk的数据
以上的疑問在不改动STM32 USB库的情况下是不会出任何问题的,因为库函数将int和bulk类型的传输中断频率定死在了64bytes,不会出现interrupt打断bulk数据内容的情况。
但是这样会导致另一个疑問,如下:
在USB_SIL_Read的Connective Line版本的实现代码如下,
USB_OTG_EP *ep;
/* Get the structure pointer of the selected Endpoint */
ep = PCD_GetOutEP(bEpAddr);
/* Get the number of received data */
DataLength = ep->xfer_len;
/* Use the PCD interface layer function to read the selected endpoint */
PCD_EP_Read (bEpAddr, pBufferPointer, DataLength);
DataLength传给了PCD_EP_Read函数
PCD_EP_Read函数会通过OTGD_FS_EPStartXfer重新设置ep的接收长度
而ep接收长度会由这个DataLength决定,这也决定了ep在收到多少数据会产生一次中断(见RM0008 28.16.4 OTG_FS_DIEPTSIZx中对XFRSIZ的描述)
从逻辑上讲,ep中断的长度不应该由这个DataLength决定
比如说我有一个bulk的ep,最开始设置中断长度为256,这样我在收到256或少于256的数据时会产生一次中断,调用epx_out_callback函数。
但是有一次我的数据不到256,只有一个byte,这时库函数会将这个大小调整为ep的maxpacket,对bulk的ep,值为64。并且以后都只能在收到64bytes数据时就产生一个中断,改变了我之前设置的状态。 |