|
第四十六章 初识USB
1)实验平台:正点原子DNESP32P4开发板
2)章节摘自【正点原子】ESP32-P4开发指南— V1.0
3)购买链接:https://detail.tmall.com/item.htm?id=873309579825
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32P4.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子DNESP32S3开发板技术交流群:132780729
随着现代电子设备的飞速发展,USB(Universal Serial Bus,通用串行总线)协议已成为各种设备间实现高速数据传输和设备供电的标准接口。无论是个人计算机、智能手机,还是嵌入式设备开发,USB协议在数据传输、外设扩展等方面都发挥着重要作用。在本章中,我们将了解USB协议的基础知识,为后续学习ESP32-P4 USB模块的开发和使用打下坚实的基础。
46.1 USB简介
46.2 ESP32-P4 USB简介
46.3 tinyusb软件库解析
46.1 USB简介
USB(Universal Serial Bus,通用串行总线)是一种广泛应用的总线标准,用于连接主机与外设设备,实现数据传输、电源供给等功能。作为现代电子设备间通信的核心技术,USB以其高效性和易用性成为了嵌入式开发中不可或缺的组成部分。
USB协议由USB IF(USB Implementers Forum)制定,涵盖了多个版本,包括USB 1.1、USB 2.0、USB 3.0等。这些标准定义了USB接口的各个层次协议,从物理层、数据链路层到高层协议,如传输层、会话层和表示层。此外,USB还规定了丰富的设备类(Device Class)标准,例如HID(人机接口设备)、MSC(大容量存储设备)、CDC(通信设备类)、Audio、Video等,这些设备类为USB的广泛应用奠定了基础。
USB本身的知识体系非常复杂,本节只能作一点知识点的引入。本书篇幅有限,不可能在这里详细介绍,想更系统地学习USB的知识可以参考《圈圈教你玩 USB》、塞普拉斯提供的《USB 101:通用串行总线 2.0 简介》等文献,下面我们一起来看USB的简单特性:
1,USB的硬件接口
USB协议有漫长的发展历程,为的不同的场合和硬件功能而发展出不同的接口:Type-A、Type-B、Type-C,Type-C规范碰巧是跟着USB3.1的规范一起发布的。常见的接口类型列出如下图所示。
图46.1.1 常见的USB连接器的形状
USB 发展到现在已经有 USB1.0/1.1/2.0/3.x/4等多个版本。目前用的最多的就是版本 USB1.1和USB2.0,USB3.x/USB4目前也在加速推广。从图中可以发现不同的版本的USB接口内的引脚数量是有差异的。USB3.0以后为了提高速度,采用了更多数量的通讯线,比如同样的是Type A接口,USB2.0版本内部只有四根线,采用半双工式广播式通讯,USB3.0版本则将通讯线提高到了9根,并可以支持全双工非广播式的总线,允许两个单向数据管道分别处理一个单向通信。
USB2.0常使用四根线:VCC(5V)、GND、D+(3.3V)和D-(3.3V) (注:五线模式多了一个DI脚用于支持OTG模式,OTG为USB主机+USB设备双重角色),其中数据线采用差分电压的方式进行数据传输。在USB主机上,D-和D+都是接了15K的电阻到地的,所以在没有设备接入的时候,D+、D-均是低电平。而在USB设备中,如果是高速设备,则会在D+上接一个1.5K的电阻到3.3V,而如果是低速设备,则会在D-上接一个1.5K的电阻到3.3V。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。
关于USB硬件还有更多具体的细节规定,硬件设计时需要严格按照USB的器件的使用描述和USB标准所规定的参数来设计。
2,USB速度
USB规范已经为USB系统定义了以下四种速度模式:低速(Low-Speed)、全速(Full-Speed)、高速(Hi-Speed)和超高速(SuperSpeedUSB)。接口的速度上限与设备支持的USB协议标准和导线长度、阻抗有关,不同协议版本对硬件的传输线数量、阻抗等要求各不相同,各个版本的能达到的理论速度上限对应如下图。
图46.1.2 USB协议发展与版本对应的速度
USB端口和连接器有时会标上颜色,以指示USB规格及其支持的功能。这些颜色不是USB规范所要求的,并且在设备制造商之间不一致。例如,常见的支持USB3.0的U盘和电脑等设备使用蓝色指示,英特尔使用橙色指示充电端口等。
3,USB系统
USB系统主要包括三个部分:控制器(Host Controller)、集线器 (Hub) 和USB设备。
控制器(Host Controller),主机一般可以有一个或多个控制器,主要负责执行由控制器驱动程序发出的命令。控制器驱动程序(Host Controller Driver)在控制器与USB设备之间建立通信信道。
集线器(Hub)连接到USB主机的根集线器,可用于拓展主机可访问的USB设备的数量。
USB设备(USB Device)则是我们常用的如U盘,USB鼠标这类受主机控制的设备。
4,USB通讯
USB针对主机、集线器和设备制定了严格的协议。概括来讲,通过检测、令牌、传输控制、数据传输等多种方式,定义了主机和从机在系统中的不同职能。USB系统通过“管道”进行通讯,有“控制管道”和“数据管道”两种,“控制管道”是双向的,而每个“数据管道”则是单向的,这种关系如下图所示。
图46.1.3 USB管道模型
USB通讯中的检测和断开总是由主机发起。USB主机与设备首次进行连接时会交换信息,这一过程叫“USB枚举”。枚举是设备和主机间进行的信息交换过程,包含用于识别设备的信息。此外,枚举过程主机需要分配设备地址、读取描述符(作为提供有关设备信息的数据结构),并分配和加载设备驱动程序,而从机需要提供相应的描述符使主机知悉如何操作此设备。整个过程需要数秒时间。完成该过程后设备才可以向主机传输数据。数据传输也有规定的三种类型,分别是:IN/读取/上行数据传输、OUT/写入/下行数据传输、控制数据传输。
USB通过设备端点寻址,在主机和设备间实现信息交流。枚举发生前有一套专用的端点用于与设备进行通信。这些专用的端点统称为控制端点或端点0,有端点0 IN和端点0 OUT两个不同的端点,但对开发者来说,它们的构建和运行方式是一样的。每一个USB设备都需要支持端点0。因此,端点0不需要使用独立的描述符。除了端点0外,特定设备所支持的端点数量将由各自的设计要求决定。简单的设计(如鼠标)可能仅要一个IN端点。复杂的设计可能需要多个数据端点。
USB规定的4种数据传输方式也是通过管道进行,分别是控制传输(Control Transfer)、中断传输(Interrupt Transfer)、批量传输或叫块传输(Bulk Transfer)、实时传输或叫同步传输(Isochronous Transfer),每种模式规定了各自通讯时使用的管道类型。
关于USB还有很多更详细的时序和要求,像USB描述符、VID/PID的规定、USB类设备和调试等。因为USB2.0和之后的版本有差异,这里就不再为大家列举了。
46.2 ESP32-P4 USB简介
乐鑫ESP32-P4内置了USB 2.0 OTG High-Speed、USB 2.0 OTG Full-Speed和USB-Serial-JTAG外设,为开发者提供了支持USB多媒体、通信、存储、人机交互等多种应用的能力。在嵌入式领域,USB的使用不仅扩展了设备功能,还大大简化了设备开发的复杂性。下图为ESP32-P4 USB功能架构的示意图。
图46.2.1 USB功能架构
上图展示了ESP32-P4在USB Host和Device模式下的功能支持和驱动架构。可通过Full-Speed USB-OTG和High-Speed USB-OTD实现这些功能。
下面,笔者着重讲解ESP32-P4的USB 2.0 OTG High-Speed、USB 2.0 OTG Full-Speed、USB-Serial-JTAG和USB PHY相关知识。
46.2.1 USB-OTG Full-speed控制器简介
ESP32-P4芯片内置USB-OTG Full-speed外设,它包含了USB控制器和USB PHY,支持通过USB连接到PC机上,实现USB Host和USB Device功能。虽然这一个控制器总线传输速率为12Mbps,但由于USB传输存在一些校验和同步机制,所以实际的有效传输速率将低于12Mbps。具体速率与传输类型相关,如下表所示。
表46.2.1.1 USB-OTG 传输速率
上述传输速率计算方法:传输速率(Bytes/s)= 传输的最大尺寸 * 每毫秒传输包数量 * 1000。下面,笔者重点讲解USB-OTG FS控制器与各个接口的交互,如下图所示。
图46.2.1.2 OTG_FS系统框架
上图是关于ESP32-P4芯片中的USB OTG FS模块架构的功能说明图,详细展示了USB控制器核心与各个接口的交互。下面笔者结合《ESP32-P4技术参考手册》来讲解这个框图。
1,USB Controller Core(USB控制器核心)
OTG_FS外设的核心部分,负责USB功能的主要处理。它与多种接口协同工作以完成数据传输及控制操作。
2,CPU Interface(CPU接口)
提供对控制器核心寄存器和FIFO的读/写访问。使用内部实现的AHB从接口,以“Slave Mode”方式访问FIFO。
3,APB Interface(APB接口)
它用于通过外部USB控制器管理控制器核心。允许CPU控制外部模块或进行查询操作。
4,DMA Interface(DMA接口)
控制器核心通过该接口以DMA模式访问系统内存。使用AHB主接口实现数据负载的读取与写入。
5,USB 2.0 Full-Speed Interface(USB全速接口)
用于连接USB 2.0全速串行收发器。ESP32-P4包含两个全速收发器(FS_PHY1 和 FS_PHY2),可通过时分复用分别为USB Serial/JTAG控制器和USB OTG服务,eFuse可配置这些收发器的连接关系,支持灵活调整硬件功能。
6,USB External Controller(USB外部控制器)
控制USB串行接口与核心寄存器的路由。支持电源管理功能,例如通过关闭AHB时钟或SPRAM时钟来实现节能。
7,Data FIFO RAM Interface(FIFO数据RAM接口)
控制器核心的多个FIFO动态分配在SPRAM中,而非控制器核心内。数据访问通过该接口路由到SPRAM。
46.2.2 USB-Serial-JTAG 外设简介
ESP32-P4/S3等芯片内置USB-Serial-JTAG外设,它包含了USB-to-serial转换器和USB-to-JTAG转换器,支持通过USB线连接到PC,实现固件下载、调试和打印系统LOG等功能。USB-Serial-JTAG 外设知识请翻阅本书籍的第九章节。
46.2.3 USB 2.0 OTG High-Speed控制器简介
ESP32-P4芯片集成了一个USB 2.0 High-Speed On-The-Go(OTG_HS)外设,配备高性能的内置收发器。该OTG_HS控制器符合USB 2.0标准、OTG 1.3和OTG 2.0修订版规范,支持以下数据传输速率:
1)高速(High-Speed):480Mbit/s
2)全速(Full-Speed):12Mbit/s
3)低速(Low-Speed):1.5Mbit/s
在不同速率下,OTG_HS的配置方式如下:
1)高速和全速模式:可配置为 主机(Host)或 设备(Device)。
2)低速模式:只能配置为 主机(Host)。
OTG_HS使用与OTG_FS相同的USB控制器核心,主要由以下几个接口组成,如下图所示。
图46.2.3.1 OTG_HS系统框架
上图展示了OTG_HS的系统架构。控制器核心通过多个接口(如CPU接口、DMA接口、数据FIFO接口)与SPRAM、系统内存以及USB 2.0收发器进行交互。下面笔者结合《ESP32-P4技术参考手册》来讲解这个框图。
1,CPU Interface(CPU接口)
提供对控制器核心的寄存器和FIFO的读写访问,内部实现为AHB从接口。通过CPU接口访问FIFO的方式被称为Slave模式。
2,DMA Interface(DMA接口)
为控制器核心内部的DMA提供对系统内存的读写访问能力,例如在DMA模式下处理数据负载的读取和写入操作。该接口内部实现为AHB主接口。
3,USB 2.0 HS PHY(USB 2.0 接口)
连接控制器核心与USB 2.0 UTMI串行收发器,通过此接口支持高速和全速数据传输速率。
4,Data FIFO interface(数据 FIFO 接口)
控制器核心使用的多个 FIFO 实际上存储在单口 RAM(SPRAM)中,并非直接位于控制器核心内部。FIFO 的大小为动态分配,在运行时根据需求分配到 SPRAM。当 CPU、DMA 或控制器核心尝试访问 FIFO 时,这些访问均通过数据 FIFO 接口路由。
46.2.4 USB PHY/Transceiver 简介
USB Full-speed PHY/Transceiver的功能是将USB控制器的数字信号转换为USB总线信号电平,提供总线驱动能力,检测接收错误等。ESP32-P4/S3等芯片已内置一个USB Full-speed PHY,用户可直接使用芯片指定的USB D+/D-与外部USB系统通信。此外,ESP32-P4/S3还保留了外部PHY的扩展接口,用户可在需要时连接外部PHY。值得注意的是,ESP32-P4内置USB-OTG和USB-Serial-JTAG,两者共用一个内部PHY,同一时间只能有一个工作,下图为ESP32-P4的全速USB与USB-Serial-JTAG功能框图。
图46.2.3 全速USB 功能框图
对于同时具有USB-OTG和USB-Serial-JTAG两个外设的芯片,默认情况下USB-Serial-JTAG 与内部USB-PHY连接。用户可以直接通过USB接口进行下载或调试,无需额外配置。如需使用USB Host Driver或TinyUSB协议栈开发USB-OTG应用,在协议栈初始化时,USB-PHY连接会自动切换为USB-OTG,用户不必再进行配置。在USB-OTG模式下,如果用户需要使用USB-Serial-JTAG的下载功能,需要手动Boot到下载模式。
46.3 Tinyusb简介
Espressif 官方并未提供专属的 USB 协议库,而是基于市场上开源的 TinyUSB 协议库进行了封装。因此,若想学习 ESP32 系列芯片的 USB 协议,建议从 TinyUSB 入手。读者可以在https://github.com/hathach/tinyusb上获取相关资料并进行学习。下面我们了解一下Tinyusb吧。
TinyUSB是一个开源的嵌入式USB主机/设备栈库,主要用于支持小型微控制器上的USB功能。它由Adafruit开发和维护,旨在提供一个轻量级、跨平台、易于集成的USB协议栈TinyUSB支持多种USB设备类型,包括HID(人机接口设备)、MSC(大容量存储)、CDC(通信设备类)、MIDI(音乐设备数字接口)等,适用于各种嵌入式系统和物联网设备。下图为原生TinyUSB协议库架构示意图。
图46.3.1 原生TinyUSB协议库架构示意图
从上图可以看到,TinyUSB协议库由三层组成:应用层、协议栈层和MCU接口层。应用层是用户开发的核心,负责调用协议层的API来实现具体USB实现;协议栈层基于USB标准协议,提供主机和设备API及操作系统抽象支持;MCU接口层直接操作MCU的USB寄存器,是硬件驱动的基础。通过这种分层设计,TinyUSB屏蔽底层复杂性,开发者只需关注应用层和协议栈层即可快速构建USB应用。
下面,我们来看一下上图TinyUSB协议库各个模块的作用。
1,应用层(Application)
这是用户定义的应用程序代码,直接调用TinyUSB提供的接口。
2,主机类和设备API
1)TUH(Host Class API):主机功能相关接口。
2)TUD(Device Class API):设备功能相关接口。
3,USB驱动层
1)USBH(USB Host Driver):实现主机功能的驱动。
2)USBD(USB Device Driver):实现设备功能的驱动。
4,操作系统抽象层(OSAL)
TinyUSB通过将所有中断服务请求(ISR)事件推送到中央队列中,并在非中断上下文的任务函数中处理这些事件,从而实现了完全的线程安全。它使用信号量和互斥锁来管理对共享资源(如通信设备类(CDC)FIFO)的访问。因此,协议栈需要依赖操作系统(OS)的一些基础 API。目前,TinyUSB已原生支持FreeRTOS和RT-Thread操作系统,也可配置为裸机运行,方便开发者快速集成到不同环境中。
5,控制器驱动层
1)HCD(Host Controller Driver):主机控制器驱动。
2)DCD(Device Controller Driver):设备控制器驱动。
根据TinyUSB官方所述,TinyUSB协议库目前支持的CPU非常多,比如ESP32、STM32、WCH和GD等多个芯片厂商,但是并不是所有的芯片都支持,若我们想移植TinyUSB协议库到自己的项目工程,可以先看一下官方支持的CPU。
根据TinyUSB官方的说明,TinyUSB协议库目前支持多种CPU平台,例如ESP32、STM32、WCH和GD等多个芯片厂商的产品。然而,并不是所有的芯片都默认支持TinyUSB。如果需要将TinyUSB协议库移植到自己的项目中,建议首先查看官方文档中列出的已支持CPU平台,以确认目标芯片是否兼容,避免不必要的移植工作。
之前我们了解到,Esperssif官方并没有提供专属的 USB 协议库,而是基于TinyUSB 协议库进行了封装。下图为ESP32基于原生的TinyUSB封装了以下的组件。
图46.3.2 ESP32基于原生的TinyUSB封装的组件
通过上图可以看出,Espressif官方并未提供专属的USB协议库,而是基于开源的TinyUSB协议库进行了封装,并针对ESP32系列芯片(需要ESP-IDF≥5.0)开发了以下模块:
1,esp_tinyusb
支持大多数USB设备类(如 HID、CDC 等),适用于各种常见USB 设备需求。
2,usb_device_uac
专门用于支持 UAC(音频类)设备,适用于音频输入输出等音频相关设备的 USB 接口。
3,usb_device_uvc
专门支持 UVC(USB 视频类)设备,适用于视频设备如USB摄像头等的开发需求。
这些模块通过封装简化了 USB 功能的实现,为开发者提供了高效便捷的接口,以便在 ESP32 等微控制器上快速集成多种 USB 功能模块,涵盖音频、视频及其他通用设备类应用场景。 |