USB设备的数据交互机制围绕中断来展开
核心机制:设备准备好状态和数据,主机下发命令,硬件根据寄存器的设置自动立即回复,然后进入相应中断
SETUP:SETUP必须回复ACK,主机收到设备的ACK,MCU进入对应的SETUP中断
中断里,设备解析SETUP中的命令,然后准备相关的数据,设置对应的寄存器
例如获取描述符,首先将对应的描述符放到端点0的BUF里,然后设置长度,最后设置ACK
下次主机发IN包的时候,硬件就会直接回复这个数据,然后进入IN的发送完成中断
(如果描述符的长度比较长,主机会分多个IN包获取,需要在端点0的IN中断里,接着准备没有发完的数据)
IN:设备上传数据
需要MCU先准备好数据,设置长度和ACK,等到主机下发IN包时,硬件自动把准备的数据上传,然后进入对应端点的IN中断,设置NAK,翻转toggle(同步传输不需要翻转,也不需要ACK)
这个过程中,例程用了一个busy的标志位,目的是为了防止上次的数据还没有发出去,被下一次的覆盖了。
busy是在IN的中断里清除的,在实际使用中,这个busy的标志位,还需要在其他设置为NAK的地方也清除一下,例如初始化的地方USBHS_Device_Endp_Init里,SETUP中的clear feature命令里,也可以不用busy标志位,直接判断寄存器是不是设置的NAK
OUT:主机下发数据
RX_CTRL默认都是设置为了ACK,所以主机下发OUT时,会回复ACK,然后进入OUT中断,处理下发的数据,翻转toggle。
不过为了防止MCU来不及处理,出现丢包的情况,在USB的中断里会自动回复NAK,这个设置是默认开启的,主机收到NAK后会自动重发。
中断里自动回NAK,这个机制,在测USB速度的时候,由于MCU在中断里运行的太慢,会导致速度大幅降低,需要提高时钟频率,提高代码的优化等级去解决(默认的优化等级是高的),目的是加快中断里的运行速度,清除对应的标志位,下一包OUT来了回复ACK。
标签:USB,中断,NAK,ACK,主机,设置,注意事项,CH32x From: https://www.cnblogs.com/wchmcu/p/17508110.html