以下の内容はhttps://shuzo-kino.hateblo.jp/entry/2025/02/03/200604より取得しました。


M5stack Basicを対向でSPI通信する

実際のところ

HW的前提

  • MOSI/MISOはクロスで繋ぐ
  • CSは受け手と送り手でちゃんと入力出力をわけておく

アプリ

#include <M5Stack.h>
#include <SPI.h>

// M5Stack Basic用のSPIピン
#define SPI_SCLK 18    // SCKピン
#define SPI_MISO 19    // MISOピン
#define SPI_MOSI 23    // MOSIピン
#define SPI_CS   26    // CS2ピン

// テストデータ
uint8_t testByte = 0xAA;  // テストパターン 10101010

// デバイスの役割を定義
#define MASTER // このラインをコメントアウトするとスレーブモードになります

void setup() {
  // M5Stackの初期化 (LCD無し)
  M5.begin(false);
  
  #ifdef MASTER
    // マスターの設定
    pinMode(SPI_CS, OUTPUT);
    digitalWrite(SPI_CS, HIGH);  // CSはLOWがアクティブ
  #else
    // スレーブの設定
    pinMode(SPI_CS, INPUT);
  #endif
  
  // テスト用に低速のクロックでSPIを初期化
  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);  // スレーブは0xBBで応答
      Serial.printf("受信: 0x%02X, 応答: 0xBB\n", received);
      
      if (received != 0x00) {
        M5.Speaker.tone(440, 100);
      }
    }
  #endif

  M5.update();
}



以上の内容はhttps://shuzo-kino.hateblo.jp/entry/2025/02/03/200604より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14