STM32的USB外设初窥

这几天在考虑项目是用USB还是用以太网,但是我们用的平台STM32F103ZET6好像没有Enternet这个外设,所以就先考虑USB吧。

USB外设的一大特点就是即插即用,之所以能够这样是因为USB协议规定在主机启动或是USB外设插入系统的时候都要对外设进行配置。这里所说的配置,就是按照USB协议在USB主机和USB设备之间进行一系列的问答过程。

这一问答过程是通过主机与USB设备的端点0进行通信完成的。USB设备在插入USB端点时,主机都通过默认地址0与USB设备的端点0进行通信。在这个过程中,主机发出一系列试图得到设备描述符的标准请求,通过这些请求,主机得到所有感兴趣的设备信息,从而知道了设备的情况以及如何与之通信。随后主机通过发出SetAddress请求为设备置一个唯一的地址。这样,配置过程就完成了。以后主机再与设备通信将使用专门的地址。有时设置完地址后,还可能要再获取一次描述符,然后再设定配置(SetConfiguration),之后才算完成对新插入USB总线设备的配置过程。

STM32的USB模块实现了标准USB接口的所有特性,它由以下部分组成:
 串行接口控制器(SIE):该模块包括的功能有:帧头同步域的识别,位填充,CRC的产生和校验,PID的验证/产生,和握手分组处理等。它与USB收发器交互,利用分组缓冲接口提供的虚拟缓冲区存储局部数据。它也根据USB事件,和类似于传输结束或一个包正确接收等与端点相关事件生成信号,例如帧首(Start of Frame),USB复位,数据错误等等,这些信号用来产生中断。
●  定时器:本模块的功能是产生一个与帧开始报文同步的时钟脉冲,并在3ms内没有数据传输的状态,检测出(主机的)全局挂起条件。

●  分组缓冲器接口:此模块管理那些用于发送和接收的临时本地内存单元。它根据SIE的要求分配合适的缓冲区,并定位到端点寄存器所指向的存储区地址。它在每个字节传输后,自动递增地址,直到数据分组传输结束。它记录传输的字节数并防止缓冲区溢出。需要注意的是,USB模块与CAN模块共用一块512bytes的缓冲池,也就是说不可以通过USB和CAN同时访问缓冲池。
●  端点相关寄存器:每个端点都有一个与之相关的寄存器,用于描述端点类型和当前状态。对于单向和单缓冲器端点,一个寄存器就可以用于实现两个不同的端点。一共8个寄存器,可以用于实现最多16个单向/单缓冲的端点或者7个组合。例如,可以同时实现4个双缓冲端点和8个单缓冲/单向端点。
●  控制寄存器:这些寄存器包含整个USB模块的状态信息,用来触发诸如恢复,低功耗等USB事件。
●  中断寄存器:这些寄存器包含中断屏蔽信息和中断事件的记录信息。配置和访问这些寄存器可以获取中断源,中断状态等信息,并能清除待处理中断的状态标志

在不开启USB OTG的情况下,STM32的USB模块都用作USB从设备。在使用USB外设时,有几个操作过程是必须要理解的,这几个概念性的操作过程有助于我们简化应用程序的开发。首先就是初始化端点,接收IN分组(发送请求),接收OUT请求和SETUP请求(接收请求)。

初始化端点是为了通过设置寄存器,方便USB模块能找到要传输的数据或准备好接收数据的缓冲区、确定端点的基本类型(不同的传输类型有不同的端点类型与之对应),确定端点的特殊特性。作为发送方,需要设置USB_EPnR寄存器的STAT_TX位来使能端点,并配置COUNTn_TX位决定发送长度。作为接收方,需要设置STAT_RX位来使能端点,并且设置BL_SIZE和NUM_BLOCK位,确定接收缓冲区的大小,以检测缓冲区溢出的异常。寄存器设定完毕后不能再传输过程中更改,等待本次传输结束CTR寄存器产生中断后,凡可进行下一次传输的配置。

IN分组用于发送数据请求。当USB从机接收到一IN令牌分组时,如果接收到的地址和一个配置好的端点地址相符合的话,USB模块将会根据缓冲区描述表的表项,访问相应的ADDRn_TX和COUNTn_TX寄存器,并将这些寄存器中的数值存储到内部的16位寄存器ADDR和COUNT中。此时,USB模块开始根据DTOG_TX位发送DATA0或DATA1分组,并访问缓冲区。在IN分组传输完毕之后,从缓冲区读到的第一个字节将被装载到输出移位寄存器中,并开始发送。最后一个数据字节发送完成之后,计算好的CRC将被发送。

   OUT分组用于数据发送请求。同理,当接收到一个OUT分组时,如果地址和某个有效端点的地址相匹配,USB模块将访问缓冲区描述表,找到与该端点相关的ADDRn_RX和COUNTn_RX寄存器,并将ADDRn_RX寄存器的值保存在内部ADDR寄存器中。同时,COUNT会被被复位,从COUNTn_RX中读出的BL_SIZE和NUM_BLOCK的值用于初始化内部16位寄存器BUF_COUNT,该寄存器用于检测缓冲区溢出(所有的内部寄存器都不能被应用程序访问)。USB模块将随后收到的数据按字方式组织(先收到的为低字节),并存储到ADDR指向的分组缓冲区中。同时,BUF_COUNT值自动递减,COUNT值自动递增。当检测到数据分组的结束信号时,USB模块校验收到CRC的正确性。

接下来要说得是4种传输类型,很重要:请参考这篇博文http://blog.csdn.net/mcgrady_tracy/article/details/8184480点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值