/**
* @file main.c
*
* @author wls
*
* @brief USB2.0协议
*
* (一):物理层
* 有四根线,VCC,GND,D+,D- 传输二进制数据0或1是靠D+,D-两线的压差产生数据0/1
* J状态K状态,会因为是LS(lows speed低速设备),HS(高速设备设备),FS(全速设备)而不同
* J可能是二进制数据1 或者0,K也如此
*
* (二):协议层
* 1. 数据帧格式(USB里边也叫包 packge) 不同类型的USB包
* 其数据帧组成会有不同,比如不包含地址段或者帧号段或者数据段
*
* |SOP|SYNC(8bit/32bit)|ADDR 11bit |帧号11bit|PID(8bit)|data(0-1023Byte)|CRC(5/6bit)|EOP(2bit)|
*
* ADDR: ***不是每次都要输入ADDR,看需求可有可无***
* 7bit(USB_device_addr)+4bit(end_point_addr)
*
* 帧号: ***不是每次都要输入帧号,看需求可有可无***
* 其实因该叫数据帧计数器,发送一个帧+1,发送一个帧+1,当计数到最大值7FFFH时会重新从0开始计数
* 每帧 帧首会发送一次SOF
*
* SOP:
* USB包或者USB数据帧格式的起始位,类似于IIC起始信号
* SYNC:
* USB包的同步信号段 8bit/32bit,做数据同步使用
* FS/LS为8bit,HS为32bit
* FS是full speed 全速USB设备, LS LOW SPEED 低俗USB设备, HS high speed 高速USB设备
* PID:
* 就是数据帧的类型标识段,专业名词叫USB包类型标识段,不同的值代表这个包是属于 命令类,还是数据类,还是应答信号类
* 虽然 有8bit但只使用bit0-bit3, bit4-bit7用来取反校验
*
* USB包类型分为: !!!输入PID输入前4bit类型位+后4bit(把前4bit取反)组成个8bit
* (1)令牌类(就是控制命令): PID(bit0-3)
* OUT(通知设备要输出数据) 0001B
* IN(通知设备要输入数据) 1001B
* SOF (通知设备这是个帧起始包) 0101B
* SETUP(通知设备将要开始一个控制传输) 1101B
* 令牌包数据帧格式 SETUP类型:|Sync(8bit)|PID(4bit+4bit取反前4bit:只需输入前4bit)eg:SETUP |data(7bit device_addr+4bit end_point addr)|CRC 5bit|EOP(2bit)|
*
* SOF类型(心跳信号/提醒信号 提醒USB设备主机没挂起,发送包前 先发送的 而且主机发送这防止USB设备进入挂起模式,空闲时候USB主机会发送):
* | SYNC 8bit | PID SOF:0xa5 | 11bit帧号 | CRC 5bit | EOP |
*
* (2)数据类(不同类型的数据): PID(bit0-3)
* DATA0 0011B
* DATA1 1011B
* DATA2* 0111B
* MDATA* 1111B
* 数据包格式:| SYNC 8bit |PID(data04bit+4bit取反校验,只需要输入前4bit数据表示类型就行了)|Byte0 Byte1 Byte2 ...ByteN|CRC 16bit|EOP|
*
* (3)握手类(就是应答信号): PID(bit0-3)
* ACK 0010B 正确接收数据,并且有足够的空间容纳数据。主机和设备都可以使用ACK来确认,而NAK、STALL、NYET只有设备才能够返回,主机不能使用这些握手包。
* NACK 1010B 没有数据需要返回;数据接收正确,但是没有足够的空间容纳数据
* STALL 1110B 设备无法执行这个请求或者设备已挂起。设备返回STALL,需要主机干预才能解除这种STALL状态。
* NYET* 0110B 只在USB2.0高速设备输出设备中使用,表示设备本次数据成功接收,但是没有足够的空间来接收下一次的数据。主机在下一次输出数据前,将使用PING令牌包来探测设备是否有足够的空间接收数据,以免浪费不必要的带宽和时间
* 握手包数据格式: |SYNC 8bit|PID 8bit |EOP|
*
* (4)特殊类: PID(bit0-3)
* PRE 1100B 前导这是个令牌包
* ERR* 1100B 错误,这是个握手包
* SPLIT* 1000B 分裂事务,这是个令牌包
* PING* 0100B PING测试,这是个令牌包
* - 0000B 保留,未使用
* CRC:
* 数据校验位
*
* EOP:
* end of packge singal ,数据包结束信号
*
*
*
*
*
*
*
*
* @version 0.1
*
* @date 2023-10-13
*
* @copyright Copyright (c) 2023
*
*/
USB协议基础
USB通信是传输为基础的,每次传输又包含事务,例如OUT IN SETUP,
一个SETUP事务的流程是 :
每次传输时候又得确定具体的传输类型,每一种传输的类型的流程步骤又不太一样,不过大体类似都是发送下边的几种数据包进行个排序组合而已,例如下边的批量传输
1. USB协议数据包格式,包类型由8bitPID,不同的值决定的
-------------------------------------------------------------------------------------------------------------
PID前4bit决定包类型,后4bit是前4bit取反,这就组合8bit PID,不同的值来决定包类型
包类型不同,那数据包的组成就会不同,比如握手包就是类似于应答信号的,直接就是下图这样的,没有上图中的 ①地址段 ②帧号 ③数据段 ④CRC校验位段
还有 诸如下图几种包类型
上图中的,SOF下的 0XA5就是PID值,Frame 就是帧的数量 1611
帧首包,不包含地址段和数据段,这种类型包 用来提醒USB设备不要进入挂起模式或者休眠模式,通常USB空闲时候,USB主机会发送
SETUP下的0XB4,就是8bitPID值
不包含帧号段和数据段
发送数据时候的包的数据格式,不包含 地址段和帧号