打印

对STM32F10X的USB库的疑問

[复制链接]
5257|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxyppc|  楼主 | 2012-2-13 13:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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数据时就产生一个中断,改变了我之前设置的状态。
沙发
airwill| | 2012-2-13 15:39 | 只看该作者
RX_FIFO_SIZE 用字节而不是用 word(4字节为单位)来定义一个缓冲的大小,我估计还是为了快速入门者。这样表示数据区比较接近习惯.(作为缓冲区, 大都习惯以字节为单位来说明缓冲大小)

使用特权

评论回复
板凳
lxyppc|  楼主 | 2012-2-14 10:14 | 只看该作者
其实我的疑问是这样才生的
在一个项目中,我使用bulk传输
我不想每收到64字节数据便产生一个EPx_out_callback中断,我想让他收到1024个字节数据才产生中断
深入了解之后发现STM32的芯片支持这样的动作,但是ST的库不能支持:dizzy:
改动库的一些代码之后支持了,但是又会出现上述的问题.

使用特权

评论回复
地板
SEASON3| | 2012-2-14 14:32 | 只看该作者
其实我的疑问是这样才生的
在一个项目中,我使用bulk传输
我不想每收到64字节数据便产生一个EPx_out_callback中断,我想让他收到1024个字节数据才产生中断
深入了解之后发现STM32的芯片支持这样的动作,但是ST的库不能 ...
lxyppc 发表于 2012-2-14 10:14


全速设备不支持最大1024字节的端点缓冲吧,所以出现这种问题

使用特权

评论回复
5
lxyppc|  楼主 | 2012-2-14 17:11 | 只看该作者
全速设备不支持最大1024字节的端点缓冲吧,所以出现这种问题
SEASON3 发表于 2012-2-14 14:32


MaxPacket的大小还是64,也就是你说的端点缓冲还是64 bytes
由于STM32的OTG作设备时有FIFO存在,因此可以在bulk数据传输完成之后才产生一次中断
而一次bulk数据的传输可以包含多个这样的64 bytes packet
也就是USB Spec上说的
"a bulk transfer is one or more IN/OUT data transactions"

使用特权

评论回复
6
lxyppc|  楼主 | 2012-2-16 09:30 | 只看该作者
本帖最后由 lxyppc 于 2012-2-16 09:32 编辑

关注一下这个帖子的问题4
https://my.st.com/public/STe2eco ... F5B¤tviews=22

官网上的一个帖子
USB FS Device Driver question

使用特权

评论回复
7
SEASON3| | 2012-2-20 14:51 | 只看该作者
5# lxyppc

学习了,继续关注

使用特权

评论回复
8
penguin_cc| | 2012-5-30 14:48 | 只看该作者
跟我遇到的情况是一样的,但是我没有用OTG,就是普通的USB,我用的是Masstorage的例程,发现在发送数据的时候,设置缓冲区长度的时候SetTxCount()的长度只能设为64字节,很是不理解,不是BULK传输么?为什么还要每64字节中断一次呢?

使用特权

评论回复
9
lxyppc|  楼主 | 2012-5-30 15:20 | 只看该作者
8# penguin_cc 对于不是OTG的设备,没有FIFO
所以只能设置为最多64字节

使用特权

评论回复
10
vigia| | 2012-5-30 17:20 | 只看该作者
对于105,107芯片

我建议用stm32_f105-07_f2_f4_usb-host-device_lib v2.1.0版本的库函数

3.3.0版本的很久没有更新过了

使用特权

评论回复
11
sinadz| | 2012-5-30 19:06 | 只看该作者
LZ思考问题还是很深入的

使用特权

评论回复
12
xieshifu| | 2014-10-22 14:49 | 只看该作者
MARK

使用特权

评论回复
13
zhang849920| | 2015-3-20 10:36 | 只看该作者
MARK

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:代码发BBS不好看?你需要它 代码着色https://bbs.21ic.com/icview-135254-1-1.html

27

主题

2249

帖子

19

粉丝