Arduino で SPI 転送テスト

2013-05-31 23.47.00

てっとり早く動作確認するのに便利なので、Arduino よく使います。IN-12b ニキシー管 8 桁表示に使うのですが、表示させるデータを受信するポートを 3つ用意しようと思ってます。 UART, TWI, SPI です。今回は一番簡単な SPI からです。

マスター側は、 1秒毎に SS を LOW → SPI送信(数バイト) → SS を HIGH を繰り返すだけ。

#include <SPI.h>

char val = 'A';

void setup() {
  
  pinMode(10, OUTPUT);
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV32);
}

void loop() {

  digitalWrite(10, LOW);
  for(char i = 0; i < 4; i++) {
    SPI.transfer(val + i);
  }
  SPI.transfer('\r');
  digitalWrite(10, HIGH);  

  if(val++ > 0x58) {
    val = 'A';
  }
  delay(1000);
}

スレーブ側は、受信データを割り込み処理で取り込んで、改行来たら液晶に表示するだけの処理です

#include
#include
#include

int col = 0;
LiquidCrystal lcd(2, 3, 4, A0, A1, A2, A3);
char lcdf = 0;
String strSPI = “”;
boolean strSPIcomplete = false;
int charcnt = 0;

// —————————————————————————–
// — Interrupt Service Routine (SPI transfer complete)
// —————————————————————————–
ISR(SPI_STC_vect) {
char ch;

ch = SPDR;
charcnt++;
strSPI += ch;
if(ch == ‘\r’) {
strSPIcomplete = true;
}
}

// —————————————————————————–
// — Setup
// —————————————————————————–
void setup() {

pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);

// initialize SPI
pinMode(SS, INPUT);
pinMode(SCK, INPUT);
pinMode(MOSI, INPUT);
pinMode(MISO, OUTPUT);
// SPI slave mode
SPCR &= ~(1< SPI 転送の場合クロックは、CPU クロック(今回は 16MHz)の 1/4 だったか、それ以下で使用するのが推奨と記憶にありましてマスター側には SPI.setClockDivider(SPI_CLOCK_DIV32); という記述を入れてます。最初は 8 分周など入れて、データ欠落したので最終的に 32 分周です。ジャンプワイヤで接続しただけなのでこんなもんということにしておきましょう。

ただ、SS ピンを 1 バイト転送毎に LOW – HIGH トグルさせると、クロック 16MHz でも問題なく転送出来ました。SS が LOW から HIGH になるとスレーブ側の受信ロジックのリセットがかかるとデータシートにはあるのですがこれのせいでしょうか?? まぁ、これは想定と違う使い方なので深くは追いません。