health 发表于 2024-11-24 03:48:44

USB在上一个数据包尚未处理时可以继续传输下一个数据包吗?

部分MCU资料可以看到说明,可以配置为双缓冲,以最大化吞吐率。
一个缓冲区在CPU处理数据时,USB使用另一个缓冲区传输数据。
USB的缓冲区可寻址,可由CPU直接访问。

而STC的USB和那些不一样,USB部分和CPU部分之间由一个异步FIFO连接。
这样做的好处显而易见,两者可以采用各自独立的时钟。
USB作为独立外设时钟48MHz是固定不能变的,
而MCU其它部分可以采用任意其它频率,
比如 45MHz, 44.2368MHz, 40MHz, 36.864MHz,
33.1776MHz, 24MHz, 22.1184MHz,12MHz, 11.0592MHz, 等灵活的较低频率。
这样功耗低,电磁辐射小。

看了STC的资料,有些地方不明白,FIFO能否容纳多个数据包?
即收到一个数据包,尚未处理,未清空FIFO时,
上位机再次发来一个OUT包,能否接受?
IN的处理同理。


数据手册中提了一句,FIFO中可以包含多个数据包,但是没有详细的说明。

按照提供的例程的处理逻辑,
收到OUT数据包,产生中断,读取收到数据包字节数,
从FIFO逐个字节读取并复制到一个缓冲区,清除OPRDY标志。
经实际测试,在清空FIFO清除OPRDY标志前,上位机发送OUT包是不成功的,会NAK。

直到OPRDY标志清除后,才可以成功发送下一包。
类似多包连发或其它MCU双缓冲这种效果能实现吗?







神农鼎 发表于 2024-11-24 10:08:53

就是如何理解这个自动缓存数据 ?
===我请同事来回答下






神农鼎 发表于 2024-11-24 10:26:26

帮回答下
答复:
       我们的USB规格中没有双缓冲支持
       上一包数据没有处理完成前不会接收下一包数据


有单缓冲,一边读走?还可以一边收 ?
答复:
       FIFO就是缓冲区
       不能一边读一边收
       处理完成FIFO的当前数据包后,告诉USB硬件已处理完成,
       硬件就好自动接收下一包数据到FIFO


zhp 发表于 2024-11-24 10:38:41

目前我公司的带USB功能的芯片,USB的所有端点的FIFO都不支持分割,
所以所有的端点都不支持双缓冲

硬件在接收一包数据到FIFO中后,会将OPRDY标志位置1
只要软件没有清除OPRDY标志,硬件就不会继续接收下一包数据
只有当软件处理完成FIFO中的数据后,将OPRDY清0
硬件就知道可以接收下一包数据了

IN包的处理方式也是一样,软件写入数据到FIFO后,将IPRDY后
在HOST没有从FIFO中取走前数据前,不能继续向FIFO中写数据
只有在HOST从FIFO中取走了数据,硬件自动将IPRDY标志为清零
软件才可以向FIFO继续写下一包数据

双缓冲是比较老旧的技术,后续我公司的USB会添加USB的DMA功能,
USB DMA会连续接收多包数据,并自动存放到RAM中。
DMA相比双缓冲,数据接收能力要强很多。双缓冲最多可接收两包数据,
而DMA则不仅仅只接收两包,
只要RAM足够大,连续接收10包甚至100包都不是问题

神农鼎 发表于 2024-11-24 10:55:22

zhp 发表于 2024-11-24 10:38
目前我公司的带USB功能的芯片,USB的所有端点的FIFO都不支持分割,
所以所有的端点都不支持双缓冲



答复及时给力,后续是 DMA 时代了
{:5_300:}



期待这个DMA方阵当中出现 USB !!!

神农鼎 发表于 2024-11-24 15:19:22

速度够快就行了

health 发表于 2024-11-24 15:40:19

了解了。
主要是手册中提到了FIFO可以包含多个数据包,以及USB DMA相关寄存器。
但又摸不透使用方法,故此多问。

神农鼎 发表于 2024-11-24 17:00:00

health 发表于 2024-11-24 15:40
了解了。
主要是手册中提到了FIFO可以包含多个数据包,以及USB DMA相关寄存器。
但又摸不透使用方法,故此 ...

{:5_300:}
我们继续努力

DebugLab 发表于 2024-11-24 19:57:32

学习
页: [1]
查看完整版本: USB在上一个数据包尚未处理时可以继续传输下一个数据包吗?