高级会员

- 积分
- 890
- 金钱
- 890
- 注册时间
- 2014-8-16
- 在线时间
- 193 小时
|
5金钱
手册上说由于APB1总线按32位寻址,那么位于缓冲区的缓冲区描述表也应该是32位的
当USB_BTABLE为0时,缓冲区描述表位于缓冲区的首地址 0x40006000
每4个字节存放一个地址寄存器,连续4个应该是16字节。
描述表的寻址方式,手册给了两种
那么地址偏移这个就可以看懂了。那么问题来了 相对于USB模块的USB本地地址到底是个什么玩意?
但是手册上又说供应用程序使用的分组缓冲区地址需要乘以2才能得到缓冲区在微控制器中的真正地址。这又怎么搞?
我看官方的库关于这个地址的算法是
#define _pEPTxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8 )*2 + PMAAddr))
那也就是使用USB本地地址寻址时候需要乘以2
用地址偏移是不是就不需要乘以2了?
就算是这样 那为什么BTABLE还需要乘以2?
还有一个疑问,缓冲区描述表里存放的地址能不能是USB缓冲区以外的内存区域?
[mw_shl_code=c,true]void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
{
uint32_t n = (wNBytes + 1) >> 1;/* /2*/
uint32_t i;
uint32_t *pdwVal;
pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr);
for (i = n; i != 0; i--)
{
*(uint16_t*)pbUsrBuf++ = *pdwVal++;
pbUsrBuf++;
}
}[/mw_shl_code]
这是另外一个问题,这段代码中是将PMA内存复制到用户buff 但是一个类型是16位一个类型是32位,这样不会丢失数据么?
|
最佳答案
查看完整内容[请看2#楼]
好吧 今天又看了一天 全都明白了
usb的缓冲区,由于是32位寻址,所以每次都是32位对其。usb将发送或者收到的数据按字处理,所以只用到了32位寻址的低16位,而且是低字节在前,所以才会有x2这么一说。因为要保证32位对齐。
也就是当读或写的时候会有16位类型的指针与32位类型的的指针,用户buff按16位寻址,usb缓冲区用32位寻址。
而usb本地地址,是相当于把每次的32位寻址当作是16位的,所以少了一倍。
也就是说虽然有51 ...
|