JJ1KGLのブログ

工作をしたときなど、不定期にアップします。

ArduinoでMCP23S17を使ってみる その1(備忘録)


書き込み

MCP23S17というのはSPI接続のIOエキスパンダ 8ピン×2ポート=16の入出力ピンを拡張できる
SPI通信もIOエキスパンダも初めて触るので、ネット記事・YouTube・ChatGPT・データシートに訊きながら試行錯誤する
Arduinoとの接続は6本 V+、GND、MISO、MOSI、SCK、CS

#include <SPI.h>
void setup(){
SPI.transfer(0x00)
}
void loop(){ 
}

これだけでArduinoからMCP23S17に「0x00」のデータが送信された
しかし何も起こらない。MCP23S17は「0x00」をどうすればいいか分からないから

正しい使い方はデータシートのP15に書いてある
SPIの書き込み動作

  1. CS(チップセレクト)をLOWにして通信開始
  2. 書き込みコマンド(≒制御バイト≒オペコード)を送信する
    ・A2、A1、Aの部分はハードウェアアドレスピン(15~17ピン)で設定したアドレス ただし、初期設定では設定自体が無効になっているので000で読み替えればよい
    ・R/Wの部分は書き込みか読み取りかの指定 今回は書き込みなので1
    ・結局のところ「0b01000000」が書き込みコマンドとなる
  3. アドレスを送信する
  4. データを送信する
  5. CSをHIGHにして通信終了

これをArduinoのプログラムにするとこうなる

#include <SPI.h>
#define CHIP_SELECT 10
#define OPECODE_W 0b01000000

void setup(){
  pinMode(CHIP_SELECT, OUTPUT);
  digitalWrite(CHIP_SELECT, HIGH);

  digitalWrite(CHIP_SELECT, LOW);
  SPI.transfer(OPECODE_W);
  SPI.transfer(0x00);
  SPI.transfer(0b00000000);
  digitalWrite(CHIP_SELECT, HIGH);
  
}
void loop(){ 
}

これでMCP23S17の「0x00」というアドレスに「0b00000000」というデータが書き込まれた
ちなみに「0x00」というアドレスは「I/O方向レジスタ(Aポート)」になっているので、これでMCP23S17のAポートのそれぞれのピンについて入力か出力かを切り替えることができる 今Aポートの全8ピンが「出力」になった



ところで「書き込みコマンド」の事を「オペコード」や「SPIの制御バイト」といろいろな書き方をしているので最初は分かりにくかった

次回 レジスタについて