C8051F320 を使用しており、ファームウェアは HID サンプル ファームウェア (BlinkyExample など) に基づいています。
IN および OUT レポートは、それぞれ 64B の長さです (単一の 64B パケット)。
ADC を有効にして、10kSps に設定しました。ADC 割り込みごとに、サンプルが配列に格納されます。パケットを満たすのに十分なサンプルが取得されると、IN パケットが送信されます。
ソフトウェアは、返すレポートの数をファームウェアに伝えるレポートを送信します。
1) サンプル ファームウェアは、128B の EP1 を使用します。EP を IN と OUT にそれぞれ 64B に分割します。
ファームウェアは、各 IN レポートの最初のサンプルを 10kSps でドロップします。5kSps では正常に動作します。
2) EP1 をダブル バッファに変更しましたが、現在は 32B の長さしかありません。いずれにせよ、10kSps データを使用した数千の IN レポートのストリーミングはうまく機能します (ソフトウェアでサンプリングされた正弦波の FFT によって確認されます)。
3) EP2 を使用するようにファームウェアを変更しました。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 と 1 の配列は何をしますか?