USB倾情奉献(注释版)

2019-07-21 02:36发布

 花了一个多月,终于学会了USB,呵呵,感觉还是蛮头疼的,希望新手能够耐心的看,时间长了,自然就懂了, 1、STM32里面,USB设备是怎么接受USB主机发送的各种请求?接受以后存放在哪里??
答:根据地址和端点来接收请求,接收后一般存放在缓冲区,STM32芯片就有一个USB和CAN共享的专用缓冲区。即缓冲区描述表在USB_core.c下的u8 Setup0_Process(void)函数里面可以看到,刚开始的时候,看到了也不懂,现在懂了^_^
2、(*(volatile unsigned long *)
答:不懂的看这个http://www.openedv.com/posts/list/918.htm
3、USB的IO口需不需要复用,如果要复用,怎么设置呢?没发现手册上有讲啊,而且那2个口,PA11,PA12默认是IO口啊!怎么设置呢
答:在此部分代码用于实现我们在硬件设计部分提到的功能,USB的配置通过三个函数完成:USB_Interrupts_Config()、Set_USBClock()和USB_Init(),第一个函数用于设置USB唤醒中断和USB低优先级数据处理中断,Set_USBClock函数用于 配置USB时钟,也就是从72M的主频得到48M的USB时钟(1.5分频)。最后USB_Init()函数用于初始化USB,最主要的就是调用了Joystick_init函数,开启了USB部分的电源等。这里需要特别说明的是,USB配置并没有对PA11和PA12这两个IO口进行设置,是因为,一旦开启了USB电源(USB_CNTR的PDWN位清零)PA11和PA12将不再作为其他功能使用,仅供USB使用,所以在开启了USB电源之后不论您怎么配置这两个IO口,都是无效的。要在此获取这两个IO口的配置权,则需要关闭USB电源,也就是置位USB_CNTR的PDWN位。 
有什么问题,大家自己多思考下,这是我学习时候的问题,

http://www.openedv.com/posts/list/411.htm
这个帖子好像没人去看过。其实这个帖子对刚接触USB的新手有很大的帮助啊!
很多人都在学习USB,不妨大家拿出些心得,帮帮忙我们这些菜鸟吧!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
正点原子
1楼-- · 2019-07-21 05:48
 精彩回答 2  元偷偷看……
yaocp86
2楼-- · 2019-07-21 08:52

一连接,USB设备接受复位信号,发生USB复位时,USB模块进入前面章节中描述过的系统复位状态:所有端点的通信都被禁止(USB模块不会响应任何分组)。在USB复位后,USB模块被使能,同时地址为0的默认控制端点(端点0)也需要被使能。这可以通过配置USB_DADDR寄存器的EF位,EP0R寄存器和相关的分组缓冲区来实现。在USB设备的枚举阶段,主机将分配给设备一个唯一的地址,这个地址必须写入USB_DADDR寄存器的ADD[6:0]位中,同时配置其他所需的端点。
当复位中断产生时,应用程序必需在中断产生后的10ms之内使能端点0的传输。(端点0是控制传输)
控制传输由3个阶段组成,首先是主机发送SETUP分组的SETUP阶段,然后是主机发送零个或多个数据的数据阶段,最后是状态阶段,由与数据阶段方向相反的数据分组构成。SETUP传输只发生在控制端点,它非常类似于OUT分组的传输过程。使能SETUP传输除了需要分别初始化DTOG_TX位为’1’,DTOG_RX位为’0’外,还需要设置STAT_TX位和STAT_RX位为10(NAK),由应用程序根据SETUP分组的相应字段决定后面的传输是IN还是OUT。控制端点在每次发生CTR_RX中断时,都必须检查USB_EpnR寄存器的SETUP位,以识别是普通的OUT分组还是SETUP分组。USB设备应该能够通过SETUP分组中的相应数据决定数据阶段传输的字节数和方向,并且能在发生错误的情况下发送STALL分组,拒绝数据的传输。因此在数据阶段,未被使用到的方向都应该被设置成STALL,并且在开始传输数据阶段的最后一个数据分组时,其反方向的传输仍设成NAK状态,这样,即使主机立刻改变了传输方向(进入状态阶段),仍然可以保持为等待控制传输结束的状态。在控制传输成功结束后,应用程序可以把NAK变为VALD,如果控制传输出错,就改为STALL。此时,如果状态分组是由主机发送给设备的,那么STATUS_OUT位(USB_EPnR寄存器中的EP_KIND)应该被置位,只有这样,在状态传输过程中收到了非零长度的数据分组,才会产生传输错误。在完成状态传输阶段后,应用程序应该清除STATUS_OUT位,并且将STAT_RX设为VALID表示已准备好接收一个新的命令请求,STAT_TX则设为NAK,表示在下一个SETUP分组传输完成前,不接受数据传输的请求。
USB规范定义SETUP分组不能以非ACK握手分组来响应,如果SETUP分组传输失败,则会引发下一个SETUP分组。因此,以NAK或STALL分组响应主机的SETUP分组是被禁止的。
当STAT_RX位被设置为’01’(STALL)或’10’(NAK)时,如果收到SETUP分组,USB模块会接收分组,开始分组所要求的数据传输,并回送ACK握手分组。如果应用程序在处理前一个CTR_RX事件时USB模块又收到了SETUP分组(即CTR_RX仍然保持置位),USB模块会丢掉收到的SETUP分组,并且不回答任何握手分组,以此来模拟一个接收错误,迫使主机再次发送SETUP分组。这样做是为了避免丢失紧随一次CTR_RX中断之后的又一个SETUP分组传输。
(控制传输的程序,可以在usb_core.c中看到,)
我想,这样的话,大家应该基本懂USB了,USB协议的第九章,如果你想弄懂USB,必看,
程序里面对应的in或者out 都是对应USB主机来说的,in:设备传输数据给主机,out:主机输出给设备,
对USB枚举有疑问的,可以买本圈圈 的书看看,或者,看下面的USB硬件设计(个人感觉这个对USB学习蛮有帮助的)
如果还有疑问,提出来吧,对于基础的,我可以回答,太深奥了就无能为了,

yaocp86
3楼-- · 2019-07-21 14:00
 精彩回答 2  元偷偷看……
smy096
4楼-- · 2019-07-21 18:23
谢谢哈~~ 俺想玩玩USB采集卡,可惜实力不够,学习了~~
正点原子
5楼-- · 2019-07-22 00:10
粉猪好久没来了,呵呵.
Dream
6楼-- · 2019-07-22 04:21
一直在关注呢!!!

一周热门 更多>