核心内容摘要
软件设计师实战:数据流图分层设计与平衡原则解析
USB协议核心知识
USB协议架构
1 协议分层USB协议采用分层架构设计从下至上分为物理层、链路层、协议层、应用层各层独立封装降低开发复杂度。
1.
1 物理层定义USB接口的硬件特性包括引脚定义、电压等级、传输速率等。
USB
0支持低速
5Mbps、全速12Mbps、高速480MbpsUSB
x新增超高速5Gbps、超高速10Gbps模式引脚数量与信号定义更复杂
1.
2 链路层负责数据的编码/解码、差错检测与纠正、数据包的收发控制。
采用差分信号传输通过NRZI编码方式提升抗干扰能力支持CRC校验确保数据完整性
1.
3 协议层定义USB的核心通信协议包括设备枚举、端点配置、数据传输类型、控制命令等是开发调试的核心关注层。
核心作用将应用层的功能需求转化为可在总线上传输的标准化数据包解析总线上接收的数据包并向上层反馈作为物理层/链路层与应用层的桥梁直接决定设备与主机的通信兼容性和稳定性
1.
4 应用层针对不同USB设备类如HID、CDC、存储类等定义的专用协议规范决定设备的具体功能实现。
2 协议层核心定义协议层的核心是围绕数据包交互构建的规则体系。
1.
1 数据包结构所有USB通信均以数据包为单位协议层定义了统一的基础字段格式同时针对不同类型数据包扩展专属字段。
USB数据包基础结构通用框架字段长度取值范围/固定值核心功能同步字段SYNC8位1字节固定值0x80时钟同步数据包起始标识包标识符PID8位1字节类型码4位校验码4位包类型标识地址字段ADDR7位0~127设备寻址端点字段ENDP4位0~15端点寻址数据字段DATA可变上限64/1024字节承载业务数据校验字段CRC5位/16位-数据完整性校验结束字段EOP3位2低1高包结束标识说明地址字段ADDR与端点字段ENDP仅存在于令牌包中DATA包、握手包无这两个字段数据字段DATA仅存在于SETUP令牌包和DATA包中其他类型包无此字段校验字段CRC的类型与长度随包类型变化
1.
2 各字段详细定义
1.
2.
1 同步字段SYNC长度8位1字节固定值0x80二进制10000000功能同步主机与设备的时钟频率确保双方对后续数据的采样时序一致SYNC字段是数据包的起始标识设备检测到该字段后开始准备接收后续数据
1.
2.
2 包标识符PID长度8位结构“4位类型码 4位校验码”校验码为类型码的反码用于校验PID传输正确性根据PID值数据包分为三大类数据包类型常见PID值十六进制类型码二进制核心功能令牌包TokenIN(
、OUT(E
、SETUP(2D)、SOF(A
对应类型编码发起传输请求指定方向、地址、端点数据包DataDATA0(C
、DATA1(4B)、DATA2(
、MDATA(0F)对应类型编码承载实际业务数据支持交替重传机制握手包HandshakeACK(D
、NAK(5A)、STALL(1E)、NYET(
对应类型编码反馈传输结果无数据字段注SOF仅适用于USB
0低速/全速模式NYET为高速模式专属各类型详细说明令牌包Token Packet用于发起一次传输请求告知设备传输方向、地址及端点常见PIDIN0x69主机从设备读取数据OUT0xE1主机向设备写入数据SETUP0x2D主机向设备发送控制命令SOF0xA5帧起始标记仅USB
0低速/全速模式用于同步帧周期数据包Data Packet用于承载实际数据仅在令牌包发起后传输无令牌包前置时设备会忽略DATA包常见PIDDATA00xC3DATA10x4BDATA20x87高速模式MDATA0x0F高速模式用于支持批量传输和等时传输的数据包交替机制解决数据重传时的歧义握手包Handshake Packet用于反馈传输结果无数据字段仅作为响应包存在不能主动发起常见PIDACK0xD2确认数据接收成功NAK0x5A设备忙无法接收/发送数据主机需重试STALL0x1E设备功能异常或不支持该请求需主机查询状态NYET0x96高速模式专属告知主机无需重试
1.
2.
3 地址字段ADDR长度7位取值范围0~127功能标识总线上的USB设备特性地址0为默认地址仅用于设备枚举阶段复位后设备默认使用地址0枚举完成后主机为设备分配唯一的非0地址地址字段仅存在于令牌包中DATA包和握手包无此字段依赖前置令牌包的地址信息定位设备
1.
2.
4 端点字段ENDP长度4位取值范围0~15功能标识设备上的具体端点特性端点0为控制端点所有设备必带用于枚举和控制命令交互其他端点为功能端点需通过描述符定义属性ENDP字段与ADDR字段组合实现设备-端点的精准寻址仅存在于令牌包中
1.
2.
5 数据字段DATA长度可变限制需符合对应端点的最大数据包大小限制适用范围仅存在于DATA包和SETUP令牌包中不同类型的数据字段SETUP包数据字段固定为8字节结构如下字段长度字节序说明请求类型1字节-请求方向、类型、接收方请求码1字节-具体的命令代码值2字节Little-Endian命令参数索引2字节Little-Endian索引/偏移量长度2字节Little-Endian数据长度DATA包数据字段承载实际业务数据如描述符内容、传感器数据、文件数据等高速模式下最大长度为1024字节全速/低速模式下最大为64字节
1.
2.
6 校验字段CRC分为CRC5和CRC16两种根据数据包类型选择适用数据包类型校验长度校验覆盖范围核心作用令牌包IN/OUT/SETUP5位ADDR字段ENDP字段校验寻址信息正确性DATA包16位整个数据字段校验业务数据完整性特性CRC校验由发送方计算生成接收方验证若校验失败则丢弃数据包触发重传等时传输除外
1.
2.
7 结束字段EOP长度2位低电平1位高电平功能标识数据包结束特性设备检测到EOP后停止数据接收完成一次数据包处理EOP字段由硬件自动生成无需固件/驱动干预传输过程中EOP信号异常会导致数据包丢失
1.
3 数据包交互逻辑USB总线交互以令牌包-数据包-握手包的三段式流程为核心部分传输类型简化遵循主机主导、设备响应的原则。
1.
2.
1 基础交互规则
交互发起所有交互由主机发起主机通过发送令牌包IN/OUT/SETUP指定传输方向、目标设备及端点开启一次传输周期设备通过持续监测总线解析SYNC和PID字段当检测到匹配自身地址和端点的令牌包时开始响应否则忽略该令牌包及后续数据包
数据传输根据令牌包类型执行对应数据传输令牌包类型传输流程数据流向SETUP主机发送8字节DATA包 → 设备接收 → 设备返回握手包主机→设备OUT主机发送DATA包 → 设备接收校验CRC16 → 设备返回ACK主机→设备IN设备发送DATA包 → 主机接收校验 → 主机返回ACK设备→主机特性SETUP令牌包后主机立即发送8字节DATA包控制命令参数设备接收SETUP数据后无需返回DATA包直接反馈握手包OUT传输校验成功后返回ACK失败则不返回握手包主机超时后重试IN传输主机校验成功后返回ACK失败则不返回设备超时后重试
握手反馈握手包是传输结果的唯一反馈主机根据设备返回的握手包调整后续操作握手包类型含义主机后续操作ACK确认数据接收成功结束本次传输进入下一次传输周期NAK设备忙无法接收/发送数据等待预设时间后重新发送令牌包重试次数由固件/驱动配置STALL设备功能异常或不支持该请求停止传输发起获取设备状态命令排查异常原因无握手包超时判定为超时触发重传或报错
帧同步低速/全速模式主机每1ms发送一次SOF令牌包PID0xA5SOF包包含帧编号11位用于同步设备的中断传输周期和等时传输带宽分配设备根据SOF包的帧编号调整自身数据发送时序确保实时性传输的稳定性高速模式下无SOF包通过总线时钟同步时序
异常处理传输过程中若出现以下问题接收方会丢弃数据包不返回握手包CRC校验失败EOP信号异常数据长度超限主机检测到超时默认超时时间为10ms~50ms后会重新发起令牌包重试重试次数达到阈值后判定传输失败向上层返回错误信息等时传输因无重传机制校验失败则直接丢弃数据优先保证传输速率。
1.
4 不同传输类型的数据包交互差异
1.
2.
1 控制传输采用SETUP阶段 DATA阶段 Status阶段三段式交互阶段交互内容说明SETUP阶段SETUP令牌包 8字节DATA包 ACK握手包发送控制命令DATA阶段IN/OUT令牌包 DATA包 ACK握手包可选传输数据无数据时跳过Status阶段反向握手设备向主机发送状态数据确认配置完成特性全程依赖端点0优先级最高可抢占其他传输类型的总线资源
1.
2.
2 中断传输主机按预设周期通过端点描述符配置1ms~255ms发送IN令牌包设备响应DATA包主机返回ACK若设备无数据则返回NAK主机下周期重试无STALL反馈中断设备异常时直接停止响应适用于小量实时数据传输
1.
2.
3 批量传输主机在总线空闲时发送IN/OUT令牌包设备响应DATA包主机返回ACK若设备忙则返回NAK主机等待总线空闲后重试支持DATA0/DATA1交替机制解决重传歧义无固定传输周期优先保证数据完整性适用于大量非实时数据传输
1.
2.
4 等时传输主机按固定周期发送IN/OUT令牌包设备响应DATA包无握手包反馈不校验CRC不重传占用固定总线带宽传输速率稳定适用于音视频等实时性要求极高的场景允许少量数据丢失
1.
5 设备地址与端点管理地址管理协议层规定主机为每个接入设备分配唯一的7位地址0~127默认地址0用于枚举阶段枚举完成后使用分配的唯一地址通信端点管理每个设备支持最多16个端点0~15端点0固定为控制端点用于枚举和控制命令交互其他端点需通过描述符定义传输类型、方向、数据包大小等属性协议层负责端点的寻址和数据路由
1.
6 控制命令集协议层定义了标准化的控制命令主机通过这些命令完成设备枚举、配置、状态查询等操作核心命令功能说明获取描述符Get Descriptor读取设备描述符信息设置地址Set Address为设备分配USB地址设置配置Set Configuration选择设备配置获取状态Get Status查询设备状态命令通过SETUP令牌包发起配合数据和握手包完成交互
1.
7 传输时序规则协议层明确了不同传输类型的时序逻辑传输类型时序规则目的控制传输三阶段Setup、Data、Status时序确保配置的完整性中断传输主机查询周期满足实时性要求批量传输总线空闲抢占机制保证数据完整性等时传输固定带宽分配规则确保传输速率稳定这些规则确保多种传输类型在同一总线上有序共存避免冲突。
3 协议层实现要点协议层的实现需依托硬件USB控制器和固件/驱动的协同。
1.
1 USB控制器驱动适配固件侧配置USB控制器的寄存器使能对应的传输模式、端点属性、数据包大小绑定端点中断服务函数ISR主机侧驱动识别USB控制器类型对接协议层的数据包收发接口实现地址分配、命令下发等逻辑
1.
2 数据包收发与解析固件侧通过USB控制器的FIFO缓冲区接收和发送数据包在中断服务函数中解析PID区分令牌包、数据包和握手包根据命令类型执行对应操作示例接收SETUP命令后读取描述符并返回主机侧通过控制器接口发起令牌包等待设备返回数据包或握手包处理重传、STALL等异常情况
1.
3 枚举流程的协议适配固件侧需严格按照协议层定义的枚举时序在不同阶段响应主机的命令示例复位后准备好设备描述符地址分配后切换至新地址响应配置描述符请求主机侧需遵循枚举步骤逐步获取描述符并完成配置处理枚举过程中的超时、描述符错误等异常
1.
4 异常处理机制协议层需实现标准化的异常处理设备侧响应含义主机侧处理NAK设备忙需重试STALL功能异常需查询设备状态同时需处理总线复位、设备断开等突发情况确保通信链路的稳定性。
4 典型例子HID设备枚举的协议层交互过程以常见的USB键盘HID类设备为例说明协议层在枚举过程中的具体交互实现。
1.
1 复位阶段主机检测到键盘接入后通过D引脚发送复位信号低电平保持10ms以上协议层触发设备侧USB控制器复位设备恢复默认状态地址设为0仅端点0使能等待主机命令
1.
2 获取设备描述符主机发送SETUP令牌包PIDSETUPADDR0ENDP0携带获取设备描述符命令请求类型0x80请求码0x06值0x0000索引0x0000长度0x0012设备响应设备侧端点0中断触发解析SETUP数据包从固件缓冲区读取18字节设备描述符通过DATA1数据包返回包含VID0x0483PID0x5750设备类0x00接口类定义等信息主机确认主机接收后返回ACK握手包确认数据接收成功
1.
3 分配地址主机发送SETUP令牌包携带设置地址命令请求类型0x00请求码0x05值0x0001索引0x0000长度0x0000设备响应设备解析命令后将USB控制器的地址寄存器设为1返回ACK握手包后续通信后续主机与设备的通信均使用地址
11.
4 获取配置描述符主机发送SETUP令牌包携带获取配置描述符命令请求类型0x80请求码0x06值0x0200索引0x0000长度0x0029设备返回配置描述符9字节含供电方式、最大电流、接口数量1接口描述符9字节含接口类0x03HID类端点数量1HID类描述符16字节含HID版本、报告描述符长度端点描述符7字节含端点
中断输入最大数据包大小8查询周期10ms主机确认主机接收后返回ACK确认描述符获取完成
1.
5 设置配置主机发送SETUP令牌包携带设置配置命令请求类型0x00请求码0x09值0x0001索引0x0000长度0x0000设备响应设备解析命令后启用接口1和端点1配置中断传输参数返回ACK握手包完成枚举进入工作状态
1.
6
总结上述过程中协议层全程主导交互逻辑主机侧协议层按枚举时序下发标准化命令设备侧协议层解析命令并返回合规数据双方通过PID识别数据包类型通过握手包确认交互状态严格遵循地址分配、描述符交互、配置启用的协议规则最终实现设备与主机的通信建立若协议层实现存在偏差如描述符长度错误、地址切换延迟会导致枚举失败设备无法被主机识别。
5 设备枚举流程USB设备接入主机后需完成枚举流程才能建立正常通信枚举是开发调试中易出问题的环节。
1.
1 枚举核心步骤步骤操作说明
设备上电USB设备接入主机后主机通过VBUS引脚为设备供电标准USB端口提供5V/500mAUSB
x可提供更多功率
主机检测主机通过D、D-引脚的电平变化检测到新设备接入低速/全速设备拉低D-高速设备先拉低D-协商后切换至高速模式
复位设备主机向设备发送复位信号设备进入默认状态使用默认端点0控制端点进行通信
读取设备描述符主机通过端点0读取设备的设备描述符获取VID、PID、设备类等基础信息
分配地址主机为设备分配唯一的USB地址设备后续使用该地址进行通信
读取配置描述符主机读取设备的配置描述符、接口描述符、端点描述符了解设备的配置选项、接口数量及端点属性传输类型、数据包大小等
设置配置主机根据设备描述符信息选择合适的配置并发送设置命令设备进入配置状态完成枚举
USB传输类型USB协议定义了四种传输类型适用于不同的应用场景开发时需根据需求选择对应的传输类型及端点配置。
1 传输类型对比传输类型核心特性数据包大小典型应用场景优先级控制传输Control枚举、配置修改、命令交互双向传输端点0设备枚举、控制命令最高批量传输Bulk大量数据传输对实时性要求低但要求数据完整性支持重传高速512字节/USB
x 1024字节U盘、打印机中等中断传输Interrupt小量数据的实时传输固定查询周期支持重传描述符定义键盘、鼠标、传感器中等等时传输Isochronous实时性要求极高的大量数据传输无重传和CRC校验允许数据丢失高速1023字节摄像头、音频设备低等时优先
2 各传输类型详细说明
2.
1 控制传输Control Transfer用于设备枚举、配置修改、命令交互等核心操作具有最高优先级支持双向传输依赖端点0实现传输过程分为Setup阶段、Data阶段可选、Status阶段
2.
2 批量传输Bulk Transfer适用于大量数据传输对实时性要求低但要求数据完整性支持CRC校验和重传机制常见于U盘、打印机等设备USB
0高速模式下批量端点最大数据包大小为512字节USB
x可提升至1024字节
2.
3 中断传输Interrupt Transfer适用于小量数据的实时传输主机定期查询设备端点获取数据具有固定的查询周期支持重传常见于键盘、鼠标、传感器等HID设备中断端点的最大数据包大小和查询周期需在描述符中定义
2.