本文简单介绍USB2.0传输的一些概念,为方便了解EZ-USB的USB中断和端点。由于EZ-USB的串行引擎隐藏了USB收发的诸多细节,因此本文只是对USB的传输的关键概念做介绍,具体的细节需要参见USB2.0协议。
一、USB拓扑结构
USB是一种主从拓扑结构,主机叫Host,从机(设备)叫Device。
一个主机连接一个根集线器(root hub),根集线器可以再扩展出其他的集线器(hub)和主控制器(host controller),主控制器即对应着主机的USB插口。
因此,从设备到主机的数据叫做输入数据,从主机到设备的数据叫做输出数据。
二、包
USB传输数据是由一个一个的包(package)传输的,每个包再细分成一个一个域。包的具体构成及操作(如同步、位填充、校验等)被USB串行引擎隐藏,这里略去不介绍。
每个包中都有一个8bit的域,用来表示正在传输的包的类型,叫做PID (package ID)。
USB2.0协议一共规定了16个包,分为四个大类,如下表所示:
PID类型 | PID名字 |
令牌类(Token) | IN OUT SOF SETUP |
数据类(Data) | DATA0 DATA1 DATA2 DATAM |
握手类(HandShake) | ACK NAK STALL NYET |
特殊类(Special) | PRE ERR SPLIT PING |
2.1 令牌包
令牌包用来启动一次USB传输事务(有关USB事务的概念见第三章)。
·输入令牌包(IN):通知设备,本次USB事务是要输入一个数据包。即本次USB事务中的数据包是输入的。
·输出令牌包(OUT):通知设备,本次USB事务是要输出一个数据包。即本次USB事务中的数据包是输出的。
·建立令牌包(SETUP):通知设备,本次USB事务是要输出一个数据包。建立令牌包只能用在控制传输中,且只能发送到设备的控制端点(端点的概念见笔记九),SETUP后面的数据包只能是DATA0。
·帧起始包(SOF):表示一帧的起始(帧的概念见第五章)。帧起始包后面不跟数据包。
2.2 数据包
数据包里的数据是真正需要传输的数据。之所以有不同的数据包,是用在当握手包出错时进行纠错。
2.3 握手包
握手包用来表示本次USB事务是否被对方确认。
其中ACK包主机和设备都可以使用,但NAK、STALL和NYET只有设备才可以返回,主机不能使用。
·ACK:正确接收数据,且有足够的空间容纳数据。
·NAK:没有数据需要返回,或者数据接收正确,但是没有足够的空间容纳数据。
·STALL:表示设备无法执行这个请求,或者端点被挂起了。
·NYET:数据接收正确,但是没有足够的空间容纳下一次数据。
2.4 特殊包
·PRE:通知集线器打开其低速端口。实质是一个令牌包。
·PING:等待设备返回ACK或者NAK,以判断设备是否能够转送数据。实质是一个令牌包。
·SPLIT:通知集线器将高速数据包转化为全速或者低速数据包发送。实质是一个令牌包。
·ERR:集线器在分裂事务中出现错误。实质是一个握手包。
三、USB事务
USB总线传输的基本单位虽然是包,但是单独的一个包不能传送数据的,必须按照一定的关系把这些不同的包按照一定的顺序组织起来,比如令牌包+数据包+握手包,USB才能够完整的传输一次数据。这样一次完整的USB传输过程,叫做USB事务。
一次USB事务通常由两个或者三个包组成:令牌包、数据包和握手包。因此我们可以按照令牌包的不同,把USB事物分为输入事务(令牌包为IN)、输出事务(令牌包为OUT)和建立事务(令牌包为SETUP).
下图表示了两个用来输出数据的USB事务:
图中1,2,3为第一次USB事务,主机先发送一个OUT令牌包。然后发送一个数据包DATA1,DATA1中包含着需要发送给设备的数据。设备受到无误后,向主机返回一个握手包ACK。然后主机再发起下一次USB事务4,5,6。
有关EZ-USB对于一次USB事务的处理,可以参见第六章
四、USB传输类型
USB协议定义了4种传输类型:批量传输(bulk transaction)、同步传输(isochronous transaction)、中断传输(interrupt transaction)、控制传输(control transfers)。
4.1 批量传输
批量传输的一次传输事务为典型事务,包括一个令牌包(IN或者OUT包),后面跟数据包,包含传输的数据,最后是设备或主机返回的应答包(ACK,NAK,NYET或STALL)。
全速模式下批量传输的数据包大小为8,16,32或者64字节,高速模式下数据包大小为512字节。
4.2 同步传输
同步传输的一个传输事务只有令牌包和数据包,不返回应答包。
全速模式下同步传输数据包大小为1023字节,高速模式下数据包大小为1024字节。
4.3 中断传输
中断传输是一种保证查询频率的传输。中断端点在端点描述符中要报告他的查询间隔,USB主机要保证在小于这个时间间隔内安排一次传输。中断传输的一次传输事务与批量传输的事务相似。
全速模式下中断传输数据包最大为64字节,高速模式下最大为1024字节。
4.4 控制传输
控制传输分为三个过程(阶段):建立过程、数据过程和状态过程。
4.4.1 建立过程
建立过程使用一个建立事务。该事务令牌包为SETUP。数据包只能用DATA0,数据包包含的数据为主机到设备的设备请求,USB协议规定了标准的设备请求,包括请求描述符等,当然,用户也可以定义自己的设备请求。设备返回的应答包只能为ACK,如果出错,则不返回任何应答。
4.4.2 数据过程
数据过程是可选的。一个数据过程可以包含一次或多次输入输出事务,但所有事务的方向必须相同。一旦事务的方向发生改变(令牌包方向改变),则认为结束了数据过程,进入下一过程。
数据过程的事务的令牌包为输入输出令牌(IN或OUT),数据包在DATA0和DATA1之间交替,且第一个数据包必须为DATA1。
4.4.3 状态过程
状态过程的事务与数据过程的事务方向相反。数据包只能使用DATA1。
五、USB帧
USB的帧是基于时间的,每毫秒的数据包为USB的一帧,与USB的包和事务的结构无关。
全速USB主机为了向USB设备提供时间基准,他会以广播的形式,每毫秒向所有的USB设备发送一个SOF包。该SOF包与该毫秒内所有后继的数据包叫做一个USB帧。
高速USB设备将每毫秒的一帧再分成8个微帧,每个微帧125微秒。
SOF包中包含一个11bit的帧号,该帧号每帧递增一个。同一个帧当中的所有微帧的SOF包的帧号相同。
EZ-USB每收到一个SOF包,会产生一个USB中断。
六、EZ-USB串行引擎
EZ-USB拥有一个串行接口引擎(SIE),一边直接与USB总线的数据线D+和D-相连,另一边递交和接收发往主机和发往设备的数据。
SIE能够对PID解码,进行CRC校验,并把真正需要的传送的数据发往USB设备。
同时,SIE还能够根据端点状态和校验结果,自动产生握手包(ACK,NAK等)发往主机。
SIE在一个USB传输事务中扮演的角色如下图所示
EZ-USB的SIE最大的特点是,EZ-USB的SIE可以完全自主的进行枚举,这允许EZ-USB在CPU复位期间,将USB主机上的固件程序下载到内部RAM中。