22.1 USB概述
USB是英文Universal Serial BUS(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。
是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的。发展到现在已经有USB1.0/1.1/2.0/3.0/3.1等多个版本。目前用的最多的就是USB2.0和USB3.0,USB3.1目前已经开始普及。
STM32F103自带的USB符合USB2.0规范。标准USB共四根线组成,除VCC和GND外,另外为D+,D-,这两根数据线采用的是差分电压的方式进行数据传输的。在USB主机上,D-和D+都是接了15K的电阻到低的,所以在没有设备接入的时候,D+、D-均是低电平。
而在USB设备中,如果是高速设备,则会在D+上接一个1.5K的电阻到VCC,而如果是低速设备,则会在D-上接一个1.5K的电阻到VCC。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。
STM32F1自带一个USB从机控制器,符合USB规范通信,PC主机和微控制器之间的数据传输是通过共享一个专用的数据缓冲区来完成的,该数据缓冲区能被USB外设直接访问,这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用512字节缓冲区,最多可用于16个单向或8个双向端点。
USB模块同PC主机通信,根据USB规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括CRC的生成和校验。
每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数。当USB模块识别出一个有效的功能/端点的令牌分组时,(如果需要传输数据并且端点已配置)随之发生相关的数据传输。
USB模块通过一个内部的16位寄存器实现端口与专用缓冲区的数据交换。在所有的数据传输完成后,如果需要,则根据传输的方向,发送或接收适当的握手分组。在数据传输结束时,USB模块将触发与端点相关的中断,通过读状态寄存器和/或者利用不同的中断来处理。USB设备架构如图所示。
USB的中断映射单元:将可能产生中断的USB事件映射到三个不同的NVIC请求线上:
(1)USB低优先级中断(通道20):可由所有USB事件触发(正确传输,USB复位等)。在处理中断前应首先确定中断源。
(2)USB高优先级中断(通道19):仅由同步和双缓冲批量传输的正确传输事件触发,为保证最大的传输速率。
(3)USB唤醒中断(通道42):由USB挂起模式的唤醒事件触发。
注:USB和CAN共用一个专用的512字节的SRAM存储器用于数据的发送和接收,因此不能同时使用USB和CAN(共享的SRAM被USB和CAN模块互斥地访问)。USB和CAN可以同时用于一个应用中但不能在同一个时间使用。
22.2 实验例程
如果需要正常的使用STM32F1系列的USB模块,就需要编写USB驱动程序,这部分程序非常复杂,需要了解整个USB通信的详细过程,针对这个问题,ST公司提供了一个官方的USB驱动库,用户可以通过直接移植官方驱动库来实现USB读写控制。
我们现在直接利用官方的USB驱动源码来通过计算机进行SD卡和Flash的读写,这里我们需要对官方源码进行一些修改,用于实现这个效果。
22.2.1 USB源码概述
USB Mass Storage类支持两个传输协议:
(1)Bulk-Only传输(BOT)
(2)Control/Bulk/Interrupt传输(CBI)
MassStorage类规范定义了两个类规定的请求:Get_Max_LUN和MassStorageReset,所有的MassStorage类设备都必须支持这两个请求。
(1)Get_Max_LUN(bmRequestType=10100001 bandb Request=11111110b)用来确认设备支持的逻辑单元数。MaxLUN的值必须是0~15。注意:LUN是从0开始的。主机不能向不存在的LUN发送CBW,本章我们定义MaxLUN的值为1,即代表2个逻辑单元。
(2)MassStorageReset(bmRequestType=00100001 bandb Request=11111111b)用来复位MassStorage设备及其相关接口。
支持BOT传输的MassStorage设备接口描述符要求如下:
(1)接口类代码bInterfaceClass=08h,表示为MassStorage设备。
(2)接口类子代码bInterfaceSubClass=06h,表示设备支持SCSIPrimaryCommand-2(SPC-2)。
(3)协议代码bInterfaceProtocol有3种:0x00、0x01、0x50,前两种需要使用中断传输,最后一种仅使用批量传输(BOT)。
(4)支持BOT的设备必须支持最少3个endpoint:Control,Bulk-In和Bulk-Out。USB2.0的规范定义了控制端点0。Bulk-In端点用来从设备向主机传送数据(本章用端点1实现)。Bulk-Out端点用来从主机向设备传送数据(本章用端点2实现)。
ST官方的例程是通过USB来读写SD卡(SDIO方式)和Nand Falsh,支持2个逻辑单元,我们在官方例程的基础上,只需要修改SD驱动部分代码,并将对Nand Falsh的操作修改为对SPI Falsh的操作。只要这两步完成了,剩下的就比较简单了,对底层磁盘的读写,都是在mass_mal.c文件实现的,所以我们只需要修改该函数的MAL_Init、MAL_Write、MAL_Read和MAL_GetStatus等4个函数,与我们的SD卡和SPI Falsh对应起来即可。
22.2.2 源码移植过程
(1)需要添加的文件如下表所示。
文件名 | 目录 | 功能 |
---|---|---|
usb_core.c | ....\\USB\\CORE | 用于处理USB2.0协议 |
usb_init.c | 用于USB控制器的初始化 | |
usb_int.c | 负责USB的中断处理 | |
usb_mem.c | 负责处理PMA数据,即STM32内部用于USB/CAN的专用数据缓冲区 | |
usb_regs.c | 负责USB控制寄存器的底层操作 | |
usb_sil.c | 为USB端点提供特殊简化的读写访问函数 | |
usb_desc.c | ...\\USB\\CONFIG | 用于虚拟通信端口描述符的处理 |
usb_endp.c | 用于非控制传输,处理正确传输中断回调函数 | |
usb_istr.c | 用于处理USB中断 | |
usb_prop.c | 用于处理所有虚拟通信端口相关事件,包括初始化,复位等 | |
usb_pwr.c | 用于管理USB的电源状态 | |
usb_scsi.c | 与SCSI命令相关的所有处理 | |
scsi_data.c | 定义了SCSI数据 | |
memory.c | 定义USB通信的存储区读写函数 | |
mass_mal.c | 定义了USB通信的读写操作底层函数接口 | |
usb_bot.c | 定义了BOT传输协议 |
-
usb
+关注
关注
60文章
7945浏览量
264657 -
PC
+关注
关注
9文章
2082浏览量
154205 -
总线
+关注
关注
10文章
2881浏览量
88085
发布评论请先 登录
相关推荐
评论