PicoSlave
機能概要
本ファームウェアは、Raspberry Pi Picoを通信の導通確認用のスレーブ(UART/I2C/SPI/PWM)として動作させます。
-
UART (シリアル通信)
- 受信したデータをそのまま送り返す「エコーバック」機能を提供します。
-
I2C スレーブ
- マスタから書き込みを行うと、受信したデータが内部バッファ(256バイト)に順次保存されます。その後、マスタから読み出しを行うと、以前にマスタが書き込んだデータが返されます。(例:マスタが
0x10,0x20を書き込んだ後に読み出しを行うと、0x10,0x20... の順でデータが返されます)
- マスタから書き込みを行うと、受信したデータが内部バッファ(256バイト)に順次保存されます。その後、マスタから読み出しを行うと、以前にマスタが書き込んだデータが返されます。(例:マスタが
-
SPI スレーブ
- マスタからデータが送信されると、それと同時にマスタから送られるクロックに合わせてスレーブ側からもデータ(本ファームウェアではテスト用の固定値)が送り返されます。具体的には、
0xFF,0xFE,0xFD...0x00の順で値が出力されます。
- マスタからデータが送信されると、それと同時にマスタから送られるクロックに合わせてスレーブ側からもデータ(本ファームウェアではテスト用の固定値)が送り返されます。具体的には、
-
PWM (パルス幅変調) 測定
- 入力ピンに入力されたPWM信号のデューティ比(High期間の割合)を測定し、ログをUSBシリアル(仮想COMポート)経由でPCに出力します。
ソースコードとバイナリ
今回作成したプログラムの全ソースコードと、そのまま書き込めるバイナリ(uf2ファイル)は、以下のGitHubリポジトリで公開しています。
shiomachisoft/PicoSlave
ソースコードは、Pico SDKとC言語で作成しています。
配線 (Pinout)
デフォルトのピン配置は board_config.h で定義されています。
| インターフェース | ピン (GP) | 信号線 |
|---|---|---|
| UART | GP0 | TX |
| GP1 | RX | |
| I2C | GP6 | SDA |
| GP7 | SCL | |
| SPI | GP16 | RX |
| GP17 | CSn | |
| GP18 | SCK | |
| GP19 | TX | |
| PWM | GP21 | Input |
通信設定
各機能のデフォルト設定値は以下の通りです。
これらの設定値やピン配置を変更したい場合は、board_config.h を編集してください。
UART
- ボーレート: 9600 bps
- データ形式: 8データビット, 1ストップビット, パリティなし
I2C スレーブ
-
スレーブアドレス:
0x17 - 通信速度: 100 kHz
- バッファサイズ: 256バイト
SPI スレーブ
- ビットオーダー: MSB First (固定)
- データビット長: 8 bit
- バッファサイズ: 256バイト
- クロック極性/位相: CPOL=1, CPHA=1
- 重要: CPHA=1のままにして下さい。(CPHA=0に変更しないで下さい。)
-
理由: 一般的なSPIであれば、CSをLowに下げたまま連続してクロック(SCLK)を送り、データを何バイトも送り続けることができますが、RP2040(Pico)のSPIスレーブには以下の特殊な仕様が存在します。
- 「1フレームごと」のCSトグル要求(CPHA=0):
RP2040に搭載されているSPIコントローラの仕様上、SPIモード0および2(CPHA=0のモード)で動作している際、マスター側が1データ(1バイトまたは1ワード)送るごとにCSを一度Highに戻さないと、次のデータが正常に受け取れない(または同期が崩れる)という挙動があります。
- 一般的な期待値: CSをLowにしたまま、SCLKを8発×10回送れば10バイト受信できる。
- Pico(スレーブ)の現実: CSをLowにしたままクロックを送り続けると、1データ目の終了タイミングを正しく認識できず、2データ目以降のサンプリングがズレたり、FIFOへの格納が正常に行われないケースがあります。
- 「1フレームごと」のCSトグル要求(CPHA=0):
PWM
- 機能: 入力信号のデューティ比測定
使い方
-
まず、使用する機能に応じて必要な配線を行います。ピン配置については「配線 (Pinout)」の章を参照してください。
SPI通信の配線(特にクロック線:SCK)は、できるだけ短く接続してください。
-
PicoSlave.uf2ファイルを、BOOTSELボタンを押しながらPCにUSB接続したPico (RPI-RP2ドライブ) にコピーします。
⇒ コピー完了後、Picoは自動的に再起動し、本ファームウェアが動作を開始します。 -
TeraTermなどのシリアルモニタソフトでPicoのCOMポートを開くと、PWM測定結果のログが約5秒間隔で表示されます。(TeraTermのボーレート設定はとりあえず115200bpsに設定して下さい。)
-
各インターフェース (UART, I2C, SPI) のマスタ機器からPicoSlaveにデータを送信して動作を確認してください。PicoSlaveが返すデータの内容については「機能概要」を参照してください。
メモ
CMakeLists.txtの下記の記述でプログラム全体をRAMに展開し高速に実行します。
pico_set_binary_type(PicoSlave copy_to_ram)
免責事項
本ソフトウェアの使用により生じた、いかなる損害やトラブルについても、作者は一切の責任を負いません。ご利用は自己責任でお願いいたします。