Translate

ページ

2016年1月10日日曜日

nRF52832 + WS2812B その2 : nRF52832のeasyDMA

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制御時はこれが必要
これらを考慮して、SPI伝送のモードとSPI伝送最終データのビット列を調整せねばなりません。つまり、モードとしてはNRF_DRV_SPI_MODE_1あるいはNRF_DRV_SPI_MODE_3を使用し、伝送最終ビットが0となるようにする必要があります。

 この辺の仕様外の挙動はSoCのリビジョンによって変わる可能性があるので注意が必要かもしれません。


SPI使用WS2812Bドライブの例

 WS2812B, DMA等で検索をかけると、SPIインタフェース用にDMAを持ったSoCでドライブする例がいくつか見つかりました。

要は、SPIの複数ビットのHi(1)とLow(0)を複数組み合わせて 0code, 1codeを実現しようというものです。
 
SPIMのeasyDMAを使えば、nRF52832でもWS2812Bの制御が出来そうです。

0 件のコメント:

コメントを投稿