SAMD21-ATmega328 SPI対向試験

概要

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

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア