概要
I2C(SCL+SDA)の信号線が1本(SDA)に対して、SPI(SCLK+MISO+MOSI+CS/SS)の信号線が2本(MISO+MOSI)あり、結線がやや複雑で、SAMD21、ATmega328のSPIの挙動が明らかに違う。しかしSPIの通信スループットはI2Cの数倍以上あるため、面倒でもやる価値がある。以下の対向試験でSPIでデータの送受が確認しよう。
Master=SAMD21
/**********************************************
SAMD21 as SPI Master
**********************************************/
#include <SPI.h>
void setup() {
Serial.begin(9600);
Serial.println("---------SAMD21G18A as SPI Master--------");
SPI.begin();
digitalWrite(SS, HIGH);
}
void loop() {
SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));//SPIトランザクション開始
digitalPinToPort(SS)->OUTCLR.reg = digitalPinToBitMask(SS);//SS->LOW
byte rx = SPI.transfer(0x11);//転送
digitalPinToPort(SS)->OUTSET.reg = digitalPinToBitMask(SS);//SS->HIGH
SPI.endTransaction();//SPIトランザクション終了
Serial.print("tx = ");
Serial.print("17");
Serial.print(" / rx = ");
Serial.println(rx);
SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
digitalPinToPort(SS)->OUTCLR.reg = digitalPinToBitMask(SS);
rx = SPI.transfer(0x21);
digitalPinToPort(SS)->OUTSET.reg = digitalPinToBitMask(SS);
SPI.endTransaction();
Serial.print("tx = ");
Serial.print("33");
Serial.print(" / rx = ");
Serial.println(rx);
delay(2000);
}
Slave=ATmega328
/**********************************************
Arduino UNO as SPI Slave
**********************************************/
#include "SPI.h";
void setup() {
Serial.begin(9600);
Serial.println("----Arduino UNO as SPI Slave-----");
SPI.setBitOrder(MSBFIRST);//最高位を先に
pinMode(MISO, OUTPUT);//出力ピン設定
SPCR |= _BV(SPE);//SPI Control Register
SPI.attachInterrupt(); //割り込みを可能に
}
//割り込みハンドラー
ISR(SPI_STC_vect) {
byte rx = SPDR;
Serial.print("ISR! ");
Serial.println(rx);
SPDR = rx;//受信データをそのまま返す
}
void loop() {//空転
}
結果
Master側
tx = 33 / rx = 17 tx = 17 / rx = 33 tx = 33 / rx = 17 tx = 17 / rx = 33 tx = 33 / rx = 17 tx = 17 / rx = 33 tx = 33 / rx = 17 tx = 17 / rx = 33 tx = 33 / rx = 17 tx = 17 / rx = 33 tx = 33 / rx = 17 tx = 17 / rx = 33 tx = 33 / rx = 17 tx = 17 / rx = 33 tx = 33 / rx = 17
Slave側
ISR! 17 ISR! 33 ISR! 17 ISR! 33 ISR! 17 ISR! 33 ISR! 17 ISR! 33 ISR! 17 ISR! 33 ISR! 17 ISR! 33 ISR! 17
※ Master側の受信はずれている。最初からずれているのであとはずっとずれてしまった。
