打印
[应用相关]

STM32 USB

[复制链接]
1197|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
USB主要特征 :
1.符合USB2.0全速设备的技术规范
2.可配置1到8个USB端点
3.CRC(循环冗余校验)生成/校验,反向不归零(NRZI)编码/解码和位填充
4.支持同步传输
5.支持批量/同步端点的双缓冲区机制
6.支持USB挂起/恢复操作
7. 帧锁定时钟脉冲生成



使用特权

评论回复
沙发
dingbo95|  楼主 | 2019-8-30 20:10 | 只看该作者
USB和CAN共用一个专用的512字节的SRAM存储器用于数据的发送和接收,因此不能同时使用
USB和CAN(共享的SRAM被USB和CAN模块互斥地访问)。 USB和CAN可以同时用于一个应用
中但不能在同一个时间使用。

使用特权

评论回复
板凳
dingbo95|  楼主 | 2019-8-30 20:11 | 只看该作者
USB外设的方框图

使用特权

评论回复
地板
dingbo95|  楼主 | 2019-8-30 20:12 | 只看该作者
USB模块为PC主机和微控制器所实现的功能之间提供了符合USB规范的通信连接。 PC主机和
微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被USB外
设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小
所决定,每个端点最大可使用512字节缓冲区,最多可用于16个单向或8个双向端点。 USB模块
同PC主机通信,根据USB规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处
理。整个传输的格式由硬件完成,其中包括CRC的生成和校验。

使用特权

评论回复
5
dingbo95|  楼主 | 2019-8-30 20:13 | 只看该作者
每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数。
当USB模块识别出一个有效的功能/端点的令牌分组时, (如果需要传输数据并且端点已配置)随
之发生相关的数据传输。 USB模块通过一个内部的16位寄存器实现端口与专用缓冲区的数据交
换。在所有的数据传输完成后,如果需要,则根据传输的方向,发送或接收适当的握手分组。
在数据传输结束时, USB模块将触发与端点相关的中断,通过读状态寄存器和/或者利用不同的
中断处理程序,微控制器可以确定:

使用特权

评论回复
6
dingbo95|  楼主 | 2019-8-30 20:14 | 只看该作者
USB模块对同步传输和高吞吐量的批量传输提供了特殊的双缓冲区机制,在微控制器使用一个
缓冲区的时候,该机制保证了USB外设总是可以使用另一个缓冲区。
在任何不需要使用USB模块的时候,通过写控制寄存器总可以使USB模块置于低功耗模式
(SUSPEND模式)。在这种模式下,不产生任何静态电流消耗,同时USB时钟也会减慢或停止。
通过对USB线上数据传输的检测,可以在低功耗模式下唤醒USB模块。也可以将一特定的中断
输入源直接连接到唤醒引脚上,以使系统能立即恢复正常的时钟系统,并支持直接启动或停止
时钟系统。

使用特权

评论回复
7
dingbo95|  楼主 | 2019-8-30 20:14 | 只看该作者
串行接口控制器(SIE):该模块包括的功能有:帧头同步域的识别,位填充, CRC的产生和
校验, PID的验证/产生,和握手分组处理等。它与USB收发器交互,利用分组缓冲接口提
供的虚拟缓冲区存储局部数据。它也根据USB事件,和类似于传输结束或一个包正确接收
等与端点相关事件生成信号,例如帧首(Start of Frame), USB复位,数据错误等等,这些
信号用来产生中断。

使用特权

评论回复
8
dingbo95|  楼主 | 2019-8-30 20:15 | 只看该作者
定时器:本模块的功能是产生一个与帧开始报文同步的时钟脉冲,并在3ms内没有数据传输
的状态,检测出(主机的)全局挂起条件。

使用特权

评论回复
9
dingbo95|  楼主 | 2019-8-30 20:15 | 只看该作者
分组缓冲器接口:此模块管理那些用于发送和接收的临时本地内存单元。它根据SIE的要求
分配合适的缓冲区,并定位到端点寄存器所指向的存储区地址。它在每个字节传输后,自
动递增地址,直到数据分组传输结束。它记录传输的字节数并防止缓冲区溢出。

使用特权

评论回复
10
dingbo95|  楼主 | 2019-8-30 20:18 | 只看该作者
端点相关寄存器:每个端点都有一个与之相关的寄存器,用于描述端点类型和当前状态。
对于单向和单缓冲器端点,一个寄存器就可以用于实现两个不同的端点。一共8个寄存器,
可以用于实现最多16个单向/单缓冲的端点或者7个双缓冲的端点或者这些端点的组合。例
如,可以同时实现4个双缓冲端点和8个单缓冲/单向端点。

使用特权

评论回复
11
dingbo95|  楼主 | 2019-8-30 20:19 | 只看该作者
控制寄存器:这些寄存器包含整个USB模块的状态信息,用来触发诸如恢复,低功耗等USB事件。
中断寄存器:这些寄存器包含中断屏蔽信息和中断事件的记录信息。配置和访问这些寄存器可以获取中断源,中断状态等信息,并能清除待处理中断的状态标志。
分组缓冲区:数据分组缓存在分组缓冲区中,它由分组缓冲接口控制并创建数据结构。应用软件可以直接访问该缓冲区。它的大小为512字节,由256个16位的字构成。

使用特权

评论回复
12
dingbo95|  楼主 | 2019-8-30 20:20 | 只看该作者
仲裁器:该部件负责处理来自APB1总线和USB接口的存储器请求。它通过向APB1提供较高的访问优先权来解决总线的冲突,并且总是保留一半的存储器带宽供USB完成传输。它
采用时分复用的策略实现了虚拟的双端口SRAM,即在USB传输的同时,允许应用程序访问存储器。此策略也允许任意长度的多字节APB1传输。
寄存器映射单元:此部件将USB模块的各种字节宽度和位宽度的寄存器映射成能被APB1寻址的16位宽度的内存集合。
APB1封装:此部件为缓冲区和寄存器提供了到APB1的接口,并将整个USB模块映射到APB1地址空间.

使用特权

评论回复
13
dingbo95|  楼主 | 2019-8-30 20:34 | 只看该作者
中断映射单元:将可能产生中断的USB事件映射到三个不同的NVIC请求线上:
─ USB低优先级中断(通道20):可由所有USB事件触发(正确传输, USB复位等)。固件在处
理中断前应当首先确定中断源。
─ USB高优先级中断(通道19):仅能由同步和双缓冲批量传输的正确传输事件触发,目的是
保证最大的传输速率。
─ USB唤醒中断(通道42):由USB挂起模式的唤醒事件触发。

使用特权

评论回复
14
dingbo95|  楼主 | 2019-8-30 20:50 | 只看该作者
发生系统复位或者上电复位时,应用程序首先需要做的是提供USB模块所需要的时钟信号,然
后清除复位信号,使程序可以访问USB模块的寄存器。复位之后的初始化流程如下所述:
首先,由应用程序激活寄存器单元的时钟,再配置设备时钟管理逻辑单元的相关控制位,清除
复位信号。

使用特权

评论回复
15
dingbo95|  楼主 | 2019-8-30 21:00 | 只看该作者
必须配置CNTR寄存器的PDWN位用以开启USB收发器相关的模拟部分,这点需要特别
的处理。此位能打开为端点收发器供电的内部参照电压。由于打开内部电压需要一段启动时间
(数据手册中的tSTARTUP),在此期间内USB收发器处于不确定状态,所以在设置CNTR寄存器的
PDWN后必需等待一段时间之后,才能清除USB模块的复位信号(清除CNTR寄存器上的FRES
位),和ISTR寄存器的内容,以便在使能其他任何单元的操作之前清除未处理的假中断标志。

使用特权

评论回复
16
dingbo95|  楼主 | 2019-8-30 21:01 | 只看该作者
最后,应用程序需要通过配置设备时钟管理逻辑的相应控制位来为USB模块提供标准所定义的
48MHz时钟。当系统复位时,应用程序应该初始化所有需要的寄存器和分组缓冲区描述表,使USB模块能够
产生正常的中断和完成数据传输。所有与端点无关的寄存器需要根据应用的需求进行初始化(比
如中断使能的选择,分组缓冲区地址的选择等)。接下来按照USB复位处理

使用特权

评论回复
17
dingbo95|  楼主 | 2019-8-30 21:30 | 只看该作者
发生USB复位时, USB模块进入前面章节中描述过的系统复位状态:所有端点的通信都被禁止
(USB模块不会响应任何分组)。在USB复位后, USB模块被使能,同时地址为0的默认控制端点
(端点0)也需要被使能。这可以通过配置USB_DADDR寄存器的EF位, EP0R寄存器和相关的分
组缓冲区来实现。在USB设备的枚举阶段,主机将分配给设备一个唯一的地址,这个地址必须
写入USB_DADDR寄存器的ADD[6:0]位中,同时配置其他所需的端点。当复位中断产生时,应用程序必需在中断产生后的10ms之内使能端点0的传输。

使用特权

评论回复
18
dingbo95|  楼主 | 2019-8-30 21:32 | 只看该作者
每个双向端点都可以接收或发送数据。接收到的数据存储在该端点指定的专用缓冲区内,而另
一个缓冲区则用于存放待发送的数据。对这些缓冲区的访问由分组缓冲区接口模块实现,它提
出缓冲区访问请求,并等待确认信息后返回。为防止产生微控制器与USB模块对缓冲区的访问
冲突,缓冲区接口模块使用仲裁机制,使APB1总线的一半周期用于微控制器的访问,另一半保
证USB模块的访问。这样,微控制器和USB模块对分组缓冲区的访问如同对一个双端口SRAM
的访问,即使微控制器连续访问缓冲区,也不会产生访问冲突。USB模块使用固定的时钟,此时钟被USB标准定义为48MHz。 APB1总线的时钟可以大于或者小
于这个频率。

使用特权

评论回复
19
dingbo95|  楼主 | 2019-8-30 21:40 | 只看该作者
初始化端点的第一步是把适当的值写到ADDRn_TX或ADDRn_RX寄存器中,以便USB模块能找
到要传输的数据或准备好接收数据的缓冲区。 USB_EpnR寄存器的EP_TYPE位确定端点的基本
类型, EP_KIND位确定端点的特殊特性。作为发送方,需要设置USB_EpnR寄存器的STAT_TX
位来使能端点,并配置COUNTn_TX位决定发送长度。作为接收方,需要设置STAT_RX位来使
能端点,并且设置BL_SIZE和NUM_BLOCK位,确定接收缓冲区的大小,以检测缓冲区溢出的
异常。对于非同步非双缓冲批量传输的单向端点,只需要设置一个传输方向上的寄存器。一旦
端点被使能,应用程序就不能再修改USB_EpnR寄存器的值和ADDRn_TX / ADDRn_RX,
COUNTn_TX / COUNTn_RX所在的位置,因为这些值会被硬件实时修改。当数据传输完成时,
CTR中断会产生,此时上述寄存器可以被访问,并重新使能新的传输

使用特权

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

本版积分规则

52

主题

1197

帖子

5

粉丝