《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于STM32的USB OTG数据通信的实现
基于STM32的USB OTG数据通信的实现
来源:微型机与应用2011年第10期
龚跃玲,汪玲彦
(武汉理工大学 自动化学院, 湖北 武汉430070)
摘要: 针对一般USB装置只能在PC机周围进行数据通信的限制,提出了基于USB OTG接口与STM32微控制器相结合的智能通信的设计方法。该方法是在基于Cortex内核的32 bit RAM芯片STM32F107上集成USB OTG接口上实现,它利用了STM32集成度高、成本低、功耗低、开发方便、性能可靠和USB OTG双角色特性等优点,解决了无PC机时USB从设备之间数据传送难的问题。并在金牛开发板上实现它与PC机以及U盘之间的通信,完成了USB嵌入式设备之间数据的传输。
Abstract:
Key words :

摘   要: 针对一般USB装置只能在PC机周围进行数据通信的限制,提出了基于USB OTG接口与STM32微控制器相结合的智能通信的设计方法。该方法是在基于Cortex内核的32 bit RAM芯片STM32F107上集成USB OTG接口上实现,它利用了STM32集成度高、成本低、功耗低、开发方便、性能可靠和USB OTG双角色特性等优点,解决了无PC机时USB从设备之间数据传送难的问题。并在金牛开发板上实现它与PC机以及U盘之间的通信,完成了USB嵌入式设备之间数据的传输。
关键词: USB OTG; STM32F107; U盘

    移动数据的交换和存储, 是近年来IT行业的热点。随着USB技术的产生,USB技术已逐渐应用在移动数据领域中。目前使用的USB移动设备都只能通过PC机进行相互的文件和数据交换。随着USB技术的逐渐成熟,人们希望通过移动设备直接与USB外设通信, 使得USB能应用在没有PC的领域中。
    USB OTG(On The Go)[1]可满足这些要求,即一个拥有OTG 功能的设备既可以扮演主机的角色操纵其他USB从设备,同时又可以担当从设备的角色接受主机的支配。例如,照相机可以直接连到USB打印机上打印数据。当今USB主机的嵌入式应用就成了USB领域新的研究焦点。该技术对于便携式设备、野外作业设备间的数据传输将是一个重要突破。基于Cortex-M3内核的STM32系列的ARM嵌入式处理器因其高的性价比而正被广泛应用。将USB与ARM相结合是进行数据采集、处理与传输的理想解决方案。本文重点讨论基于STM32的USB OTG的数据通信。
1 USB OTG规范    
    USB OTG规范是USB 2.0规范的补充,它完全遵守USB 2.0规范的外围设备。在USB OTG规范之下, 任意两个符合规范的USB产品都可以互相连接进行通信, 而不是必须通过PC机才能通信, 从而实现了各类USB产品完全脱离电脑进行数据传输的功能。
    双重角色设备必须具备有限的主机能力,同时还需要一个OTG目标列表,即包括与之通信的设备信息、设备类型、制造商等。它支持会话请求协议SRP和主机交换协议HNP。SRP协议用于B设备向A设备请求开始USB会话, HNP协议用于USB会话过程中在A设备和B设备之间传递主机地位[2]。
2 STM32的USB OTG全速控制器
    ST公司在基于ARM公司的Cortex-M3架构上研发出32 bit STM32处理器后,凭借其丰富的外围模块、高速指令执行速度、低功耗、低价格而备受市场青睐。2009年又推出了STM32F107互联型系列微控制器,它集成了USB OTG接口,配合了USB HOST和SPI功能,让微控制器可以读取USB大容量外存、MP3播放器、SD记忆卡等文件。STM32F107芯片内集成了USB OTG模块功能图如图1所示。

 

 

    USB OTG全速控制器从复位和时钟控制模块(RCC)中获得时钟,微控制器内核(CPU)通过AHB外设总线访问OTG全速控制器的寄存器,USB事件由单独的USB OTG中断控制线通知微控制器内核[3]。
    每个发送FIFO都配置了一个PUSH寄存器,微控制器以向PUSH寄存器写32 bit数据的方式向USB控制器传输数据,每一个OUT端点或IN通道都有一个POP寄存器,微控制器通过读POP寄存器获得来自USB总线的32 bit数据,这些数据自动从共享的接收FIFO中载入,接收FIFO位于总共1.25 KB的USB数据RAM区。
    USB协议层由串行接口控制器(SIE)驱动,并连接到由内置物理层(PHY)支持的USB全速/低速收发模块。OTG PHY由OTG全速控制器控制,并通过UTMI+总线(UTMIFS)的全速子集来收发控制和数据信号。它包括了上拉/下拉电阻的ECN电路。内置了ID线的上拉电阻,用于区分是主机状态还是设备状态,若ID线浮空,内置的上拉电阻将检测到ID线的高电平,此时控制器处于默认的设备模式下。若ID线接地。自动切换到主机模式,并需要软件初始化主机模式。
    DP/DM线内置了上拉和下拉电阻[4],在设备模式下,当VBUS线上出现了有效的电平,控制器使能DP线的上拉电阻,向主机通告接入一个USB全速设备。在主机模式下,控制器同时使能DP和DM线的下拉电阻。上拉和下拉电阻可以在控制器通过主机协商协议(HNP)切换角色类型时动态地切换。
3 USB OTG软件设计
    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 标准协议传输, 才能顺利实现文件读、写等功能。
    程序中实现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嵌入式设备之间的数据传输,将会在移动数据传输领域具有很好的应用前景。
参考文献
[1] On The Go Supplement to the USB2.0 Specification,Rev1.0[S].www.usb.org,2001.
[2] 周立功.USB 2.0与OTG规范及开发指南[M].北京:北京航空航天大学出版社, 2004.   
[3] 王永虹,徐炜,郝立平.STM32 系列ARM Cortex-M3微控制器原理与实践[M]. 北京:北京航空航天大学出版社,2008.
[4] ST Microelectronics. STM32 Reference manual[Z].2009.
[5] 宋宇宁,周兆英,赵焕军. USB OTG 扩展子板的实现[J].电子技术应用,2006,32(5):2-3.
[6] 张洪波,江海河,贾先德. USB OTG 技术在数据采集系统的应用[J]. 微计算机信息,2006,(22):2-3.

此内容为AET网站原创,未经授权禁止转载。