CH32V307使用USBDHS如何开启双缓冲

CH32V307使用480Mbps高速USB作为设备,开启EP1OUT端点的ISO同步接收模式,现在每个微帧传输数据量大于1024字节,需要每个微帧发包2次,是不是需要用到双缓冲保证有足够的的时间取回数据?手册里面ISO传输双缓冲区没有看明白。

`{M@VU4N0ZRIHM_}}Y5H(]8.png

您好,关于双缓冲区,可以具体看一下注解那部分,当开启同步后,对于同步IN端点,发送缓冲区和接收缓冲区都被用作发送缓冲区发送数据,对于同步OUT端点,发送缓冲区和接收缓冲区都被用作接收缓冲区接收数据。关于传输数据量大于1024字节时,程序中自己设置一个环形缓冲区之类应该也是可以的。


那是不是相当于,如果想用双缓冲,那么每个端点就不能同时使用发送和接收功能?

比如0x01 和0x81就不能同时使用。就要使用0x01 和 0x82 这样的组合实现输入输出?



您好,可以这么理解的


我可以软件实现双缓冲吗? 在中断里,接收到一个包后,把RX_DMA的地址更改可以吗?还是说如果下一个包已经在传输的过程更改RX_DMA的用法会出错?


这个USB外设是直接把接收数据写入sram吗?还是自身带有一个缓冲区,只有在上一个包的中断处理完之后,才会把下一个包的数据通过DMA写入sram?


谢谢。


Q1:我可以软件实现双缓冲吗? 在中断里,接收到一个包后,把RX_DMA的地址更改可以吗?

A:可以。

在中断里,代表着接收完成或者发送完成一个数据包,此时可以修改EP?_TX/RX_DMA寄存器的值,来修改下一次传输数据包存取的位置(注意起始地址4字节对齐),这样下一次传输就会对新配置的RAM区域进行读写,能够加快USB事务处理速度,避免缓冲区的重用(另一个外设的访问)。用这个方式,可以实现“动态”缓冲区,不仅仅是双缓冲,1024字节一个包,可以尽可能的用尽RAM,做一个环形缓冲区。


Q2:还是说如果下一个包已经在传输的过程更改RX_DMA的用法会出错?

A:上述通过在中断中修改EP?_TX/RX_DMA寄存器的操作,需要确保在传输完成中断产生之后,配置下一次事务的ACK应答状态之前,这个时间段内切换是没有错的。此外任何时间都不应该去修改。


这种切换方式应当被绝大部分的数据转发应用采用,极力避免或尽可能减少memcpy之类的操作。


Q3:这个USB外设是直接把接收数据写入sram吗?还是自身带有一个缓冲区,只有在上一个包的中断处理完之后,才会把下一个包的数据通过DMA写入sram?

A:无需纠结外设自身、DMA、RAM之间的交互关系,只需要记住芯片产生传输完成中断之后,数据已经存放于RAM中,或者已经从RAM中全部读取走了。即简单说芯片处在某个端点的传输完成中断中的时候,通常该端点的RAM(EP?_TX/RX_DMA寄存器中配置的)是被释放的状态,因为事务已经结束。


你好,硬件的双缓冲怎么实现自动切换缓冲区?如果每次都要在USB中断里面切换缓冲区,那开不开双缓冲就没区别了。


只有登录才能回复,可以选择微信账号登录