easyDMAについて
当初、SoCの中に汎用のDMAユニットが存在していることをイメージしていました。実はそれは間違いの様でBlockdiagramにあるように、いくつかのハードウェアユニットがeasyDMAを内蔵しているということのようです。
つまり、easyDMAを使ってWS2812Bを使うという場合、easyDMAを持ったユニットのどれかを流用しなければならないということです。
もう1つ悩ましいのは、タイミングチャートを見ると、SPI伝送後のMOSIの値が不定となっていることです。
これは、実験で確認したところ、次のことが分かりました。
- SPI伝送終了直後、500ns程度最終ビットの状態が維持される。
- その後、次のSPI伝送開始までのMOSIの状態はCPOLの値(SDKではSPIのモードとしてNRF_DRV_SPI_MODE_#を設定)に依存する。
- CPOLが0の場合は、SPI伝送間のMOSIはHとなる。
- CPOLが1の場合は、SPI伝送間のMOSIはLとなる。←WS2812B制御時はこれが必要
この辺の仕様外の挙動はSoCのリビジョンによって変わる可能性があるので注意が必要かもしれません。
SPI使用WS2812Bドライブの例
WS2812B, DMA等で検索をかけると、SPIインタフェース用にDMAを持ったSoCでドライブする例がいくつか見つかりました。
- WS2812B の駆動タイミングの限界調査 (uratanさん、すばらしい情報ありがとうございます。)
- DRIVING WS2812B PIXELS, WITH DMA BASED SPI (英語)
- LED Strip - LEDテープ (MBED)
SPIMのeasyDMAを使えば、nRF52832でもWS2812Bの制御が出来そうです。
0 件のコメント:
コメントを投稿