2012-04-19 113 views
1

我正在使用C8051F320并将我的固件基于HID示例固件(例如BlinkyExample)。了解双缓冲区

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

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

软件发送一个报告告诉固件要返回多少报告。

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

固件将每个IN报告的第一个采样以10kSps丢弃。在5kSps它运行良好。

2)我将EP1修改为双缓冲,但现在只有32B长。无论如何,用10kSps数据传输IN报告流1000s效果很好(由软件中采样正弦波的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;无论如何,似乎没有区别。零和数组是做什么的?

回答

0

HID例如固件

HID使用中断类型endpints,这将至多传输数据每帧一次,或每1毫秒 - 这取决于你HID描述符,其可以是慢得多。这产生了大约64000字节/秒的净数据速率。

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