首页 > 其他分享 >嵌入式学习之USB协议(二)

嵌入式学习之USB协议(二)

时间:2024-07-23 13:28:46浏览次数:8  
标签:协议 USB 主机 嵌入式 CRC STALL 端点 设备

上一节我们讲了USB的电气信号,今天我们讲帧的组成内容;请注意,USB通信中的“帧”相当于串口通信中的“字节”。在常见的串口,I2C,SPI等等,均以字节为单位,通过分析字节组成的数据得到信息;USB以帧为单位,通过帧组成的数据得到信息,不完整的帧组成的信息没有任何意思,直接丢弃。

帧的组成

一个完整的帧是由SOP+SYNC+包内容+SOP组成的,缺其中任何一个都可以认为是异常帧,丢掉不用即可。

包内容又与PID相关,PID类型分为四种,令牌包,数据包,握手包和特殊包;接下来详细论述下这几个类型包的组成部分。
包的组成部分

Token令牌包

从下图IN/OUT/SETUP包的帧格式可以清楚地知道,设备地址是7Bits,所以地址范围为0-127,最多接入128个设备;LS设备最多3个端点,FS/HS设备最多16个端点。
IN/OUT/SETUP帧格式
SOF帧没有设备地址和端点号,被帧编号替换;帧编号由11个字节组成,主机每发出一个帧,帧编号自动加1;当帧号达到0x7ff时,将归零重新开始。
LS/FS每1ms发送一次SOF帧
HS每125us发送一次SOF帧

SOF帧格式
令牌包CRC5的计算多项式为:G(X) = X^5 + X^2 + 1
CRC仅仅计算地址域(IN/OUT/SETUP的设备地址和端点地址)和帧编号(SOF的帧编号)的CRC,不对SYNC和PID做CRC计算。

数据包

数据包不带地址信息,根据包在做的发送类型不同,数据包最大长度也不相同,如图也做了规范;
数据包帧格式
数据包CRC5的计算多项式为:G(X) = X^16 + X^15 + X^2 + 1

CRC仅仅计算数据域的CRC,不对SYNC和PID做CRC计算。

握手包

握手包是非常简单的,只有PID,没有地址,端点号,数据,CRC等内容;只是回复ok/fail/stall等信息。
握手包帧格式

握手包的响应

在USB2.0协议中规定,全速设备的握手包分别有三种ACK,NAK和STALL。

ACK:表示肯定的应答,数据传输成功,由主机或设备发出;对于IN包来说是主机收到了设备端的数据,可以进行下一次的数据传输;

NAK:表示否定的应答,数据传输失败,由主机或设备发出;对于OUT包来说是设备接收主机的数据失败,此时主机可以进行重发请求;

STALL:表示功能错误或端点被设置了STALL属性,一般由设备发出;表示该设备不支持这个请求,或者无法发送和接收数据;协议STALL握手包表示设备不支持这个协议;功能STALL握手包表示,设备的端点已经停止,因此无法完成发送数据或接收数据的操作。

主机接收到NAK包后,说明设备是完整的;主机只要重发就行,设备总会收到;接收到STALL包后,说明端点已经停止,此时只能重新枚举此设备;笔者曾经做CDC设备设备时,接收到STALL包后,就再也无法通信的,只能重新枚举解决。有高手知道出现STALL包后的解决方案,可以在评论区告诉,先行感谢!

结语

USB标准统一,可以连接多个设备;所以一出来就迅速占领了市场,我们的生活现在也基本离不开它了;帧格式是USB协议中非常重要的一环,他的传输都是通过这个些帧组合起来的,大家可以仔细阅读下;下一章节我们将继续介绍USB的控制传输,BULK传输,中断传输和同步传输。好了,今天就先写到这里,有什么需要讨论的,请在评论区告诉我,谢谢大家!

标签:协议,USB,主机,嵌入式,CRC,STALL,端点,设备
From: https://blog.csdn.net/zhaohuiacuicui/article/details/140550909

相关文章

  • Python 协议和 Django 模型
    假设我有一个简单的协议A和一个未能实现该协议的类B:fromtypingimportProtocolclassA(Protocol):deffoo(self)->str:...classB:pass当下面的代码进行类型检查时,Mypy将正确地抱怨x:A=B()mypy.error:Incompatibletypes......
  • 兼容sentry协议的轻量级监控,glitchtip
    前言上一篇文章说了重启sentry的事因为过程太折腾了,一度想过放弃sentry换成其他比较轻量级的开源监控系统这不就给我找到了另外俩个https://glitchtip.com/https://www.highlight.io/这次就来试试这个glitchtip用了之后才发现,这个也是用Django开发的,而且兼容sent......
  • 嵌入式C语言之流程控制语句
    一、程序的执行顺序1、自上向下,自左向右执行二、流程控制语句作用1、控制程序的执行顺序--控制条件--执行内容三、流程控制语句的分类1、选择结构--2条2、循环结构--3条3、控制语句--4条四、选择结构1、if选择结构(1)如果小刚的考试成绩大于90分,给予奖励①......
  • 嵌入式学习day05
    以下几个位置不允许创建文件和文件夹/:整个linux核心目录/home这里管理家目录,会危害用户数据/mnt/hgfs这个是挂载目录,以后所有的共享和外设都是挂载在这里虚拟机网络模式1.桥接模式网络相关ping语法:ping[选项]目标IP/目标网址说明:测试网络是否畅通执行者:所......
  • 小型plc的自由协议通讯( 基于RS232)
    1,接线  2,串口设置  2,程序监控 3,串口测试小工具 ......
  • TCP协议之三次握手,四次挥手!
    VLSM:可变长子网掩码划分DOS攻击:拒绝服务攻击SYN:DDOS攻击(分布式拒绝服务攻击)私有IP严禁进行子网掩码划分TCP协议:三次握手:第一次握手:Client将标志位SYN置1,随机产生一个值seq=J,并将该数据包发给Server,Client进入SYN-SENT状态,等待Server确认。第二次握手:Server收到数据包......
  • 嵌入式(伍)
    嵌入式之计算机的相关知识:介绍:C语言是一种计算机编程语言,我们是利用代码来控制计算机的运行,从而达到某种目的,我们就很有必要了解计算机的运行原理。计算机的硬件:基本组成:输入设备:输入数据给计算机处理,举例如:键盘,鼠标输出设备:结果数据展示,举例如:显示器,打印机外存储器......
  • QT 之 USB SCSI指令0x2A对USB设备进行写有问题
     摘要:使用QT进行SCSI指令操作时遇到问题,0x28读取正常,但0x2A写入失败,原因是系统对0x2A命令的写入权限控制严格。解决方法是通过FSCTL_LOCK_VOLUME实现独占访问,实现对USB设备的写操作。 问题参考:https://blog.csdn.net/kifea/article/details/1036960990x2A命令参考: https:/......
  • PD还是QC?快充协议全解析
    什么是快充协议快充协议是一种通过提高充电效率来缩短设备充电时间的电池充电技术。它是通过在充电器和设备之间建立一种沟通机制,充电器能够根据设备的需求和状态,调整输出的电压和电流。这种沟通机制由快充协议定义,它决定了设备和充电器如何互相识别和交流,以及如何调整电力输出。......
  • 嵌入式外设 -- ESP32-Cam图像透传到公网访问做个小监控(图文讲解)
    目录一前言局域网透传和环境安装可以看这里二准备工作1.账号注册2.软件下载3.软件安装4.软件使用5.程序烧录三重点来了1.获取分配的IP地址2.软件配置隧道IP地址3.获取到公网的访问地址4.配置摄像头参数四注意事项重新链接热点需要重新去走这几步......