了解双缓冲区

时间:2012-04-19 23:51:34

标签: double buffer hid

我正在使用C8051F320并将我的固件基于HID示例固件(例如,BlinkyExample)。

IN和OUT报告每个64B长(一个64B数据包)。

我启用了ADC并将其设置为10kSps。每个ADC中断,一个样本存储在一个数组中。当采集足够的样本来填充数据包时,会发送IN数据包。

软件会发送一份报告,告诉固件要返回多少报告。

1)示例固件使用EP1,它具有128B。它将EP分成IN和OUT,每个64B。

固件以10kSps丢弃每个IN报告的第一个样本。运行速度为5kSps。

2)我修改EP1为双缓冲,但现在只有32B长。无论如何,使用10kSps数据传输1000个IN报告的效果很好(通过软件中的采样正弦波的FFT确认)。

3)我修改了固件以使用EP2,因为它总共有256B,如果分割和双缓冲则给出64B。

a)同样,在10kSps时,每个数据包的第一个样本被丢弃。为什么?它以5kSps运行良好。

实际上,我似乎无法想象双缓冲是如何工作的。如果采样率快于HID传输速率,则无论如何,FIFO都会溢出,对吗?双缓冲如何帮助?但似乎要使双缓冲有效,数据包大小必须减少一半。

b)在将EP1的引用切换到EP2时,我在F3xx_USB0_Standard_Requests.c中遇到了这段代码:DATAPTR =(unsigned char *)& ONES_PACKET;。设置char * = char *的地址对我来说似乎不正确。我把它修改为DATAPTR =(unsigned char *)ONES_PACKET;无论如何,似乎没有区别。零和一个数组做什么?

1 个答案:

答案 0 :(得分:0)

  

HID示例固件

HID使用中断类型端点,每帧最多传输一次,或每1 ms传输一次 - 根据您的HID描述符,它可能要慢得多。这产生的净数据速率约为64000字节/秒。

一旦您需要传输更多数据,请使用批量或等时端点。