Lispと一緒(31) ラズパイPico2でもuLisp、SPI出力

Joseph Halfmoon

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だけだけれども)が以下に。DefaultSPI0waveformMODE0

黄色のSCKの立ち上がりエッジで青のTXの値を読むと、MSBFIRSTで0xA5と読めますな。

つづいてモード2。

(loop (with-spi (str 17 4000 1 2 0) (write-byte #xA5 str)) (delay 100))

波形が以下に。

DefaultSPI0waveformMODE2

同様に、黄色のSCKの立ち下がりエッジで青のTXの値を読むと、MSBFIRSTで0xA5と読めますな。

SPIでも出力はできた。次は出力して入力、それがフツーの使い方か。

Lispと一緒(30) ラズパイPico2でもuLisp、PWM出力 へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です