概要
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側の受信はずれている。最初からずれているのであとはずっとずれてしまった。