微控制器USB学习(五)

Setup事务

什么是setup事务呢?一个新的USB设备插进USB主机上,不可能说都不知道你是谁,就随便让你插进来,就好像一个人去你家,人家敲门,你没看到人家的样子的时候,总得问一句:谁啊?妨碍老子搞事情!。。同样的,其实setup事务要做的,就是向USB设备发出获取USB设备描述的请求,如果改事务成功,对应返回的,应该是Transaction 0。具体的行为如下:

  • 主机发送一个指令,告诉从机这个是setup包。
  • 主机发送获取USB设备描述的指令,指令包含对应的端点值。
  • USB设备获取到指令后,返回ack包告诉USB主机已经收到指令。

需要注意的是,在setup包的格式里,需要加入CRC校验,为什么呢?正常来说setup包发送出去之后,如果USB设备能完全接收数据,那就是返回ACK回来,同样的如果不能完全接收,则不会有ack包返回。判断是否能完全接收,主要是在数据包中,带有CRC校验,判断校验值进行反馈。

OUT事务

OUT事务的主要机制,个人觉得更重要的是对输出数据的校验。在该事务中,USB主机会向USB从机设备发送OUT包和数据包,准确的说是先发送OUT包,并检测是否正常通讯,如果错误或者超时,丢弃改包。正确了,才会发送数据包。对于OUT事务的主要过程如下:

  • USB主机设备发送OUT包给USB从机从机,用于表明本事务是一个OUT事务,并制定通讯端点(端点的概念前面有讲)。
  • USB主机发送数据包给USB从机,一般的数据的字节长度为8字节。
  • USB从机在接收到所有数据之后,需要返回一个ACK包给主机,告诉主机从机已经完全接收完毕。

IN事务

IN事务其实和OUT事务应该是要匹配的,做的事情其实就是相反的,很好理解,OUT事务就是主机输出数据到从机上,IN事务就是从机输出数据到主机上。虽然说做了相反的事情,但是实际步骤并不是相反,USB主机在执行该事务的时候,是先发送一个IN包给USB从机,告诉从机有数据要给它,这时从机会反馈一个ACK包给主机,告诉主机我可以接收你的数据。如果IN包或者数据发送错误,主机是不会反悔握手包的。对于IN事务的主要步骤如下:

  • USB主机发送IN包给USB从机,用于指定USB从机的端点,告诉USB从机有数据要接收。
  • USB从机传输实际的数据包给USB主机,同样的一般来说数据长度是8字节,当然这里强调一下,数据长度是不能比端点限制的长度大的。
  • USB主机给USB从机返回一个ACK包,告诉从机数据接收完毕并且无误。

Ping事务

Ping事务与前面的事务不一样,它只存在高速模式下。在低速或者全速模式下,如果因为USB从机设备的问题,导致传输过程中需要一直等待,这时候OUT事务携带的OUT包和OUT数据会一直在占用,在低速和全速模式下,字节宽度在64k,但是如果是全速模式下,是可以达到512K,这样的占用量极其大,所以出现了新的事务-----Ping事务。它的主要作用是,像网络ping那样,先检查一下你通不通,到底能不能搞,才进行传输。主要的步骤如下:

  • USB主机发送一个OUT包,指明是OUT事务。
  • USB主机发送数据包给USB从机。
  • USB从机返回NYET包,表明USB设备可以接受USB主机的数据。
  • USB主机发送一个ping包,用于检查USB设备是否已经可以接受数据。
  • USB从机返回一个ACK包给USB主机,告诉USB主机可以。

猜你喜欢

转载自blog.csdn.net/qq_42312125/article/details/106738410