Seeeduino XIAOはメモリも多くパワーがあるのでパラレル出力も増やしてみようとIOエキスパンダを使ってみました。少しハマるところもあったので備忘録としてのメモです。


使用したIOエキスパンダはシリアルインターフェイス内蔵のMCP23017(I2C通信)とMCP23S17(SPI通信)で8bitパラレル入出力を各2ポート持っています。

2つのICを同時につないで各ICのパラレルポートのGPA0とGPA7でLチカを行っているところです。



I2CとSPIを両方試したかったので大人買いして2個同時の接続テストです。
(と言っても,1個110円と120円のICでしたので家庭に波風は立ちません(^^;;;;;)



1.MCP23017(I2C通信)の接続と注意点

・I2Cの2本の信号線SCL・SDAは必ずプルアップ(推奨は1KΩ)を行う。
 プルアップを忘れると全く動きません(^^;;;;

・Pin18の#RESETはVDDに接続しておく
 データシートではなぜか出力矢印になっていますが,,コントロールしないと動作が不定です。一応リセット動作はパワーオンリセットにお任せして,リセット端子はVDDにつないでおきました。




・I2Cのクロックは3.3Vでは400KHzが限界のようです
 無理やりクロックを上げてみるとエラーが頻発しました(^^;;;;;;;;
 400KHzでは1byteのデータを 送るのに80uSほどかかっています。




・プログラム的には特に問題は無いようです
 Wire.setClock()は赤字になりませんが,クロックは変更できています。
Lチカのプロフラム例です。






2.MCP23S17(SPI通信)の接続と注意点

・Pin18の#RESETはVDDに接続しておく
 I2CのMCP23017と同様にコントロールする必要があります。

・SPIが1台でも#CSはコントロールする
 1台だけなら#CSを下げたままで良いのではないかとも思いましたが,それでは動作しませんでした(^^;;;;;;。




・SPIのクロックはXIAO側で制限があるようだ,,,
 3.3Vの時は10MHzまであげられるはずですが,実測で6MHz程度(5.75MHzあたり,,)で限度のようです。そのため1byteのデータを送るのに8uSほどかかっています。




・プログラム的にはSPIの通信設定に要注意
 Arduinoの従来の解説書通りに設定するとXIAOはフリーズします。
Seeeduino XIAOのSPI通信は新しくなった設定方法を使わないとフリーズする

・SPIだがスレイブアドレス(Device Opcode, 8bit)が必要
 上図のようにスレイブアドレス→レジスタアドレス→データの順に送ります。
なお,スレイブアドレス(Device Opcode)はArduinoのI2Cのように自動的にbit0にR/Wが追加される事はないので8bit表記になります。

CS(SS)をXIAOのD0Pinのポートコントロールで行っているプログラム例です。





シリアルインターフェイスで使うIOエキスパンダは配線も少なくパラレル入出力を増やすのにはすっきりした方法だと思います。

入力に使っても割り込み信号など便利に使える向きも多いのではないでしょうか。

ただスピードは遅くなるので,ここがボトルネックになって動作が追いつかないような用途には向かないですね。

ま,出力だけならシフトレジスタを使うのも良いでしょうし,根本的な話としてPin数の多いマイコンを使うのも自然な話です。

でも,手持ちの小さなマイコンに16Pinのパラレル入出力がひょいと増やせるのも私にはなかなか魅力的ですV(^^)。