1、USB设备或主机上的数据缓冲区称为端点,用于存储和发送USB数据。每个端点都有唯一的地址,并具有不同的传输特性,如输入端点、输出端点、配置端点和批量传输端点。
2、USB中的帧是时间概念,每个帧持续1毫秒,它是一个独立的单元,包含一系列总线动作。USB将每个帧分成多个部分,每个部分包含一个USB传输动作。
3、上行和下行分别指设备到主机和主机到设备的数据传输方向。
现在,让我们以问答的形式继续学习。
问题一:USB传输线的结构是怎样的?
答案一:USB传输线由地线、电源线、D+和D-四条线构成。D+和D-是差分输入线,使用3.3V电压(与CMOS的5V电平不同)。电源线和地线为设备提供5V电压,最大电流为500MA(可以在编程中进行设置)。
问题二:数据是如何在USB传输线上传输的?
答案二:数据在USB线中是从低位到高位发送的。
问题三:USB使用的是什么编码方案?
答案三:USB使用非归零取反(NRZI)编码来传输数据。当传输线上的差分数据输入为0时,进行取反;输入为1时,保持原值。为确保信号发送的准确性,在发送数据包时,传输设备会进行位插入操作,即在连续6个1后插入一个0,以强制NRZI码发生变化。这些操作由专门的硬件处理。
问题四:USB的数据格式是怎样的?
答案四:USB数据由二进制数字串组成。首先是数字串构成的域(共有七种类型),然后是包,包构成事务(IN、OUT、SETUP),最后事务构成传输(中断传输、批量传输、同步传输和控制传输)。下面简要介绍域、包、事务和传输之间的关系。
(一)域:是USB数据的最小单位,由若干位组成(位数由具体的域决定)。域分为七种类型:
- 同步域(SYNC):8位,固定值为0000 0001,用于本地时钟与输入同步。
- 标识域(PID):由四位标识符和四位标识符反码组成,表示包的类型和格式。USB共定义了16种标识码,具体分类请参考问题五。
- 地址域(ADDR):7位地址,表示设备在主机上的地址。地址000 0000被称为零地址,是设备在被主机配置和枚举之前的默认地址。这也解释了为什么一个USB主机只能连接最多127个设备。
- 端点域(ENDP):四位,表示USB设备的端点数量,最多为16个。
- 帧号域(FRAM):11位,每个帧都有一个特定的帧号。帧号域的最大容量为0x800,在同步传输中具有重要意义(同步传输是四种传输类型之一)。
- 数据域(DATA):长度为0~1023字节,不同传输类型中数据域的长度不同,但必须是整数个字节。
- 校验域(CRC):对令牌包和数据包中非PID域进行校验的方法。CRC校验在通信中广泛应用,是一种有效的校验方法。请注意,CRC码的除法是模2运算,与十进制中的除法不同。
(二)包:由域构成,有四种类型:令牌包、数据包、握手包和特殊包。令牌包、数据包和握手包的结构不同,具体如下:
- 令牌包:可分为输出包(OUT)、输入包(IN)、设置包(SETUP)和帧起始包(SOF)。其中,输入包用于发送输入命令,输出包用于发送输出命令,而不是传输数据。
- 输入包、输出包和设置包的格式相同:SYNC+PID+ADDR+ENDP+CRC5(五位校验码)。
- 帧起始包的格式:SYNC+PID+11位FRAM+CRC5(五位校验码)。
- 数据包:分为DATA0包和DATA1包。当一次发送的数据长度大于端点容量时,数据包会被分成多个包进行分批发送。DATA0包和DATA1包交替发送,即第一个数据包是DATA0,第二个数据包是DATA1。但在同步传输中,所有数据包都是DATA0,格式如下:SYNC+PID+0~1023字节+CRC16。
- 握手包:结构最简单,格式为SYNC+PID。用于返回数据接收情况。在同步传输的IN和OUT事务中没有握手包阶段,这是一个特殊情况。
(三)事务:分为IN事务、OUT事务和SETUP事务。每种事务由令牌包、数据包和握手包三个阶段构成。事务的三个阶段如下:
- IN事务:
- 令牌包阶段:主机向设备发送PID为IN的输入包,通知设备向主机发送数据。
- 数据包阶段:设备根据情况作出三种反应:
1)设备端点正常,设备向主机发送数据包(DATA0和DATA1交替)。
2)设备忙碌,无法向主机发送数据包,发送NAK无效包,IN事务推迟到下一个IN事务。
3)设备端点被禁止,发送STALL错误包,事务提前结束,总线进入空闲状态。 - 握手包阶段:主机正确接收数据后,向设备发送ACK包。
- OUT事务:
- 令牌包阶段:主机向设备发送PID为OUT的输出包,通知设备接收数据。
- 数据包阶段:主机向设备发送数据,DATA0和DATA1交替。
- 握手包阶段:设备根据情况作出三种反应:
1)设备端点接收正确,发送ACK包,通知主机可以发送新的数据。如果数据包的CRC校验错误,不返回任何握手信息。
2)设备忙碌,无法接收数据包,发送NAK无效包,通知主机再次发送数据。
3)设备端点被禁止,发送STALL错误包,事务提前结束,总线进入空闲状态。
- SETUP事务:
- 令牌包阶段:主机向设备发送PID为SETUP的输出包,通知设备接收数据。
- 数据包阶段:主机向设备发送8字节的DATA0包,内容为标准的USB设备请求命令(共有11条)。
- 握手包阶段:设备接收主机的命令信息后,返回ACK,总线进入空闲状态,并准备下一个传输(通常是由IN或OUT事务构成的传输)。
(四)传输:传输由OUT、IN、SETUP事务构成,有四种类型:中断传输、批量传输、同步传输和控制传输。
- 中断传输:由OUT事务和IN事务构成,用于键盘、鼠标等HID设备的数据传输。
- 批量传输:由OUT事务和IN事务构成,用于大容量数据传输,没有固定的传输速率,不占用带宽。当总线繁忙时,USB会优先进行其他类型的数据传输,暂停批量传输,例如U盘。
- 同步传输:由OUT事务和IN事务构成,具有最简单的结构。在同步传输中,IN和OUT事务没有返回包阶段。所有数据包都是DATA0。例如视频音频传输。
- 控制传输:最重要且最复杂的传输类型。控制传输由三个阶段构成(初始设置阶段、可选数据阶段、状态信息步骤)。每个阶段可以看作一个传输。控制传输用于USB设备初次连接到主机后,主机通过控制传输交换信息,包括设备地址、读取设备描述符等,以便主机识别设备并安装相应的驱动程序。控制传输由11个标准USB设备请求命令组成,这些命令是控制传输的核心。
问题五:USB标识码有哪些?
答案五:USB标识码由四位数据组成,共有16种标识码。在USB1.1规范中,使用了10种标识码。USB2.0使用了16种标识码。标识码用于表示包的属性,与包相关联。以下是十六种标识码:
- 令牌包:0x01(输出OUT)、0x09(输入IN)、0x05(帧起始SOF)。
- 数据包:0x03(偶数据包DATA0)、0x0B(奇数据包DATA1)。
- 握手包:0x02(确认接收到无误的数据包ACK)、0x0A(无效,接收端忙NAK)、0x0E(错误,端点被禁止或不支持控制传输STALL)。
- 特殊包:0x0C(前导,用于启动低速设备的数据传输)。
问题六:USB主机如何识别USB设备?
答案六:当USB设备插入主机时,主机通过一系列动作对设备进行枚举和配置。这些动作包括:
- 接入态(Attached):主机通过检测信号线上的电平变化来发现设备的接入。
- 供电态(Powered):为设备供电,包括设备接入时的默认供电值和配置阶段后的供电值(根据数据要求的最大值,可通过编程设置)。
- 缺省态(Default):USB在被配置之前,通过缺省地址0与主机进行通信。
- 地址态(Address):设备复位后,根据主机分配的唯一地址与主机通信,进入地址态。
- 配置态(Configured):通过标准USB请求命令获取设备信息,并对设备进行配置和修改。
- 挂起态(Suspended):如果总线在3毫秒内没有活动,即USB总线处于空闲状态,设备会自动进入挂起态。在挂起态下,设备的总功耗不超过280μA。
问题七:标准USB请求命令是什么?
答案七:标准USB请求命令用于控制传输的初始设置步骤中的数据包阶段(DATA0,由8个字节组成)。标准USB请求命令共有11个,每个命令都有一个编号,编号与命令名称如下:
0)GETSTATUS:返回特定接收者的状态。
1)CLEARFEATURE:清除或禁用接收者的某些特性。
2)SETFEATURE:启用或激活接收者的某些特性。
3)SETADDRESS:为设备分配地址。
4)GETDESCRIPTOR:获取设备的特定描述符。
5)SETDESCRIPTOR:修改设备的描述符或添加新的描述符。
6)GETCONFIGURATION:获取设备当前配置值。
7)SETCONFIGURATION:指示设备采用特定配置。
8)GETINTERFACE:获取当前接口描述符编号。
9)SETINTERFACE:要求设备使用特定描述符描述接口。
10)SYNCH_FRAME:设置和报告端点的同步帧。
问题八:在标准USB请求命令中,Descriptor是什么?
答案八:Descriptor即描述符,是一个完整的数据结构,可以使用C语言等编程语言实现,并存储在USB设备中。描述符用于描述USB设备的各种属性。USB主机通过一系列命令要求设备发送这些信息。描述符的作用是通过控制传输中的命令交换信息,让主机了解设备的功能、设备类别、带宽占用、传输方式和数据量大小。只有主机确定了这些信息,设备才能正常工作。标准描述符共有5种类型:设备描述符、配置描述符、字符描述符、接口描述符和端点描述符。它们之间有一定的关系,一个设备只有一个设备描述符,一个设备描述符可以包含多个配置描述符,一个配置描述符可以包含多个接口描述符,一个接口可以使用多个端点,因此有多个端点描述符。这些描述符由特定的字段构成,具体结构请参考上述内容。