前几天使用逻辑分析仪并按如下配置抓取了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%的断轴其实都是可以修复的,而…
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广州漏水维修实用攻略|厨卫、阳台、外墙、屋顶与地下室处理|常见漏点处理及服务选择 - 盛隆防水 广州房屋的厨卫、阳台、外墙、屋面和地下空间处在不同受水环境中,漏点表现也会随位置变化。针对厨卫漏点,水迹通常与用水、管道和防水节点有关,阳台、外墙及屋面问题常在降雨后加重,地下空间则要留意墙地交界、结构…
SDK游戏盾怎么运作? 🎮 SDK游戏盾,是把防护模块直接接入客户端,让用户的连接先经过安全验证和防护节点,再进入真正的服务器。它不像普通高防IP只在服务器前面挡流量,还能结合客户端信息,判断请求是不是由真实应用发出。运作过程…
AI生产力三大支柱:机器学习、NLP与计算机视觉 1. AI作为生产力的时代已经到来当AlphaGo击败李世石的那一刻,人工智能就不再只是实验室里的玩具。七年过去,AI已经从棋类游戏走向了各行各业的生产线、办公室和创意工作室。我们正处在一个奇妙的转折点——AI不再只是工具,而是成为了真正的生…
Deceive终极指南:如何在拳头游戏中实现完美隐身状态伪装 Deceive终极指南:如何在拳头游戏中实现完美隐身状态伪装 【免费下载链接】Deceive 🎩 Appear offline for League of Legends, VALORANT, and Legends of Runeterra. 项目地址: https://gitcode.com/gh_mirrors/de/Deceive 你是否曾在《英雄联盟》…
STM32酒精检测系统实战:从传感器校准到掉电保护的工程化设计 那天晚上,实验室里只剩下我一个人调试代码。当我把MQ-3传感器靠近酒精棉球时,LCD1602上的数值瞬间飙升,蜂鸣器发出刺耳警报,红色LED疯狂闪烁——那一刻我突然意识到,这个看似简单的毕业设计项目,其实藏着很…
人形机器人量产真相:390万买的是可控性,不是酷炫 1. 这不是科幻片片场,是杭州滨江的量产车间“一拳碎墙”这四个字刚刷出来的时候,我正蹲在宇树科技杭州总部产线外围拍测试视频。手机弹出推送,标题里“390万”“人形高达”“量产”三个词像三颗子弹打在我视网膜上——不是因为贵,…
Dockerfile最佳实践:从基础镜像到多阶段构建的完整优化指南 1. 从“能跑就行”到“生产就绪”:为什么Dockerfile值得你花心思在容器化这条路上,我见过太多“一次性”的Dockerfile。它们往往诞生于一个紧急的需求:“赶紧把这个服务跑起来!”,于是开发者随手写下几行FROM、COPY、R…
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单 更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…
某智驾大牛创业 作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…
PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 在软件开发过程中,清晰的系统设计往往比编码本身更为关键。传统拖拽式UML工具虽然直观,却常常成为效率杀手——频繁的鼠标操作打断设计思路,版本控制困难,…
【RT-DETR涨点改进】29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 开篇故事 上个月帮一家安防厂商做项目优化,他们用RT-DETR做实时人流统计,部署在NVIDIA A10上。客户反馈说:“GPU利用率才30%,但延迟已经飙到40ms了,加人流量就丢帧。” 我远程一看,好家伙——生产环境里每个请求单独…
Postman 环境变量实战:3种动态设置方法与CI/CD集成避坑指南 Postman 环境变量高阶实战:动态管理与 CI/CD 深度集成在接口自动化测试领域,环境变量的灵活运用往往成为区分初级与高级测试工程师的关键能力。本文将深入探讨 Postman 环境变量的三种动态设置模式,并分享 Newman 在 CI/CD 流水线中的实战避坑…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…