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