Arduino同士でSPI通信をさせたい
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通信がされると実行されるプログラムらしい