がじぇるね(5)
    GR-KURUMIのSPIでMCP23S08をアクセス


 GR-KURUMIののSPIでMCP23S08と通信しました。 
 MCP23S08のアクセスは、入力と出力を別々のGR-KURUMIスケッチを作り試しました。
 入力は、MCP23S08に接続したスイッチの内容を取り込み、シリアル通信でパソコンに送り確かめました。
 出力は、GR-KURUMIでカウントして、その値をMCP23S08に送りLEDに表示と、シリアル通信でパソコンに送り確かめました。

 感想は、ライブラリが揃っているので短時間に作ることができました。

●GR-KURUMIのSPIでMCP23S08をアクセスの動作確認

 GR-KURUMIのSPIでMCP23S08をアクセスンした構成とパソコンでモニタした動作状況です。
 構成写真の左端は、FT232Rでプログラム書込とシリアル通信に使います。中央は、GR-KURUMIでSPIを制御します。右端は、MCP23S08搭載基板で、SPIで指令を受け、スイッチとLEDを制御します。

 




 プログラムの実行結果を示します。左は、スイッチの状況を入力して、シリアル通信で入力データをパソコンに送っています。
 右は、GR-KURUMIのカウント値をSPIでMCP23S08とシリアル通信でパソコンに送っています。LEDの表示も正常を確認しました。






 MCP23S08にLEDデータを出力した信号を次に示します。
 チップセレクト信号が、Lowに成ってから、コマンド、レジスタアドレス、LEDデータと3バイト送られています。
 クロックは、1MHzのようです。








●サンプルプログラム

  スイッチ入力のサンプルプログラムを次に示します。

//Kurumi_Spi_MCP23S08_SwIn

//KurumiボードにSDカードを接続してスイッチをアクセスする、

#include <RLduino78.h>
#include <SPI.h>

int led_green = 23; // LOW active
int rData;

// pin10をSPIのスレーブセレクト端子(SS)とする。
const int SpiCsMcp23sPin = 10;

void setup(){


// SPIの初期化
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV16); // 最大クロックは1MHz(16MHz/16)
SPI.setBitOrder(MSBFIRST); // MSBファースト
// SPI.setDataMode(SPI_MODE0); // SPIモード0 SMOD1:0 SMOD0:0
SPI.setDataMode(SPI_MODE3); // SPIモード3 SMOD1:0 SMOD0:1

pinMode(10, OUTPUT);
digitalWrite(SpiCsMcp23sPin,HIGH); //SpiCsMcp23sPin をHIに

pinMode(led_green, OUTPUT);

Serial.begin(38400); //
}

void loop(){
digitalWrite(led_green, 1); //LED点灯

//********** Mcp23s Read
digitalWrite( SpiCsMcp23sPin,LOW); //SpiCsMcp23sPin をLOWに

SPI.transfer(0x41); //RegCmd 設定
SPI.transfer(0x09); //RegAdd 設定

rData = SPI.transfer(0x00); //RegData 読出し

digitalWrite(SpiCsMcp23sPin,HIGH); //SpiCsMcp23sPin をHIに

//**********Read data シリアル出力
Serial.print("Sw:");
Serial.print(" ");
Serial.println(rData ^ 0xFF,HEX);


digitalWrite(led_green, 0); //LED消灯

delay(5000);
}

delay(1000); // 1秒停止
}



ホームへ戻る