打印

usb参考资料的疑问

[复制链接]
3360|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fangui|  楼主 | 2009-7-5 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问香主,附件是我看到的关于USB缓冲区地址的描述,有些疑问,USB有缓冲区描述表地址寄存器USB_BTABLE,又有发送/接收缓冲区地址寄存器(如附件),有地址偏移,又有USB本地地址,呵呵,我都不知道他们的关系是怎么样的,能跟我说说么?
   我在mass_storage的例程里看到了一个定义
/* EP2  */
/* Rx buffer base address */
#define ENDP2_RXADDR        (0xD8)

在void Mass_Storage_Out (void)
这个函数里有调用:
  PMAToUserBufferCopy(Bulk_Data_Buff, ENDP2_RXADDR, Data_Len);
而函数PMAToUserBufferCopy(Bulk_Data_Buff, ENDP2_RXADDR, Data_Len)的原型如下:
void PMAToUserBufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes)
{
  u32 n = (wNBytes + 1) >> 1;/* /2*/
  u32 i;
  u32 *pdwVal;
  pdwVal = (u32 *)(wPMABufAddr * 2 + PMAAddr);
  for (i = n; i != 0; i--)
  {
    *(u16*)pbUsrBuf++ = *pdwVal++;
    pbUsrBuf++;
  }
}
我想问的就是我如何知道ENDP2_RXADDR的地址就是0xD8*2+0x40006000L呢,它们是如何对应过来的呢?而如果我要定义ENDP2_TXADDR的话,它的地址又是多少呢?
沙发
fangui|  楼主 | 2009-7-6 09:37 | 只看该作者

没人回答么?

使用特权

评论回复
板凳
vigia| | 2009-7-6 10:04 | 只看该作者

RX

USB不同的应用需要使用到的端点数和端点数据长度各不相同,如果为每个端点都单独规划一个存储区非常浪费。

所以STM32为USB模块提供了共512个字节的存储区,至于如何为每个端点分配使用这512B的空间,就是用户自己的事情了,这样存储区的分配就非常经济灵活。这512B空间的首地址是0x40006000。

你看到的#define ENDP2_RXADDR        (0xD8),这个0xD8就是在这512B空间里的偏移地址,说明端点2收到的数据将放在0x40006000 + 0xD8 * 2的地址空间里。至于为什么要×2,是因为这部分存储区是按照2字节访问的,即每存放1个字节的数据要占据2个字节的空间。所以这段存储区的地址是从0x40006000到0x400063FF。

至于如何定义端点2的发送缓冲区,就看你的应用了。你把端点2的接受缓冲区定义在0xd8,如果端点2的接收数据长度是64个字节,那就要为端点2的接收保留64个字节,端点2的发送缓冲区就要定义到0xd8+64之后的空间。
即:#define ENDP2_TXADDR        (0xD8+64),
当然也可以#define ENDP2_TXADDR        (0xD8+100)或是其他。

总之如何分配这段存储区,完全可以按照你应用的需求来做。

使用特权

评论回复
地板
fangui|  楼主 | 2009-7-6 10:19 | 只看该作者

Thanks

使用特权

评论回复
5
lut1lut| | 2009-7-6 10:45 | 只看该作者

答案你自己不是都贴出来了么

1. #define ENDP2_RXADDR    (0xD8)定义在缓冲区描述表里的

2. #define PMAAddr  (0x40006000L) Packet Memory的基地址

3. 如上图附件中“供应用程序使用的分组缓冲区地址需要乘以2,才能得到缓冲区在微控制器中的地址”


回帖太慢了,不好意思哦 -_-!!

使用特权

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

本版积分规则

29

主题

87

帖子

0

粉丝