[USB波形分析] 全速USB波形数据分析(一)
在之前的文章一次CAN波形分析之旅里,根据示波器采集的波形数据,详细地分析了CAN通信。今天来分析USB数据,还是同样的流程,但是这次使用matplotlib来协助分析。
USB基本波形
USB通过一对差分信号进行数据传输,这对差分信号叫D+和D-,用示波器抓取一段D+和D-的信号,保存成CSV格式,用matplotlib绘制该信号:
分了方便分析,我们将D+和D-分别绘制:
标记数据包(Packet)的组成:
进一步细化数据包(Packet)的内容
USB数据分析
起始帧数据包(FRAMEPACKET)
全速USB会每隔1毫秒发送一包起始帧数据包(FRAME PACKET),由PID,FRAME_NUMBER和CRC三部分:
PID(Packet ID)为数据包标识符,为8位长度,低4位为标识符数值,高4位值为低4位数值按位取反。起始帧数据包对应的PID为1010 0101(最左侧为最高位,下同)
这里需要注意,USB数据流先传输最低字节的最低位,同时按照NRZI方式编码,即(值不变表示数据'1',值发生改变表示数据'0')。
令牌数据包(TOKEN PACKET)
令牌数据包由PID,ADDR,ENDP和CRC四个段组成。一共有三种令牌:
- IN
- OUT
- SETUP
令牌IN对应的PID为0110 1001
令牌OUT对应的PID为1110 0001
令牌SETUP对应的PID为0010 1101
数据包(DATA PACKET)
数据包由PID,PAYLOAD,CRC三个段组成,
DATA1对应的PID为0100 1011
握手包(HANDSHAKE PACKET)
握手包只包含PID段,全速USB一共有3种握手状态
-
-
- ACK
-
报告数据已经被成功收到。
-
-
- NAK
-
报告设备临时无法发送或接收数据。也用于在中断事务期间通知主机没有要发送的数据。
-
-
- STALL
-
设备发现自己处于需要主机干预的状态(端点停止,或者不支持控制管道请求)
ACK状态对应的PID为1101 0010
NACK状态对应的PID为0101 1010
-----------------------------------------------------------------------------------END
[参考资料]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具