知芯上篇 | APM32F407集成内部高速PHY,支持USB2.0通信
极海APM32F407系列USB模块介绍 ·
极海APM32F407系列工业级高性能MCU,支持USB2.0协议,兼容低速(1.5Mbps)、全速(12Mbps)和高速模式(480Mbps)。高速模式下集成了内部的PHY(物理层),可以节约外部器件成本,操作简便。
APM32F407高速模式下支持4K字节的专用RAM管理数据FIFO传输。单独一帧不需要应用程序参与,从而达到最大的传输带宽。作为设备时,支持最多6个端点,作为主机则支持最多12个通道。支持OTG标准,允许在主机和设备之间进行动态角色切换,支持模块内嵌的DMA传输。
USB简介 ·
USB(Universal Serial Bus)即通用串行总线,作为一种传输速度快、使用方便、连接灵活的数据通信技术被市场广泛使用,但大家对它的了解有多少呢?今天极海芯君就与大家来聊聊USB的发展历程、通讯形式。
USB传输标准进化史 ·
自1996年USB-IF(USB Implementers Forum)组织发布USB 1.0标准以来,USB已经演化了诸多版本。其中 USB1.1支持1.5Mbps低速模式和12Mbps全速模式,而USB2.0作为MCU常用数据通信版本,在兼容低速和全速的同时,还支持480Mbps的高速模式。
USB标准版本
标准 版本 | 发布 日期 | 官方代号 | 最大传输 速率 | 电压电流 支持 |
USB 1.0 | 1996.01 | Low-Speed | 1.5 Mbps | 5V/500mA |
USB 1.1 | 1998.09 | Full-Speed | 12 Mbps | 5V/500mA |
USB 2.0 | 2000.04 | High-Speed | 480 Mbps | 5V/500mA |
USB 3.2 Gen1 | 2008.11 | SuperSpeed | 5 Gbps | 15V/900mA |
USB 3.2 Gen*1 | 2013.07 | SuperSpeed+ | 10 Gbps | 20V/5A |
USB 3.2 Gen*2 | 2017.09 | SuperSpeed+ | 20 Gbps | 20V/5A |
USB 4 | 2019.09 | - | 40 Gbps | 20V/5A |
USB通信过程解析 ·
USB通信组件
USB通信由主机和设备(从机)组成,主机发起通信,符合条件的设备做出响应。最前线的端点接收主机数据,多个“志同道合”的端点组成接口,多个接口组成配置,一个设备可有个配置,然后USB通过四线电缆传输信号和电源。
Q:数据线(D-/D+)和端点有什么关系?
A:数据线是传送带,端点负责向传送带收放数据,而对应的主机则是使用通道来收放数据。端点存在设备内部,用于管理数据。
USB描述符
Q:如何区分设备呢?
A:这就涉及到USB描述符了。描述符是USB协议规定的符号集,可以分为设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符等。
描述符 | 用途 |
设备描述符 | 表明协议版本、厂商信息、使用的类信息等 |
配置描述符 | 表明配置用到的接口数、电源信息、集合总长度等 |
接口描述符 | 表明接口使用的类、接口用到的端点数等 |
端点描述符 | 表明该端点的类型、端点最大包长等端点属性 |
字符串描述符 | 包含字符串数据 |
*需注意,接口描述符和端点描述符通常是和配置描述符绑定的。配置描述符自身长度为9字节,接口、端口等描述符衔接在配置描述符后面。所以主机只需要获取配置描述符集合就能知道设备的通信信息。
Q:什么是USB的类?
A:USB常见的传输形式有鼠标、U盘、音视频等,不同类型的传输有着不同的传输规则,同类型传输规则则保持一致,这就产生了“类”的概念。主机识别出设备的类代码,就会按照该类的规则来传输。不同基类还有自己的子类和协议。类代码一般存放于接口描述符,少数存放于设备描述符。
USB请求
USB规定了8个字节作为一个请求,通过主机发送标准的获取描述符请求,设备接收到请求后,将对应描述符发送至主机。
USB设备请求结构
字节序号 | 域 | 描述 |
0 | bmRequestType | 字节中每个位的意义: D7: 表明数据阶段的传输方向 0=主机至设备 1=设备至主机 D6~D5: 表明请求的类型 0=标准请求 1=类请求 2=厂商请求 3=保留 D4~D0: 表明请求的接收方 0=设备 1=接口 2=端点 3=其他 4..31=保留 |
1 | bRequest | 表明具体请求 |
2、3 | wValue | 根据不同请求,其含义不同 |
4、5 | wIndex | 根据不同请求,其含义不同 |
6、7 | wLength | 数据阶段的数据长度,以字节为单位,无数据则为0 |
表注:D0表示字节的第0位,D1表示第1位,依次类推
USB标准请求
bmRequestType | bRequest | wValue | wIndex | wLength |
0000 0000B 0000 0001B 0000 0010B | CLEAR_FEATURE (1) | 特性选择 | 0 接口号 端点号 | 0 |
1000 0000B | GET_CONFIGURATION (8) | 0 | 0 | 1 |
1000 0000B | GET_DESCRIPTOR (6) | 描述符类型、索引 | 0或语言ID | 描述符长度 |
1000 0000B | GET_INTERFACE (10) | 0 | 接口号 | 1 |
1000 0000B 1000 0001B 1000 0010B | GET_STATUS (0) | 0 | 0 接口号 端点号 | 2 |
0000 0000B | SET_ADDRESS (5) | 设备地址 | 0 | 0 |
0000 0000B | SET_ CONFIGURATION(9) | 配置值 | 0 | 0 |
0000 0000B | SET_DESCRIPTOR (7) | 描述符类型、索引 | 0或语言ID | 描述符长度 |
0000 0000B 0000 0001B 0000 0010B | SET_FEATURE (3) | 特性选择 | 0 接口号 端点号 | 0 |
0000 0001B | SET_ INTERFACE (11) | 备用接口号 | 接口号 | 0 |
1000 0010B | SYNCH_FRAME (12) | 0 | 端点号 | 2 |
表注:B后缀表示二进制
利用标准请求即可实现设备枚举,枚举的过程其实就是主机识别设备的过程。枚举的大致流程:
*除了标准请求外,还有类请求、供应商请求,当请求中bmRequestType的第5、6位的值对应为类请求时,该8个字节请求的规范就会按照类的规则来定义。
USB传输类型
USB控制传输
主机发送请求至设备,设备返回描述符至主机,主机收到设备发过来的描述符,需要返回一个0数据包表示状态,表明成功接收数据,这个传输方式在USB中称为控制传输。
一次USB控制传输需要Setup事务发送请求至设备,然后根据请求判断数据传输方向及数据长度,数据事务(IN或OUT)之后,数据的接收方需要发送一个0长度数据事务(IN或OUT)来结束控制传输。控制传输必须有主机的请求(Setup),而数据过程取决于该请求,若无数据,则直接到状态过程。状态过程属于数据包,但它没有内容。
USB批量传输 | USB中断传输 | USB同步传输 |
没有请求过程,只有数据收发。 特点:传输数据量大,实时性不高。 常用于U盘等大容量传输设备。 | 没有请求过程,只有数据收发。 特点:数据传输量不大,实时性高 常用于鼠标、键盘等设备。 *中断传输只是一个概念,不是中断异常,它在固定的实际间隔,主机间歇性地安排一次传输,使得及时收到设备更新数据。 | 没有请求过程,只有数据收发。 特点:传输量大且实时性高,但对数据准确性要求不高。 *同步传输的事务和其他传输不一样,它没有应答包。通常事务的结尾会以应答包汇报此事务的传输状态,当没有应答包时,可以通过数据包的CRC来判断数据的准确性。 |
令牌包由主机发出,设备接到令牌包后,如果为Setup,则接收数据包(8字节请求);如果为IN令牌,则发送数据至主机,OUT令牌相反。握手包是在数据包结束之后,数据的接收方进行应答,应答方式有ACK(确认)、NAK(未就绪)、STALL(出错)和NYET(高速OUT事务中表示无空间)。
MCU中USB设备的数据流
数据缓冲区-FIFO
MCU通常使用FIFO作为数据缓存区,MCU中的FIFO是一种先进先出的数据缓存寄存器。从USB事务和包中,我们可以了解到,当设备收到主机的令牌包后,根据不同的令牌包,进行接收或发送数据。比如收到了Setup令牌,那设备会先将数据保存在接收FIFO中,置起相关标准位,设备就可以去接收FIFO中取出Setup请求;比如收到的是IN令牌,那设备会从发送FIFO中发送预先压栈的数据,若发送FIFO无数据则返回NAK握手包。