打印

关于STM32F102/103的USB模块和USB库函数

[复制链接]
楼主: vigia
手机看帖
扫描二维码
随时随地手机跟帖
61
lirui5528| | 2011-7-16 20:52 | 只看该作者 回帖奖励 |倒序浏览
学习了。

使用特权

评论回复
62
秋天落叶| | 2011-7-17 11:31 | 只看该作者
讲的很好

使用特权

评论回复
63
heyuanpi| | 2011-9-25 14:56 | 只看该作者
mark

使用特权

评论回复
64
ringsearch| | 2011-9-26 12:11 | 只看该作者
楼主的讲解很不错,最近刚好再用STM32的USB,但遇到了个疑问,在usb_core.c文件的Setup0_Process(void)这个函数中,有这么一段:
if (pInformation->ControlState != PAUSE)
  {
    pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */
    pInformation->USBbRequest = *pBuf.b++; /* bRequest */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwIndex  = ByteSwap(*pBuf.w++); /* wIndex */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwLength = *pBuf.w; /* wLength */
  }  其中不太明白为什么需要pBuf.w += offset;而且后面的解释也不太懂 /* word not accessed because of 32 bits addressing */
,我于是在这段之前加入调试以显示收到什么数
        #ifdef DEBUG
        UARTSend_String("***  端点0收到SETUP数据  ***\r\n");
        for(offset=0;offset<16;offset++)
        {
                UARTSend_Hex(*pBuf.b++);
        }
        #endif
结果串口调试显示如下:
***  USB总线复位  ***
***  USB总线CRT置位  ***
***  进入端点0  ***
***  端点0收到SETUP包  ***
***  端点0收到SETUP数据  ***
0x80 0x06 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x00

本来应该显示0x80 0x06 0x00 0x01 0x00 0x000x40 0x00才对,我不太明白怎么0x80 0x06和0x00 0x01 后面多了两个 0x00 ,难道USB模块还会将收到的数据跳着放吗?具体模块中是怎么存放收到的数据的,谁能讲解下吗?

使用特权

评论回复
65
ringsearch| | 2011-9-26 12:45 | 只看该作者
还有一个问题,在usb_men.c文件的void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)函数中,有这一句:pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr);那么每次*pdwVal++,pdwVal的地址都增加4个字节,这应该与APB1总线是32位寻址有关,那也就是说,每次从USB的包缓冲区中读取数据1个字节,对应的缓冲区在控制器中的地址每次跳4个字节,这样理解对吗?
该函数中有个for循环
  for (i = n; i != 0; i--)
  {
    *(uint16_t*)pbUsrBuf++ = *pdwVal++;
    pbUsrBuf++;
  }
这里面*(uint16_t*)pbUsrBuf++ ,那么pbUsrBuf++ 后地址是加上了2个字节,但是pbUsrBuf原先对应的数组是uint8_t定义的这样难道不应该*(uint8_t*)pbUsrBuf++ 吗?

使用特权

评论回复
66
香水城| | 2011-9-26 13:32 | 只看该作者
请LS可以看看STM32的USB缓冲区结构。它是每32位的地址空间中,只有16位有效数据。

使用特权

评论回复
67
ringsearch| | 2011-9-26 14:58 | 只看该作者
呵呵,查到了,开始没注意这个,USB缓冲区是一个双端口的RAM,CPU一端需要使用32位方式访问,但USB模块一端使用16位方式访问。每个USB模块中的地址*2才能对应到控制器中的实际地址,这样每四个字节地址空间后两个字节地址空间是空的。这里也对我第二个问题说明下,*(uint16_t*)pbUsrBuf++ = *pdwVal++;,++ 与指针*同优先级,至右向左结合,因此相当于*((uint16_t*)pbUsrBuf++) ,先*(uint16_t*)pbUsrBuf赋值只取*pdwVal++的32位数据的前16位,然后再将pbUsrBuf加上1个字节。这样定义的uint8_t数组的两个数组变量空间就被赋值了,所以*(uint16_t*)pbUsrBuf++ 之后还需要一次pbUsrBuf++;到下下个数组变量。与我第二个问题中提出的用uint8_t定义是错的。

使用特权

评论回复
68
sunlin0112_1| | 2011-9-27 09:43 | 只看该作者
感谢分享

使用特权

评论回复
69
woyaochenggong| | 2011-9-27 11:47 | 只看该作者
看完还是很有收获的,

使用特权

评论回复
70
woyaochenggong| | 2011-9-27 11:48 | 只看该作者
很细心,顶起来

使用特权

评论回复
71
xuxindd| | 2011-11-7 16:27 | 只看该作者
mark

使用特权

评论回复
72
huailove| | 2012-4-17 14:01 | 只看该作者
ding

使用特权

评论回复
73
无冕之王| | 2012-4-17 19:07 | 只看该作者
LZ讲解的很不错

使用特权

评论回复
74
pkat| | 2012-4-17 19:39 | 只看该作者
讲解的通俗易懂

使用特权

评论回复
75
jinguoju| | 2012-4-23 23:05 | 只看该作者
mark

使用特权

评论回复
76
liulwn| | 2012-4-24 23:52 | 只看该作者
mark

使用特权

评论回复
77
dayplover| | 2012-5-7 14:53 | 只看该作者
mark

使用特权

评论回复
78
gunzhusigan| | 2012-7-17 20:44 | 只看该作者
请楼主做的老师!你看需要多小学费!









SIGNATURE............................................................................................................................................................
滚珠丝杆|

使用特权

评论回复
79
21IC869943552| | 2012-7-18 16:58 | 只看该作者
:)看了这个,明白了好多

使用特权

评论回复
80
gaohuating| | 2012-7-26 17:29 | 只看该作者
学习学习

使用特权

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

本版积分规则