Common Lispの系譜を継ぐuLispをラズパイPico2マイコン上で練習中。先ごろからハードウエア制御に入いっとります。前回はPWM出力(関数名的にはanalogwrite)、今回はSPI出力を練習してみます。端子的にはキメウチだけれども、それなりに制御できるのでないかと。実機で波形を味わってみるの回です。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
今回、動作確認の関数
uLisp上のSPI制御用API関数は以下です。
-
- with-spi
with-spiは、第一引数に「シリアル・ストリーム」を定義するためのリストをとるスペシャルフォームです。そして以降のスコープの中で「ストリーム」なるものが有効になります。
入出力の実体は「シリアル・ストリーム」を介して入出力するためのwrite-byte、read-byteといった「ストリーム」に対して入出力する関数どもの並びです。これはSPIに限らず、I2C、UARTなどでも同じ関数が使えるみたいです。
今回試行してみたサンプルでは以下のようなコードを動かしてみてます。
(with-spi (str 17 4000 1 2 0) (write-byte #xA5 str))
ここで、str はSPIシリアル・ストリームにバインドされた変数です。その後のパラメータの意味は以下のとおり。
-
- 17、enableピン(CSnピン)の番号
- 4000、クロック周波数[kHz]、デフォルト値4000
- 1、MSBFIRSTかLSBFIRSTか。1はMSBFIRST(デフォルト)
- 0、SPIモード0から3のどれか(0がデフォルト)
- 0、SPIインタフェースの番号、0か1か(0がデフォルト)
Pico2のSPIインタフェース
Pico2のRP2350、PicoのRP2040とも「ハードウエア」のSPI回路は2チャンネル搭載してます。これについては以下の別シリーズ回にて調べてます。
Pico三昧 (43) ラズパイPico2:RP2350、Pico:RP2040、SPI比較
ことさらに「ハードウエア」のと記しているのは、RP2350、RP2040ともにPIO(Programmable IO)というハードウエアに匹敵するIO論理を構成可能なステートマシンも搭載されているからです。
uLispは搭載している2個のハードウエアSPI回路を使用可能となっていますが、制約もあります。本来のRP2350、RP2040では各SPI回路とも複数のGPIO端子と紐づけることができるようになっているのですが、uLisp環境ではキメウチの端子になってます。
SPI機能端子 | SPI0 | SPI1 |
---|---|---|
TX | GPIO19 | GPIO12 |
SCK | GPIO18 | GPIO13 |
CSn | GPIO17 | GPIO14 |
RX | GPIO16 | GPIO15 |
SPIのモード
SPIには4つのモードがありますが、今回はそこから2つを動作させてみて(4つやらないのはメンドイから、手抜き)、その波形を観察してます。SPIの各モードの「タイミングチャート」については別シリーズの過去回で描いてみてます。
帰らざるMOS回路(37) SPIのタイミングチャートをWaveDromで描く
ざっくりしたところは以下のようです。
-
- MODE=0 IDLE=LOW 立ち上りサンプリング、立下りシフト
- MODE=1 IDLE=LOW 立ち下りサンプリング、立上りシフト
- MODE=2 IDLE=HIGH 立ち下りサンプリング、立上りシフト
- MODE=3 IDLE=HIGH 立ち上りサンプリング、立下りシフト
SPI出力波形の観察結果
まずはモード0の波形です。uLispの出力コードが以下に。
(loop (with-spi (str 17) (write-byte #xA5 str)) (delay 100))
loopで回しているのは、オシロで波形をあたるためです。波形(SCKとTXだけだけれども)が以下に。
黄色のSCKの立ち上がりエッジで青のTXの値を読むと、MSBFIRSTで0xA5と読めますな。
つづいてモード2。
(loop (with-spi (str 17 4000 1 2 0) (write-byte #xA5 str)) (delay 100))
波形が以下に。
同様に、黄色のSCKの立ち下がりエッジで青のTXの値を読むと、MSBFIRSTで0xA5と読めますな。
SPIでも出力はできた。次は出力して入力、それがフツーの使い方か。