STM32 之三 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)

写在前面

  • 稍有涉及USB 2.0 规范的内容,关于USB规范去官 或自行Google。也可以参考:
  • USB之USB2.0 规范详解 第一部分
  • USB之USB2.0 规范详解 第二部分

关于驱动

STM32 MCU有两种带USB功能的IP

  • 经USB-IF 认证,符合通用串行总线规范第2.0 版
  • 模块内嵌的PHY 还完全支持定义在标准规范OTG 补充第1.3 版中的OTG 协议
  • 支持A-B 器件识别(ID 线)
  • 支持主机协商协议(HNP) 和会话请求协议(SRP)
  • 允许主机关闭VBUS以在OTG 应用中节省电池电量
  • 支持通过内部比较器对VBUS电平采取监控
  • 支持主机到从机的角色动态切换
  • 可通过软件配置为以下角色:
  • 具有SRP 功能的USB FS 从机(B 器件)
  • 具有SRP 功能的USB FS/LS 主机(A 器件)
  • USB On-The-Go 全速双角色设备
  • 支持FS SOF 和LS Keep-alive 令牌
  • SOF 脉冲可通过PAD 输出
  • SOF 脉冲从内部连接到定时器2 (TIM2)
  • 可配置的帧周期
  • 可配置的帧结束中断
  • 具有省电功能,例如在USB 挂起期间停止系统、关闭数字模块时钟、对PHY 和DFIFO电源加以管理
  • 具有采用高级FIFO 控制的1.25 KB 专用RAM
  • 可将RAM 空间划分为不同FIFO,以便灵活有效地使用RAM
  • 每个FIFO 可存储多个数据包
  • 动态分配存储区
  • FIFO 大小可配置为非2 的幂次方值,以便连续使用存储单元
  • 一帧之内可以无需要应用程序干预,以达到最大USB 带宽

OTG_FS 接口在主机模式下具有以下主要特性和要求:

  • 通过外部电荷泵生成VBUS电压。
  • 多达8 个主机通道(管道):每个通道都可以动态实现重新配置,可支持任何类型的USB 传输。
  • 内置硬件调度器可:
  • 在周期性硬件队列中存储多达8 个中断加同步传输请求
  • 在非周期性硬件队列中存储多达8 个控制加批量传输请求
  • 管理一个共享RX FIFO、一个周期性TX FIFO 和一个非周期性TX FIFO,以有效使用USB 数据RAM。

OTG_FS 接口在从机模式下具有以下特性:

  • 1 个双向控制端点0
  • 3 个IN 端点(EP),可配置为支持批量传输、中断传输或同步传输
  • 3 个OUT 端点,可配置为支持批量传输、中断传输或同步传输
  • 管理一个共享Rx FIFO 和一个Tx-OUT FIFO,以高效使用USB 数据RAM
  • 管理多达4 个专用Tx-IN FIFO(分别用于每个使能的IN EP),降低应用程序负荷
  • 支持软断开功能。

关于该部分的详细说明,参见芯片的参考手册第34节:USB on-the-go full-speed (OTG_FS)

USB OTG high speed core

OTG_HS 是一个双角色设备(DRD) 控制器,同时支持从机和主机功能,并且完全符合USB 2.0 规范的On-The-Go 补充标准。此外,该控制器也可配置为仅主机或仅从机控制器,完全符合USB 2.0 规范。在主机模式中,OTG_HS 支持高速(HS,480 Mbits/s)、全速(FS、12 Mbits/s)和低速(LS,1.5 Mbits/s)传输,而在从机模式中,仅支持高速(HS,480 Mbits/s)和全速(FS、12 Mbits/s)传输。OTG_HS 还支持HNP 和SRP。OTG 模式下需要的唯一外部设备是提供VBUS 的电荷泵。

模块 文件 说明
Common usb_core.c/h 该文件包含硬件抽象层和USB通信操作
Common usb_conf_template.h 该文件包含主机、设备和OTG模式的核心配置参数:发送FIFO大小,接收FIFO大小,核心模式和选定功能等。*用户需要根据自己的需求,使用这个文件对USB OTG low level driver进行合理的配置。这个文件应该被复制到应用程序文件夹并根据应用程序的需要进行修改。
Common usb_bsp_template.c 该文件包含了USB使用的低级核心配置(中断、GPIO等)。用户需要使用这个文件配置USB使用的硬件资源。这个文件应该被复制到应用程序文件夹并根据应用程序的需要进行修改。
Host usb_hcd.c/h 该文件包含访问核心时使用的Host接口层。
Host usb_hcd_int.c/h 该文件包含Host模式所使用的中断子程序。
Device usb_dcd.c/h 该文件包含用于访问核心时使用的的Device接口层。
Device usb_dcd_int.c/h 该文件包含Device模式的中断子程序。
OTG usb_otg.c/h 该文件包含SRP和HNP协议的实现以及有关于OTG模式的中断。

USB OTG low level driver 配置

定义 描述
USB_OTG_FS_CORE 使能内核的全速模式
USB_OTG_HS_CORE 使能内核的高速模式
RX_FIFO_FS_SIZE 设置全速模式下接收的FIFO的大小
RX_FIFO_HS_SIZE 设置高速模式下接收的FIFO的大小
TXn_FIFO_FS_SIZE 设置全速模式下指定设备端点的发送FIFO的大小,n 为设备的端点 使用的索引值
TXn_FIFO_HS_SIZE 设置高速模式下指定设备端点的发送FIFO的大小,n 为设备的端点 使用的索引值
TXH_NP_FS_FIFOSIZ 设置全速模式下,作为USB Host时,非周期性发送的FIFO的大小
TXH_NP_HS_FIFOSIZ 设置高速模式下,作为USB Host时,非周期性发送的FIFO的大小
TXH_P_FS_FIFOSIZ 设置全速模式下,作为USB Host时,周期性发送的FIFO的大小
TXH_P_HS_FIFOSIZ 设置高速模式下,作为USB Host时,周期性发送的FIFO的大小
USB_OTG_ULPI_PHY_ENABLED 为高速模式使能ULPI接口的PHY。通常为外接的PHY芯片
USB_OTG_EMBEDDED_PHY_ENABLED 为高速模式芯片内嵌的FS PHY。一般STM32系列芯片内嵌了一个PHY芯片。芯片不同其PHY的对于全速和高速的支持情况也不同
USB_OTG_HS_LOW_PWR_MGMT_SUPPORT 使能高速模式下的低功耗管理功能
USB_OTG_FS_LOW_PWR_MGMT_SUPPORT 使能全速模式下的低功耗管理功能
USB_OTG_HS_INTERNAL_DMA_ENABLED 使能高速模式下的DMA特性
USB_OTG_HS_DEDICATED_EP1_ENABLED 使能高速模式下,作为USB Device时,专用的端点1的特性

USB OTG low level driver 使用

在USB OTG low level driver的使用中,配置选项均在中。除此之外,对于某些变量的定义也有如下需要注意的事项。
The Rx and Tx FIFOs size and start address are set inside this function to use one more endpoints in addition to the control Endpoint (0). The user can change the FIFO settings by modifying the default values and changing the FIFO depth for each Tx FIFO in the usb_conf.h file.

Low level driver structures

该部分使用一个结构体来定义需要使用的变量、状态和缓冲区等。这个结构体也是用户在使用时需要重点关注的第一个结构体。具体如下:

同时在使用DMA时,需要注意:

  • 目前,DMA仅在高速模式下使用。
  • 在使用DMA时,必须要保证所有需要处理DMA 收发Buf的结构体必须是四字节对齐的。所以,(其封装了所有内部Buffer和变量)必须要四字节对齐。具体可使用如下代码:

和为特殊的编译器宏值,具体见的定义。

USB OTG low level driver中的Host层

该部分主要是指和两个文件。在初始化主机驱动程序(HCD)之后,低级驱动程序为数据和URB状态监视保存多个结构和缓冲区。 主机通道结构保存在主机驱动程序中,并通过主机 索引从上层访问。USB Host 的定义结构:

文件中使用如下结构来处理USB中断

  1. 在库层中,一旦定义了USBH_HCD_INT_cb_TypeDef结构,就应该将其分配给USBH_DCD_INT_fops指针。因为库内部实际使用变量。
  2. 必须在中断中引用函数

USB OTG low level driver中的Device层

该部分主要是指和两个文件。这两个文件主要是定义实现USB作为Device时的每个断点的收发缓冲器、起始地址等。USB Device的定义结构:

文件中使用如下结构来处理USB中断

  1. 在库层中,一旦定义了USBD_DCD_INT_cb_TypeDef结构,就应该将其分配给USBD_DCD_INT_fops指针。因为库内部实际使用变量。
  2. 必须在中断中引用函数

选择合适的USB physical 接口

用户可以根据以上配置来选择自己的PHY。

  • 对于全速模式,会使用芯片内嵌的全速的PHY。只能工作在全速模式
  • 对于高速模式,用户可以选择两种PHY:
  • ULPI接口的外部高速PHY:此时,USB HS Core将以高速模式运行。 此时用户可以通过修改文件中寄存器的比特位来修改为全速模式。
  • 芯片内嵌的全速PHY:USB HS Core将以全速模式运行。尽管选择了高速。

作为 USB Host 时,如果接入了一个低速设备,则核心会自动降速。

USB host library

USB Host库是基于支持Host模式、Device模式和OTG模式的通用USB OTG低级驱动程序的,其适用于高速,全速和低速(主机模式)。
USBHost的移植配置部分见另一篇博文。

  • 支持多数据包传输功能,可传输大量数据; 而不必将其分成最大数据包大小的传输。
  • 使用配置文件更改核心和库配置,而不更改库代码(只读)。
  • 32位对齐的数据结构在高速模式下处理基于DMA的传输。
  • 从用户级别支持多个USB OTG核心实例。
  • 围绕全局状态机构建。
  • 完全兼容实时操作系统(RTOS)。

USB host 源文件及函数

其源码目录结构及执行状态机如下图:

函数调用关系如下:

Core

SB host Core由五大块组成:Core host core、USB enumeration、USB control transfer management、USB I/O requests、Channels management。 Core中各文件说明如下:

  • **usbh_core (.c, .h):**该文件包含处理所有USB通信和状态机的功能。
  • **usbh_stdreq(.c, .h) :**该文件实现设备枚举的标准请求。
  • :获取配置描述符请求。
  • :获取设备描述符请求。
  • :获取字符串描述符请求。
  • :通用获取描述符请求
  • :设置配置请求。选择默认配置(配置0)
  • :设置地址请求。将地址设置为1
  • :清除特征的请求
  • usbh_ioreq (.c, .h): 该文件处理USB事务的生成。
  • :发起一个设置事务。
  • :发起一个控制数据OUT阶段事务。
  • :发起一个控制数据IN阶段事务。
  • :用于生成控制传输的高级功能(设置,数据,状态阶段)。
  • :发起 一个bulk OUT事务。
  • :发起一个 bulk IN事务。
  • :发起一个 中断OUT事务。
  • :发起一个 中断IN事务。
  • usbh_hcs (.c, .h) : 该文件处理主机通道分配和触发进程。
  • :打开并配置新的主机通道。
  • :修改现有的主机通道。
  • :将主机通道分配给设备端点(创建USB)。
  • :释放一个主机通道
  • :释放所有主机通道(在非初始化阶段使用)
  • usbh_conf.h: 该文件包含设备接口编 ,配置编 和最大数据包大小的配置。

在枚举结束时,USB核心调用特定的类驱动程序函数来管理所有与类相关的操作。结构如下:

库用户API函数仅限于以下两个函数:

  • 该功能实现核心状态机进程。它应该从用户主循环周期性地调用。
  • 应该调用这个函数来初始化USB主机硬件和库。

Class

lass文件夹包含所有与类实现相关的文件,并符合这些类中构建的协议的规范。使用如下结构将类引入到USB驱动

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年11月26日
下一篇 2017年11月26日

相关推荐