不太容易说清楚,我说下我的理解吧。欢迎大家拍砖。
1,说FIFO满了就自动上传给电脑——这话是错的。USB2.0及1.1设备不能中断主机,只能是主机主动去访问设备。就是说,即便FIFO满了,如果主机不取,数据依然在设备的RAM里,RAM写满之后固件就不应该再写了。
2,端点0,1比较简单,缓冲区长度固定,64字节,没有多重缓冲。端点2468比较灵活,4和8可以配置成512字节的双缓冲,2和6可以配置成512字节、1024字节的2、3、4倍缓冲。
3,多重缓冲的目的是,主机(USB数据)可以和端点外部逻辑(如DSP,FPGA)直接交换信息,数据不用从CPU导进导出,从而提高了性能。
4,缓冲是指对于端点有效的内存区块数。比如,双重缓冲,在USB数据进出一个端点的同时,外部逻辑的信息也可以进出同一端点。这是手册说的。
5,假定端点2缓冲区设置为512字节,4倍缓冲,尽管这一端点占有了2048字节RAM,但CPU只认识“激活的”512字节缓冲区。这可以从寄存器长度看得出来,比如,EP2BCH:L是11位,可对1024字节的最大缓冲区长度进行计数,EP4BCH:L是10位,可对512自己的最大缓冲区长度进行计数。
6,从第5点可以看出,FIFO读写数据是自动完成的,至于乒乓方式也是隐式实现的,CPU不了解也无需了解如何乒乓。CPU可以对FIFO进行少量的控制,传输有自动和CPU干预两种。了解FIFO的工作状况,可以通过中断、获取其EPxBCH:L长度、空、满、空闲等等一系列寄存器。寄存器太多了,所以显得这块特别复杂。
7,一般地,在TD_Poll循环中,对输出缓冲区判断是否空,空则继续写FIFO,将主机来的USB数据写到外部逻辑;对输入缓冲区判断是否满,满则不再写,外部逻辑来的数据将被固件自行抛弃。这可以回答你的第二个问题,缓冲区满是指所有输入缓冲区都满了,不管几重缓冲区都没地可写了。
8,再深入地探讨一下。对输入缓冲区,如果主机长时间不读取USB设备的数据,那么它再次读到的数据,将是设备之前写满的数据。而外部逻辑新来的数据,将在主机将缓冲区读出空间之后才能更新。实际上,此时的数据会“跳”。你所说的“交替传输”将无法实现。这是USB2.0不能申请主机中断的弊病,在实时采集时,主机必需有个线程不停地读数。据介绍,USB3.0可以中断主机,值得期待。
|