あるDIY案件で複数のSPIデバイスをぶら下げて使うことになった。
具体的にはPN5321言わずと知れたNFCコントローラと23LC5122SPI接続の512kbitSRAMなんだけど、なぜかうまく動かない(主にSRAMが)。
で、いろいろ調べて何とか解決したので備忘録として
前提条件
・ハードウェア:arduino nano(互換機だけど)
・接続しているSPIデバイス:上記の通り。SRAMを後から追加している。
・使用しているライブラリ:
・PN532:PN532、PN532_SPI
・23LC512:MicrochipSRAM
現象
・SRAMを追加するまえは当然問題無く動作。
・SRAMを追加し、SRAM単体のテストはOK
・でも、PN532と併用するとSRAMのアクセスが変(データが取れなかったり化けたりとか
・PN532の通信を初期化するとSRAMがおかしくなる・・・
原因
SPI通信条件のバッティング
安直にライブラリに頼るとこう言うハマり方をするといういい例かも・・・
シングルデバイスだと、SPIの通信条件なんてまず気にしないからなぁ。
何が違ったかと言うと、
・PN532:データを下位ビットから送出
・23LC512:データを上位ビットから送出
という、対策なしでの共存はちょっと無理な違いだった3他の条件(MODEとか)は問題無かった。
ちゃんと仕様書確認しないとダメだね・・・
SRAMのクラスの問題(?)
バグなのか今回に限った挙動なのかは解らないけど・・・
MicroChipSRAMクラスはコンストラクタでSRAMのサイズをチェックしてるんだけど、自動取得した値を見るとなぜか1MBit(=128KB)となってる4今回使ってるSRAMは512KBit(=64KB)
これ何が問題かというと、1MBitのSRAMだとアドレスが24bit指定となるので512kbit(16bit指定)とコマンド体系が変わってしまうこと。
つまり512kbitのSRAMに24bitアドレスを送出してた結果データが化けて見えたってことになる。
対策
SRAM側のライブラリを弄って、
1.SRAMへのアクセスでCSを下げる前にMSBから送出するよう変更
2.アクセスが終わり、CSを上げた後LSBから送出するよう変更
これで併用はOK
あとは、
3.SRAMのサイズを外から512kBitに設定
これで一応問題無く通信できるようになった。
結論
SPIのデバイス複数下げる時は、通信条件をちゃんと確認してすり合わせを忘れずに。
CS線複数出せば終わりじゃ無いんだね・・・(苦笑)