2024年3月23日发(作者:)

STM32U盘

这段时间主要在搞usb通信,先用STM32+FLASH实现u盘。在

做之前,先对usb的通信协议和STM32的usb控制器进行深入的学

习和理解。

在看usb2.0协议的时候,经常看到端点这个词,所以我要先把端

点的含义弄懂,usb通讯的最基本形式是通过一个称为端点的东西,

端点可以被看做一个单向管道。

usb端点有4种不同的类型:1、控制端点:用来控制对usb设备

的不同部分访问。2、中断端点:当usb主机向设备请求数据时,中断

端点以固定速率传送小量数据。3、批量端点:用来传送大量数据。4、

等时端点:也是传送大量数据,但不被保证能送达。

同时对枚举过程也要有深入的理解,枚举就是从设备读取一些信

息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据

这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是

USB的枚举过程,只要枚举成功了,那么就已经成功大半了。

首先,USB主机检测到USB设备插入后,就会先对设备复位。设

备复位后,USB 主机就会对地址为0的设备发送获取设备描述符的标

准请求。所有的USB设备在总线复位后其地址都为0,这样主机就可

以跟那些刚刚插入的设备通过地址0通信。主机在建立阶段发出获取

设备描述符的输入请求,设备收到该请求后,在数据过程将设备描述

符返回给主机。主机在成功获取到一个数据包的设备描述符后并且确

认没有什么错误后(注意:有些USB设备的端点0大小不足18字节

(但至少具有8字节),而标准的设备描述有18字节,在这种情况下,

USB设备只能暂时按最大包将部分设备描述符返回,而主机在成功获

取到前面一部分描述符后,就不会再请求剩下的设备描述符部分,而

是进入设置地址阶段),就会返回一个0长度的状态数据包给设备。

然后主机再对设备复位一下,接下来就会进入到设置地址阶段。

这时USB主机发出一个设置地址的请求(建立过程,设置地址无数据

过程),地址包含在建立包中,具体的地址USB主机会负责管理,它

会分配一个唯一的地址给新的设备。USB设备在收到地址后,返回0

长度的状态包,主机收到0长度的状态包之后,会返回一个ACK给设

备。设备在收到这个ACK之后,就可以启用新的地址了。这样设备就

分配到了一个唯一的设备地址,以后主机就通过它来进行访问该设备。

在开发板上已有一个简易的游戏杆,其SELECTION、DOWN、

RIGHT、LEFT 和UP键分别与处理器的PD12、PD14、PE1、PE0、

PD8引脚相连;

由于USB协议及接口较为复杂,MDK所带的STM32F10X的BSP

包中单独提供了USB的相关函数库,需要将这些目录包含到编译路径

中去。

程序的结构比较复杂,介绍一下除了库文件以及USB函数库文件

之外的几个源文件函数:

main.c

该函数中主要包含2个函数,其中main函数初始化系统以及USB

接口,之后不断查询游戏杆是否有动作,如果有动作则根据动作向

USB缓冲器发出相关数据;Delay函数用于延迟。

usb_desc.c

该文件中没有任何函数,只是包含一些定义USB设备的描述符常

数,由于游戏杆是标准USB设备,因此比较容易得到相关的参数。读

者若要开发非标准的USB 设备,则还需要开发PC上运行的非标准设

备的驱动程序。

usb_Istr.c

该文件中只有一个函数,即USB中断的USB_Istr函数,该函数对

各类引起USB 中断的事件作轮询处理。

usb_prop.c

该文件用于实现相关设备的USB协议,例如初始化、SETUP包、

IN包、OUT 包等等。

usb_pwr.c

该文件中包含处理上电、调电、挂起和恢复事件的函数,

hw_config.c