前言
最近学习了USB2.0的一些知识,这里就当笔记,回顾记录一下,参考的资料是B站的刘凯老师STM32 培训教程和龙虎老师的USB应用精粹分析,如果有哪些错误的理解,也希望大佬们指点一二,谢谢!
USB逻辑上分为三层:
1.信号层 2.协议层 3.数据传输层
他还有两个东西就是接口和端点:
接口:我认为就是功能,如果一个设备有键盘又有U盘的功能,那么他就有两个接口
端点:USB通信的基本单元
1.信号层
信号层有两个东西
一个是设备速度的检测
高速的时候D+上接一个上拉电阻 1.5k
低速的时候D-上接一个上拉电阻 1.5k
另外一个就是信号的编码 反向不归零编码方式 NRZI
并对D+和D-线所处的不同状态定义成J和K状态
数据状态 D+ D-
低速J状态 0 1
低速K状态 1 0
无论是K还是J就是跳变的时候就代表0 不跳变 延续下去的那个就是1
协议层
包是USB系统中信息传输的基本单位,所有的数据都是经过打包后在总线上传输的 一个包一个包 抓包都这么说的
(这里我要补充一下后面会有事务的概念 一般是由令牌包 数据包 握手包组成 )
包一般是由6部分组成
1.同步字段(SYNC)
2.包标识符(PID) 包号
3.地址字段(ADDR)
4.数据字段(DATA,包括帧号)一些数据比较大 可能会拆分成好几个数据 他们通过帧号到时候就可以整合起来
5.检验字段(CRC)
6.包结束(EOP)
总共有七种包 常用是以下四种包 以上六种字段具体包含取决于包的类型 但是PID字段是所有包都必须具备的
1.令牌包 输出(OUT) 由包标识符(PID) 地址(ADDR)端点(ENDP)检验字段(CRC)
(1)PID包标识字段PID的定义格式如下图,包标识字段(PID)长度为8bit, 由低4bit的类型字段和高4bit的校验字段组成。校验字段是类型字段的反码。 例如,PID[3:0] = 0001B时,完整的PID字段则应该是:1110_0001B,表示令牌OUT
(2)在总线枚举完成后,主机会给设备分配一个唯一的地址,存放在 USB_DADDR 寄存器[6:0]中,由于地址字段的长度为7位,而地址0是默认地址,不能给USB设备,所以实际可供分配的地址数量只有127个
(3)端点字段 代表端点的集合 长度为4 代表共有16个
输入 (IN)
帧起始 (SOF)
建立(SETUP)
2.数据包 在低速或全速模式下,数据包分为了DATA0(偶数据包)与DATA1(奇数据包)两种类型 他是由PID决定的
2.握手包
与功能设备相关的握手包有ACK,NAK,STALL,NYET这四种(ERR握手包仅仅存在于主机与集线器之间)
数据包损坏表示是否通过CRC校验
接收方停止特征 表示 管道所处的状态激活还是停止(前面的就是表示设备端点能正常通信,后面的就是设备端点处于停止状态)
时序位匹配 表示发出的数据包是否以正确的次序发出 (就是有些事务要求数据包必须是DATA0,有些又必须DATA0与DATA1循环切换 也叫时序位切换)
可接收数据 表示 设备已经准备好接收数据
注意: NAK STALL NYET只有设备才可以返回,因为请求都是主机发送的 ,NYET握手包只有在高速设备输出事务中使用,表示设备的本次事务成功接收,但没有足够的缓冲区来接收下一次数据,主机在下一次输出数据的时候,先使用PING令牌包来询问一下是否有足够的接收缓冲区,防止带宽浪费
总结:端点有问题 就是STALL握手包 接受了数据就是ACK握手包 接收不了就是NAK握手包
4.专用包