STM32F107芯片集成了USB OTG功能,USB OTG固件程序的设计可以完成数据传输的所有操作及功能。其结构图如图2所示。其中驱动程序栈包括主机驱动程序栈、从机驱动程序栈、USB OTG驱动程序栈。当完成固定程序设计后,系统软件会根据硬件的连接检查ID线的状态来选择工作模式是设备模式还是主机模式。程序流程图如图3所示。
如果工作于主机模式下,则进行相应初始化、检测端口,在检测到有设备接入时复位总线、枚举并配置从机设备,在完成对从机识别后,可通过查询从机的OTG性能描述符判断是否支持HNP协议(即是否为两用OTG设备)。当工作在从机状态时则等待主机对其完成枚举。本文是在STM32开发工具RealView MDK的基于STM32固件库上进行开发,实现与U盘、PC机间的通信。
3.1 U盘读写的实现
U盘属于USB 大容量存储设备,它具有容量大、可移动、数据交互方便等优点,因而实现与U盘的读写具有很强的应用价值和市场前景。要实现U盘读写,USB 主机必须具有相应的驱动[5],对各种读写指令进行封装、解释和执行。
在系统进入主机模式前应先给开发板提供5 V供电,开启系统时钟、USB OTG时钟,然后调用void HOST_Init (USB_OTG_CORE_DEVICE *pdev)函数将USB OTG初始化为主机模式,接着调用HOST_ChannelInit(USB_OTG_CORE_DEVICE *pdev,USB_OTG_HC *pHost
Channel)初始化传输通道,其中包括总传输长度、期望接收到的数据包数、设备端点传输类型、速度、方向的配置。最后根据主机传输协议在初始化通道内进行传输,可以调用下列函数uint32_t HOST_StartXfer (USB_OTG_CORE_DEVICE *pdev, USB_OTG_HC *pHostChannel)进行通信。
U盘是大容量存储设备,支持Bulk-Only 传输协议,USB主机在能够正确操纵U盘之前必须先完成USB总线的枚举,在控制传输阶段先获取从设备的信息,然后根据这些信息对从设备进行重配置后, 才能建立主从通信。此外, 程序中还要实现标准Mass Storge 类协议中的磁盘操作命令UFI, 它能完成读、写、格式化磁盘等。最后建立了FATFS 文件系统,它兼容了FAT16、FAT32文件系统,它是UFI 与移动盘上文件数据连接的桥梁, UFI命令的所有数据流只有按照FATFS 标准协议传输, 才能顺利实现文件读、写等功能。