对于同步传输不能有来自主机的握手包-东元jsdep伺服手册
在进行USB数据传输时,如果传输的数据超过32字节(最大数据包大小),就必须将数据分成多个32字节的包进行发送,接着再发送一个剩余包。倘若传输的字节数恰好是32的倍数,剩余包就会变成一个零长度数据包,因为任何小于32字节的包意味着传输结束。
在同步传输过程中,不能有来自主机的握手包。固件应当加载EP0 FIFO的第一个数据包,并在USBCS0.CLR_OUTPKT_RDY位置1的同时将USBCS0.INPKT_RDY位置1。数据包发送后,清除USBCS0.INPKT_RDY位并产生EP0中断。固件可以继续加载更多数据包,每发送一个包就会触发一个EP0中断。加载完最后一个数据包后,固件必须设置USBCS0.DATA_END位和USBCS0.INPKT_RDY位,以开始控制传输的状态阶段。当状态阶段完成后,EP0会切换到IDLE状态。如果USBCS0.SEND_STALL位设置为1,状态阶段可能会失败,进而声明USBCS0.SENT_STALL位并产生EP0中断。如果在接收IN令牌时USBCS0.INPKT_RDY没有设置,USB控制器就会回复一个NAK,表示端点正在工作但暂时没有数据要发送。
在OUT传输(RXRX状态)中,如果控制传输需要从主机接收数据,配置阶段后会跟随一个或多个OUT传输。在这种情况下,USB控制器处于RX状态,只能接受OUT令牌。成功的OUT传输包括两个或三个连续的包:一个令牌包、一个数据包和一个握手包。如果接收的数据超过32字节,数据必须分成多个32字节的包,然后再发送一个剩余包。如果接收的数据恰好是32的倍数,剩余包就会是一个零长度数据包,因为小于32字节的有效载荷表示传输结束。每接收到一个数据包,USBCS0.OUTPKT_RDY位就会被设置,并产生EP0中断。当数据包从EP0 FIFO卸载后,固件应当设置USBCS0.CLR_OUTPKT_RDY位。