はじめに
SPI(Serial Peripheral Interface)は、マイクロコントローラをセンサー、ディスプレイ、その他の周辺機器に接続するために広く使用される同期式シリアル通信プロトコルです。このチュートリアルでは、Velxioのブラウザ内シミュレーターを使用して、Raspberry Pi Pico上で簡単なSPIループバックテストを構築します。PicoはSPI0を介してバイトを送信し、それらを読み戻します。その間、3つのLEDがMOSI、MISO、SCKラインのアクティビティを視覚的に示します。これは、より複雑なプロジェクトに進む前に、SPIハードウェアと配線が正しく動作していることを確認するための優れた方法です。

回路の解説
この回路のコンポーネントと配線を見てみましょう。
コンポーネント
- Raspberry Pi Pico(動作の頭脳)
- 赤色LED – MOSIライン(GP7)に接続
- 緑色LED – MISOライン(GP4)に接続
- 黄色LED – SCKライン(GP6)に接続
配線
PicoのSPI0ピンは次のようにマッピングされています:
- MOSI(マスター出力スレーブ入力) – GP7(Nano RP2040 Connectのピン配置ではD7)
- MISO(マスター入力スレーブ出力) – GP4(D4)
- SCK(シリアルクロック) – GP6(D6)
- CS(チップセレクト) – このループバックテストでは使用しません
各LEDのアノード(A)はそれぞれのSPIピンに接続され、カソード(C)はGND(PicoのGND.1)に接続されます。シミュレーター内の配線色は次の通りです:
- MOSI:赤色の配線(
#ff4444) - MISO:緑色の配線(
#00cc00) - SCK:黄色の配線(
#ffaa00) - グランド:黒色の配線(
#000000)
このシンプルなセットアップにより、SPIアクティビティを確認できます。データが送信されるとLEDが点滅します。
コード解説
以下がPico用の完全なArduinoスケッチです:
// Raspberry Pi Pico — SPI Loopback Test
// Sends bytes over SPI0 and reads the loopback response
// Default SPI0 pins: MISO=GP16, MOSI=GP19, SCK=GP18, CS=GP17
#include <SPI.h>
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("=== Pico SPI Loopback Test ===");
Serial.println("SPI0: MISO=GP16, MOSI=GP19, SCK=GP18");
Serial.println();
SPI.begin();
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
// Send test bytes
byte testBytes[] = {0x55, 0xAA, 0xFF, 0x00, 0x42};
int count = sizeof(testBytes);
Serial.println("Sending bytes and reading loopback:");
for (int i = 0; i < count; i++) {
byte rxByte = SPI.transfer(testBytes[i]);
Serial.print(" TX: 0x");
if (testBytes[i] < 16) Serial.print('0');
Serial.print(testBytes[i], HEX);
Serial.print(" RX: 0x");
if (rxByte < 16) Serial.print('0');
Serial.print(rxByte, HEX);
Serial.print(" ");
Serial.println(rxByte == testBytes[i] ? "MATCH" : "DIFFER");
}
SPI.endTransaction();
Serial.println();
Serial.println("SPI test complete.");
}
void loop() {
delay(10000);
}
動作の仕組み
- シリアル設定:115200ボーでシリアル通信を開始し、結果をシリアルモニターに出力します。
- SPI初期化:
SPI.begin()でSPI0ペリフェラルを初期化します。SPI.beginTransaction()は、クロック速度1 MHz、MSBファーストのデータ順序、SPIモード0(CPOL=0、CPHA=0)でバスを設定します。 - テストデータ:5つのテストバイト(
0x55、0xAA、0xFF、0x00、0x42)の配列を定義します。これらは、交互ビット、全1、全0、および混合パターンをカバーします。 - ループバック転送:各バイトに対して
SPI.transfer()を呼び出します。これにより、バイトを送信すると同時に、現在MISOラインにあるバイトを受信します。ループバック(MISOがMOSIに外部または内部で接続されている)があるため、受信したバイトは送信したバイトと一致するはずです。 - 結果表示:スケッチは、送信(TX)および受信(RX)されたバイトを16進数で表示し、さらに「MATCH」または「DIFFER」のステータスを表示します。
- クリーンアップ:
SPI.endTransaction()でSPIバスを解放します。
主要な概念
- SPIプロトコル:SPIは全二重同期プロトコルで、マスター(Pico)と1つ以上のスレーブを持ちます。4本の配線(MOSI、MISO、SCK、CS(チップセレクト))を使用します。このループバックテストでは、MOSI、MISO、SCKのみを使用します。
- ループバック:MOSIをMISOに接続することで、マスターは自身が送信したデータを受信できます。これは、SPIハードウェアと配線が機能していることを確認する一般的なテストです。
- SPIモード:モード(0、1、2、または3)は、クロックの極性と位相を定義します。モード0(CPOL=0、CPHA=0)が最も一般的です。
- ボーレート:シリアルモニターのボーレート(115200)は、スケッチの
Serial.begin()設定と一致している必要があります。
よくある落とし穴とデバッグのヒント
- ピンマッピングの誤り:コードのコメントにはデフォルトのSPI0ピン(GP16、GP19、GP18)が記載されていますが、実際の配線ではGP7、GP4、GP6を使用しています。使用するボードのピン配置を必ず確認してください。Velxioでは、PicoのSPI0ピンはGP7(MOSI)、GP4(MISO)、GP6(SCK)です。
- グランドの欠落:すべてのLEDのカソードがGNDに接続されていることを確認してください。グランドパスがないと、LEDは点灯しません。
- シリアルモニターに出力が表示されない:Velxioシリアルモニターでボーレートが115200に設定されていることを確認してください。エディターツールバーから開くことができます。
- LEDが点滅しない:LEDが正しいピンに配線されていること、およびコードが実行されていることを確認してください。LEDは
forループ中に高速で点滅し、その後消灯します。 - ループバックが機能しない:受信したバイトが一致しない場合は、MOSIとMISOが接続されていることを確認してください。この回路では、それらは直接接続されておらず、LEDは単なるインジケーターです。真のループバックを行うには、GP7とGP4を配線で接続する必要があります。ただし、コードは実行され結果を出力します。受信されるバイトはMISOライン上の値(フローティングの場合はおそらく0xFFまたは0x00)になります。
推奨される拡張
- 物理ループバックの追加:GP7(MOSI)からGP4(MISO)に配線を接続して、実際にデータをループバックさせます。そうすれば、受信バイトが完全に一致するはずです。
- 異なるSPIモードの使用:
SPI_MODE0をSPI_MODE1、SPI_MODE2、またはSPI_MODE3に変更し、LEDへの影響を観察します。 - クロック速度の向上:8 MHzまたは16 MHzを試して、LEDがまだ目に見えて点滅するかどうかを確認します。
- LEDの追加:CSピン(GP17)やその他のGPIOにLEDを接続して、追加の信号を可視化します。
- 実際のSPIデバイスとのインターフェース:ループバックをSPIセンサー(例:温度センサー)に置き換えて、そのデータを読み取ります。
自分で試してみよう
このプロジェクトを構築する準備はできましたか?Velxioでライブサンプルを開いて、実験を始めましょう:
Velxioエディターツールバーを使用してコードをコンパイルおよび実行し、シリアルモニターを開いて結果を確認します。キャンバスツールバーを使用すると、回路のズームやパンができます。コンポーネントを追加する必要がある場合は、コンポーネントピッカーを使用します。



それでは、楽しい製作を!