基于STM32的USB OTG数据通信的实现(2)
- UID
- 1029342
- 性别
- 男
|
基于STM32的USB OTG数据通信的实现(2)
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 标准协议传输, 才能顺利实现文件读、写等功能。
程序中实现U盘的BOT传输,除了规定控制传输端点0之外,还定义了输入、输出端点,BOT状态机的5个状态,两个状态寄存器CBW、CSW。端点输出中断程序完成写U盘,端点输入完成读U盘操作。其流程图分别如图4、图5所示。
3.2 与PC机之间通信
与PC机进行通信,系统作为USB从设备时, 要应答PC主机的标准请求、处理USB总线事务和用户功能[6]。首先调用void USB_OTG_USBD_Init ()将USB OTG工作模式配置成从机模式,接着调用底层驱动API函数USB_OTG_USBD_EP_Open ()来激活端点进行数据传输,USB OTG定义了三个端点, 程序中定义端点0在控制传输中应答设备枚举,端点1的功能为向PC机发送数据, 端点2的功能为接受PC机发送的数据。PC主机枚举系统设备时, 必须先获得USB OTG端点的配置参数。最后通过调用如下的PCD层API函数完成SETUP包、IN包、OUT包的传输。
uint32_t USB_OTG_USBD_EP_Read();
uint32_t USB_OTG_USBD_EP_Write();
uint32_t USB_OTG_USBD_EP_Stall();
uint32_t USB_OTG_USBD_EP_ClrStall();
uint32_t USB_OTG_USBD_EP_Flush();
本文采用意法半导体公司互联型控制芯片STMF107集成的USB OTG接口, 在基于金牛开发板上实现了从设备和主机的数据传输,作为从设备, PC机端的应用程序可以通过USB OTG 开发板的SDRAM进行数据的读写,可稳定在500 kb/s;作为主机, 可以枚举连接到USB OTG 接口上的U盘实现了对U盘的读写,最高读写速率可达800 kb/s。
本文利用了STM32F107芯片高度集成的USB OTG接口,其开发系统性能好、可靠性高、开发方便,开发者只需在软件上编程实现数据传输。同时STM32芯片提供了相关固件库,在此基础上进行开发提高了效率。本文的创新点就在于充分结合和利用了STM32处理器低成本、低功耗、高可靠性与USB OTG技术的优点,对于已经编程实现的主机、从机栈程序有很好的移植性, 对于以后数据传输的开发具有很好的参考性。将USB与STM32相结合实现USB嵌入式设备之间的数据传输,将会在移动数据传输领域具有很好的应用前景。
参考文献 |
|
|
|
|
|