每周分享】USB协议波形中的SOF包为何如此设计?令我疑惑不解
前几天使用逻辑分析仪并按如下配置抓取了USB键盘的USB通信波形差分信号线D和D-即为Data和Data-USB通信速度为full sped全速模式在没有任何按键操作的时候同时Wireshark工具也没有监控到USB键盘和电脑的通信报文的时候我起初以为这个时候应该没有波形才对可是事实证明我错了逻辑分析仪上面却是抓到了周期约为1ms的波形数据这个1ms而已可以称为总线空闲时间打开看了一下波形数据详情格式上都一样如下面所示标注为“SOF”字样的协议波形实际时间不是刚好1ms而是集中在997us左右差了3us但这种误差已经超出了USB2.0规范对SOF包发送周期的误差范围限制即允许误差是±0.05%0.9995 ms 至1.0005 ms那为什么这里会有3us左右的时间呢其实我们可以计算一下SOF包的总线有效带宽时间SOF包传输时间1000us-997us3us也可以来计算一下SOF包总共32个bit位全速USB的时钟频率是12MHz则SOF包的传输时间为:(1/12)*32 250 83.3333ns*32250ns 2916ns近似3us刺激吧我们从逻辑分析仪上导出时间数据也可以看出每个数据点的耗时可以精确到ns对于这种周期固定且波形格式一样的数据就好像那种“心跳包”一样比如wifi模块什么的都有这种机制其主要目的是主机为了与设备保持连接状态防止设备断连。于是乎进一步研究了一下SOFSOF究竟是什么呢USB协议用它来干啥的所谓的SOF其实是一种数据包在全速Full Speed12MbpsUSB通信时主机为了保证同步和确定时间基准会严格按照每1ms一次的频率发送这个SOF包它标志着每一帧的开始所以其全称其实就是Start Of Frame即为帧起始包。另外如果是在高速High Speed480MbpsUSB通信那么我在逻辑分析仪上看到的SOF包的周期应该是125us而对于低速Low Speed1.5Mbps设备是不接收SOF包的它们依靠集线器产生的“Keep Alive”信号来维持状态。当然我们这里所说的USB通信速率主要是针对USB2.0标准来说的对于USB3.0标准当然更快。那它有什么作用呢在USB协议通信中SOF包的作用主要体现在下面三个方面1、标记帧起始与同步它是主机定义时间基准的关键信号告诉所有设备“新的1毫秒周期开始了”此时设备可以校准自身时钟从而实现与主机的时序同步鉴于此MCU的USB时钟源尽量使用外部时钟其精度比内部时钟要好一些2、防止设备休眠在总线上没有数据传输也就是总线处于空闲状态时这些周期性发送的SOF包就像“心跳”信号一样能让设备继续保持工作状态不会误以为被断开而进入低功耗模式3、支撑同步传输对于音频、视频等对实时性要求高的实时传输设备会利用SOF包来确保数据流以稳定的速率发送从而避免卡顿或不同步等现象。现在我们对SOF包有个基本概念了那接下来我们再一起来看看SOF包的帧格式以及为什么要这么设计呢我们以下面这个波形为例先来说说波形上相关符号的含义我们可以看出来SOF包主要包括4个字段Packet fieldsSYNC、PID、Frame、CRC5其中SYNC的位规则和其他三个不一样后三个是按照LSB在前读取的SYNC则相反。那“USB singnalling:Symbols”对应的K和J是什么含义呢J 和 K 并非代表数字“0”或“1”而是USB协议定义的两种差分信号状态是USB通信中最基础的物理信号单元通过D和D-两条数据线的电压高低来共同表示即对于全速/高速设备D为高电平D-为低电平表示J状态D-为高电平D为低电平表示K状态USB总线的空闲状态一般是被定义为J状态如下图所示当主机要发送一个SOF包时它会驱动总线从空闲的J状态切换到K状态。这个由J到K的跳变就是数据包开始的明确信号:当遇到数据0时信号电平翻转J变KK变J当遇到数据1时信号电平保持不变J保持JK保持K如下图这样SOP的含义Start OfPacket标志数据包的开始EOP的含义End OfPacket标志数据包的结束SE0的含义Single-EndedZeroD和D-两条线同时为低电平这个状态非常重要用于表示数据包结束EOP、总线复位Reset以及设备断开连接另外如果出现SE1即D和D-两条线同时为高电平注意了这是一个非法的总线状态它的出现通常表示发生了错误。说完波形上相关的符号所代表的含义后接下来我们再逐个讲解SOF包的4个字段1、SYNC同步域占8个bit位是必不可少的前导码其核心作用是实现接收端与发送端的时钟同步并标记数据包的开始在USB的NRZI编码规则下SYNC是一串固定的二进制序列即低速和全速USB设备为00000001高速USB设备为00000000000000000000000000000001占32个bit位如果用K和J信号符号来解释的话SYNC序列是一串特定的“KJ”交替信号 “KJKJKJKK”接收端通过锁定这个固定的翻转模式可以校准自己的时钟与主机发送的数据速率保持同步另外需要注意的是不止是SOF包有SYNC信号USB总线上的每一个数据包如事务包、数据包等都是以SYNC开头的如下图所示这些通过USB专用的协议分析仪lecroy USB advisor bus andprotocol analyzer抓取的帧数据包或者我按键时产生的波形数据也会有SYNC当SYNC出现非00000001的其他值的时候就表示出现了SYNC ERROR就需要你分析原因了我的这个设备就出现了但目前还没发现有什么影响不过也在排查原因中……2、PID包标识符Packet ID占8个bit位SOF包的PID是固定的为101001010XA5其作用即为标识该数据包是一个SOF包其中低4位是类型高4位是低4位的校验码按位取反所得如下图所示发送时按照最低有效位LSB优先的顺序在总线上传输。3、Frame帧编号Frame Number占11个bit位表示当前是第多少个SOF包即随SOF包递增加1达到最大值后又重新开始递增比如下面这两个连续的SOF包4、CRC55位循环冗余校验码主要是对帧编号进行校验占5个bit位其计算核心是一个初始值为全1USB规范中的强制要求与许多CRC算法从0开始不同、输入数据低位在前、最后结果按位取反的CRC算法。以上通过结合波形数据对USB协议波形的SOF包进行了拆解和分析疑惑的我算是知道为何要如此设计了。另外当我按下USB键盘的按键时会产生更多的波形数据如下所示……咋一看里面有地址address信息端点endpoint信息等这个地址为38其实就是我这个USB键盘当前的设备地址这不就和Wireshark抓包的数据包对应上了嘛至于USB协议的解析后续有机会再写了估计内容会比较多需要些时间。果真是活到老学到老学无止境---------------------作者dffzh链接https://bbs.21ic.com/icview-3518683-1-1.html来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。

相关新闻

机械键盘断轴修复全攻略:90%断轴可修复的实用方案

机械键盘断轴修复全攻略:90%断轴可修复的实用方案

如果你最近遇到了机械键盘断轴的问题,可能已经查过不少资料,得到的答案大多是"换轴吧,修不了"。但实际情况真的是这样吗?今天我要告诉你一个被大多数人忽略的事实:90%的断轴其实都是可以修复的,而…

2026/10/19 17:52:28 阅读更多 →
物语系列MAD/EDIT创作指南:从素材管理到特效实现

物语系列MAD/EDIT创作指南:从素材管理到特效实现

物语系列作为日本轻小说家西尾维新的代表作,以其独特的叙事风格、复杂的角色关系和大量对话驱动的剧情闻名。当粉丝将这一系列动画作品进行二次创作,特别是制作MAD(Music Anime Douga)或EDIT视频时,不仅需要精准把握原…

2026/10/20 19:44:12 阅读更多 →
GraphQL Schema即代码时代来临:AI驱动的SDL→TypeScript→Prisma→PostgreSQL全自动映射(含v2.4.0实测基准数据)

GraphQL Schema即代码时代来临:AI驱动的SDL→TypeScript→Prisma→PostgreSQL全自动映射(含v2.4.0实测基准数据)

更多请点击: https://codechina.net 第一章:GraphQL Schema即代码时代来临:AI驱动的SDL→TypeScript→Prisma→PostgreSQL全自动映射(含v2.4.0实测基准数据) GraphQL Schema Definition Language(SDL&…

2026/10/20 23:13:40 阅读更多 →

最新新闻

钢价上涨为何反而推动自动化立体库需求?成本账背后的行业逻辑

钢价上涨为何反而推动自动化立体库需求?成本账背后的行业逻辑

一个荒诞的行情,正在悄悄改变仓储物流行业的项目决策逻辑。往年钢材报价上涨,大家第一反应是“货架又要贵了”“项目成本又失控了”;但这一轮钢铁涨价之后,我反而在几个项目交流里看到另一幕:多个原本犹豫着“先上普通…

2026/10/21 5:15:05 阅读更多 →
快速事件架构rea:从零构建可扩展的异步事件驱动框架

快速事件架构rea:从零构建可扩展的异步事件驱动框架

好几次遇到项目已经到了“接口越改越慢、业务越糊越乱”的阶段,我才开始认真思考整套系统内部应该用什么方式协作。于是有了标题里这个很短的代号 rea,它后面全称是 Rapid Event Architecture,也就是快速事件架构。我最初只想做一套轻量的事件…

2026/10/21 5:15:05 阅读更多 →
响应式架构实战:从rea概念到实时数据处理系统搭建

响应式架构实战:从rea概念到实时数据处理系统搭建

1. 从“rea”这个标题说起:一个被低估的缩写背后藏着什么第一次看到“rea”这个标题的时候,我脑子里蹦出来的第一反应是——这大概率又是一个被缩写玩坏的项目名。做技术的人都有个习惯,喜欢把长名字砍成三四个字母,图省事、图好记…

2026/10/21 5:15:05 阅读更多 →
机器人地图开发实战:数据结构、并发更新与可视化避坑指南

机器人地图开发实战:数据结构、并发更新与可视化避坑指南

1. 从“lingbot-map”这个名字说起:它到底想解决什么问题第一次看到“lingbot-map”这个项目名,我脑子里冒出来的第一个念头是:这大概率是一个跟“机器人建图”或者“地图可视化”相关的东西。拆开来看,“ling”可能是某个前缀或者…

2026/10/21 5:15:05 阅读更多 →
lingbot-map轻量机器人地图构建实战:从环境配置到多机共享

lingbot-map轻量机器人地图构建实战:从环境配置到多机共享

1. 从“lingbot-map”这个名字说起:它到底想解决什么问题第一次看到“lingbot-map”这个项目名,我脑子里蹦出来的第一个念头是:这大概率是一个跟“机器人建图”或者“地图可视化”沾边的东西。拆开来看,“ling”这个前缀在不少项目…

2026/10/21 5:15:05 阅读更多 →
插件化架构如何重塑知识工作流:从设计到落地的完整指南

插件化架构如何重塑知识工作流:从设计到落地的完整指南

1. 从"知识工作插件"这个命名说起:它到底想解决什么问题第一次看到"knowledge-work-plugins"这个命名,我的直觉是:这不是一个普通的工具库,而是一套面向"知识工作者"的扩展机制。所谓知识工作者&am…

2026/10/21 5:14:05 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →