我正在使用 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; 无论如何,似乎没有区别。zeros 和 one 数组有什么作用?