ArduinoでSPI通信をさせてみたくなったので簡単な通信をさせてみる
今回はMEGA(マスタ)とUno(スレーブ)を使って通信させてみる
接続表
Master |
Slave |
|
---|---|---|
SCK |
D52/ICSP3 |
D13/ICSP3 |
MISO |
D50/ICSP1 |
D12/ICSP3 |
MOSI |
D51/ICSP4 |
D11/ICSP3 |
SS |
D53 |
D10 |
マスタ側のスケッチ
#include<SPI.h> void setup() { //通信規則 SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV4); SPI.setDataMode(SPI_MODE2); SPI.begin(); Serial.begin(9600); digitalWrite(SS,HIGH); } int OutData = 12; void loop() { byte InData=0; //送信 digitalWrite(SS,LOW); SPI.transfer(OutData); digitalWrite(SS,HIGH); //受信 digitalWrite(SS,LOW); InData = SPI.transfer(0); digitalWrite(SS,HIGH); Serial.println(InData); delay(500); }
スレーブ側のスケッチ
#include<SPI.h> byte receiveValue; void setup() { //通信規則 SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV4); SPI.setDataMode(SPI_MODE2); SPCR |= bit(SPE); pinMode(MISO,OUTPUT); SPI.attachInterrupt();//SPI割り込み } void loop() { // put your main code here, to run repeatedly: } ISR(SPI_STC_vect){ receiveValue = SPDR; SPDR = receiveValue; }
まずは初期設定から
#include
通信規則?のようなものは一応すべてのSPIデバイスに同じことを書いておかないと通信ができない(ことがある)らしい。一応わかる範囲で説明を書いておく
◇SPI.setBitOrder(order);
order:MSBFIRST:8bit目から送信する
LSBFIRST:1bit目から送信する
◇SPI.setClockDivider(divider);
divider:クロック源からの分周比の設定。2,4,8,16,32,64,128分周まで設定できる
◇SPI.setDataMode(mode);//SPIクロックLOW
mode: SPI_MODE0(アイドル時のクロックがLow、立ち上がりでサンプリング)
SPI_MODE1(アイドル時のクロックがLow、立ち下がりでサンプリング)
SPI_MODE2(アイドル時のクロックがHigh、立ち上がりでサンプリング)
SPI_MODE3(アイドル時のクロックがHigh、立ち下がりでサンプリング)
◇ SPCR |= bit(SPE)
SPEにb01000000がセットされていてSPCRの7bit目に1をセットしてそれ以外のビットは変更しないということらしい。知らんけど
◇SPI.begin();
マスタ側だけに記述するらしい
通信方法
digitalWrite(SS,LOW);//通信したいSSピンをLOWにする
InData = SPI.transfer(0);//受信した値をInDataに代入する
digitalWrite(SS,HIGH);//通信が終わったらHIGHに戻す
◇ISR(SPI_STC_vect)
SPI通信がされると実行されるプログラムらしい