USB—CH32x作为USB设备时的通信机制和注意事项

H417/V205有一定不同,最后面会特别介绍,如有使用,最后面会特别介绍!

 

USB设备的数据交互机制围绕中断来展开
核心机制:设备准备好状态和数据,主机下发命令,硬件根据寄存器的设置自动立即回复,然后进入相应中断

 

SETUP:SETUP必须回复ACK,主机收到设备的ACK,MCU进入对应的SETUP中断
中断里,设备解析SETUP中的命令,然后准备相关的数据,设置对应的寄存器
例如获取描述符,首先将对应的描述符放到端点0的BUF里,然后设置长度,最后设置ACK
下次主机发IN包的时候,硬件就会直接回复这个数据,然后进入IN的发送完成中断
(如果描述符的长度比较长,主机会分多个IN包获取,需要在端点0的IN中断里,接着准备没有发完的数据)

 

IN:设备上传数据
需要MCU先准备好数据,设置长度和ACK,等到主机下发IN包时,硬件自动把准备的数据上传,主机应答ACK,然后进入对应端点的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。

 H417/V205:

SETUP:

与上面不同的是,进中断后中断中会默认置端点为NAK,所以每次你收完了数据之后都需要手动置为ACK,等待下次数据的到来

IN :

这个与上面也有不同,传统都是进中断会置为NAK,翻转tog,待下次想上传是再置为ACK,但205不同,由于完成中断里会默认NAK,所以这个可以省了,同时如果使能了自动翻转tog的功能,中断中会自动翻转

,这样连tog都不用翻转了,只是中断中会多个传输完成使能,其作用也就是清除标志位的作用。上传就和307一样了,想上传使能ACK即可。

OUT:
由于OUT中也会自动NAK,所以当你收到这一包后进中断处理完就必须置位ACK,因为不置位ACK下一包永远也不会到来。

posted @ 2023-06-27 10:57  WCH_CH32  阅读(984)  评论(0)    收藏  举报