Nucleo STM32L4R5ZI と B-L475E-IOT01A を購入したので、PlatformIO で使ってみます。
venv(python3) 環境を作る
まずは python の venv から。
2021 年との大きな違いは自分の環境が今更ながら、tcsh から bash に変わったことかな。
PlatformIO をインストール
次に pip で PlatformIO をインストール。
コマンドは pio が使える。pio コマンドで対応するボードがあるか確かめてみましょう。
ボード固有の環境を作る
pio boardコマンドは変わっていなかったのですが、init などは大きく様がわりしました。
pio initは pio project initに変わりました。
以下、src/test.ino を変更して upload するまで。test.ino は Arudino の簡単なプログラムなのでここではオミット。あと platformio.ini にupload_protocol = stlinkを追加してます。
パッケージの追加
ついでにパッケージも追加。
本当は SDIO のテストをしたかったのですが、なぜか、STM32L4R5ZI の環境は SD カードしか HAL で対応していませんでした。LL レベルでは MMCSD という SDIO にも対応したライブラリが揃っているのですが。
ソースを読むと STM32U5xx_HAL_Driver では stm32u5xx_hal_sdio.cがあるのでそれをベースにつくれば SDIO 対応できそうでした。ソースを読んで CMD52 とか CMD53 とか出てきて、そういえばやったな、、、と少し思い出しました。
B-L475E-IOT01A はboard としてdisco_l4s5i_iot01aを指定します。結果として、どちらも Hello World までは簡単にできました。
CYW43439 と 43362
どちらも Infineon (昔は Cypress) のチップです。
ソースを読むと、SDIO でアクセスするときはファンクション1とファンクション2を有効にしてから、ファンクション1の Infineon 固有のレジスタにアクセスし、初期設定した後に、ファンクション2を通してパケットのやり取りをするみたいです。
802.11 はパケットのやりとりでアソシエーションを実行するのですね。なので、ドライバレベルでは細かい 802.11 のプロトコルを知っている必要がありません。
B-L475E-IOT01A は WiFi のモジュールとSPI 接続です(でした)。SDIO の CMD52, CMD53 相当の機能を実現するために、先頭の 32bit が特別な意味を持っています。
CYW43439 では Bluetooth がついているので SDIO を通してどうするのかと思ってソースを読んでいくと、ファンクション1 の CYW43439 固有のレジスタをアクセスすることでBluetooth のやりとりを実現していました。
この辺 Raspberry Pi PicoW も同じような仕組みなので、どっかで詳しく書きたいと思います。