目的の一つ、i2c経由でspi sramへアクセスする。できた。
https://github.com/sugarflower/IOExpander
SPI SRAMは23C256や23LC512などのあの辺のが使える。
gamebuinoやmakerbuinoは3vデバイスなのでこの辺と相性が良い。というより何も考えずに繋げることが出来て楽。
結局PCF8574では入力回路をどうにか上手くやらない限りはspiからの値を取得できそうにない。
MCP23017での動作を確認した。
MCP23017はArduinoと同じように各ピンに入出力のモードを指定できる。
なのでArduinoと同じように使えるようにした。
pinMode( pinNo 0 ~15 , mode );
modeはINPUT,OUTPUT、そしてINPUT_PULLUP
デジタル入出力も同じ感じで。
digitalWrite( pinNo 0~15 , HIGH or LOW );
value = digitalRead( pinNo 0~15 );
という風になっている。
spiについては。まだ下の方にある過去のポストと同じ。
初心者にはとても扱い辛いネイキッド仕様。
動作は確認出来たのでここから使いやすくしてゆく段階。
examplesも書かないといけないし。
SPIってひとことでいっても実はいろいろ有るのでライブラリでサポートしているのは極一部のデバイスだけかもしれない。
ただ、SPI SrAMが使えれば十分だったため、これはこれでよいかと。
pinMode、digitalWrite、digitalReadだけは使うI/O Expanderによってコードが異なるけれどほかは同じなので修正もしやすいのではないかとか。
目的は持ち歩けるgamebuinoやMAKERbuinoでSRAMを使いたいというところにあるのでなんとか小さいモジュールも作らなければいけない。ので表面実装かMCP23008を試す必要がある。
※MAKERbuinoは思ったほど何かを実装出来るようなスペースがないようだ。
過去ポスト
クラスになってArduinoライブラリ化したのでgithubにレポジトリを作った。
https://github.com/sugarflower/IOExpander
とりあえずゴールはPCF8574、MPC23017のどちらでも使えて、I2C経由でソフトウェアSPIが使えるというもの。つまりSPI SRAMをI2C経由でアクセスしたい。
PCF8574からSPI SRAMは結局まだうまく行っていないのでひとまず動作確認のためにPCF8574からMCP23S17を動かした。
動いた。
つまり、書き込みは出来ている=ソフトウェアSPI自体は動いている。
PCF8574の入力部分の問題ってことになる。
GNDにつないだタクトスイッチとかには便利だけど普通にPINのHIGH/LOWを見るのにはあまり適していないのか。
周辺回路が必要ってことなんだろうかな。
とりあえず、もっといろいろなデバイスに対応出来るように関数を変更した。
void spiWriteByte(uint8_t value);
uint8_t spiReadByte();
かなりネイキッドな実装。 使うデバイスに合わせてシーケンスをラップしておくと親切だと思う。
PCF8574からMCP23S17にアクセスするには
IOExpander ex;
ex.begin();
ex.setDeviceAddress(0x20); // PCF8574
ex.beginSPI();
ex.digitalWrite(3,LOW); // CS pin low
ex.spiWriteByte(0x40); // MCP23S17 write address
ex.spiWriteByte(0x00); //resister
ex.spiWriteByte(0x00); //data
ex.digitalWrite(3,HIGH); //CS high
ex.digitalWrite(3,LOW); //cs low
ex.spiWriteByte(0x40);
ex.spiWriteByte(0x14);
ex.spiWriteByte(0x01);
ex.digitalWrite(3.HIGH); //cs high
みたいな感じになる。
これを実行するとMCP23S17のA0がHIGHになる。
必要最低限だけどやっぱ初心者はこういうの難しくかんじるんだろうから。 乗り越えてくれよって気もするけど。
ところで秋月にはSPI8ビットのエキスパンダMCP23S08は置いてあるんだけどI2CのMCP23008は置いてない。
リクエストしたら置いてもらえるかな。MCP23017、16bitなことに不満はないんだけどその分ICが大きくなるから小さく作りたいときはフリになってしまう。
ちなみにRSオンラインにはあった。
MCP23x17とかについては過去にページを書いた。不親切だけど。
まあ、PCF8574みたいに簡単に扱えるICではないんだけど。便利なんだよね。