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
发布评论