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通信がされると実行されるプログラムらしい