実際のところ
HW的前提
- MOSI/MISOはクロスで繋ぐ
- CSは受け手と送り手でちゃんと入力出力をわけておく
アプリ
#include <M5Stack.h>
#include <SPI.h>
#define SPI_SCLK 18
#define SPI_MISO 19
#define SPI_MOSI 23
#define SPI_CS 26
uint8_t testByte = 0xAA;
#define MASTER
void setup() {
M5.begin(false);
#ifdef MASTER
pinMode(SPI_CS, OUTPUT);
digitalWrite(SPI_CS, HIGH);
#else
pinMode(SPI_CS, INPUT);
#endif
SPI.begin(SPI_SCLK, SPI_MISO, SPI_MOSI);
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE0));
Serial.begin(115200);
Serial.println("SPIテスト開始");
Serial.printf("SCLKピン: %d\n", SPI_SCLK);
Serial.printf("MISOピン: %d\n", SPI_MISO);
Serial.printf("MOSIピン: %d\n", SPI_MOSI);
Serial.printf("CSピン: %d\n", SPI_CS);
#ifdef MASTER
Serial.println("モード: マスター");
#else
Serial.println("モード: スレーブ");
#endif
}
void loop() {
#ifdef MASTER
delay(100);
digitalWrite(SPI_CS, LOW);
delayMicroseconds(10);
uint8_t received = SPI.transfer(testByte);
delayMicroseconds(10);
digitalWrite(SPI_CS, HIGH);
Serial.printf("送信: 0x%02X, 受信: 0x%02X\n", testByte, received);
delay(3000);
#else
if (digitalRead(SPI_CS) == LOW) {
uint8_t received = SPI.transfer(0xBB);
Serial.printf("受信: 0x%02X, 応答: 0xBB\n", received);
if (received != 0x00) {
M5.Speaker.tone(440, 100);
}
}
#endif
M5.update();
}