USB协议

/**
 * @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值
在这里插入图片描述不包含帧号段和数据段


在这里插入图片描述
在这里插入图片描述
发送数据时候的包的数据格式,不包含 地址段和帧号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值