はじめに
こんにちは、tnishinagaです。
今回はWiznetの新製品W55RP20-EVB-PICOをいただいたので、遊んでみようと思います。
要約
- W55RP20はW5500とRP2040とFlashが1パッケージになったもの
- メリット
- チップ面積が減るので基板をつくる人にはサイズメリットがあるかも
- デメリット
- W5500とRP2040間の通信にPIOが必要
- 代わりにSPI0は不要。一長一短。
- W5500とRP2040間の通信にPIOが必要
W55RP20
W5500は韓国のWIZnet社で作られているマイコン向けのネットワークチップです。
TCP/IPの通信の大部分をハードウェアが行ってくれるので、プログラムサイズや処理コストなどを抑えつつ外部とのネットワーク通信が行えるようになります。
たとえば、有線LANに繋がるIoTデバイスをマイコンで作りたい場合などに重宝するでしょう。
W55RP20はこのネットワークチップW5500と、Raspebrry Pi Picoに載っているRP2040とFlashを1パッケージにまとめた製品です。
1パッケージにまとめるメリットとしては、中身のW5500とRP2040とFlashを別々に基板に乗せる場合に比べてチップ1枚分の面積が減らせて基板を小型化できたり、配線をシンプルにできるなどがあります。私は趣味でRP2040の基板設計制作もしているので、個人的にも1パッケージになって面積や配線のコストが減るのは大変嬉しいです。
(EVB-PICOの比較画像。3チップが1パッケージになって回路がだいぶスッキリしている。USB端子がType-Cになったのも地味に嬉しいポイント)
サンプルの動作
W5500-EVB-PICO向けのコードそのままでは動かない
W55RP20向けのサンプルコードは、2024/10/09現在以下の環境向けに提供されています(W55RP20-EVB-PICOページ より引用)
- C/C++
- Ethernet Examples
- AWS Examples
- Azure Examples
- LwIP Examples
- FreeRTOS Examples
- MicroPython Examples
- Ethernet Examples
私は普段embassy-rsというRust用のライブラリを使って開発をしているので、紹介されているサンプルではなくembassyのW5500-EVB-PICO用サンプルを試すことにしました。
W55RP20はW5500とRP2040がパッケージ内で接続されているだけなので、W5500とRP2040が使われているW5500-EVB-PICO用のサンプルはちょっと手直しするだけで動くだろうと思って試してみたのですが、うまく動きませんでした。なぜでしょうか?
W55RP20のW5500とRP2040の接続
W5500-EVB-PICO用のサンプルがW55RP20で動かない原因を探るため、W5500とRP2040の接続を公式サイトのsystem overviewより調べます。
(画像はW55RP20プロダクトページより引用)
この図によると、RP2040のGPIO20から25がW5500のSPIインターフェイスに繋がれているようです。
次にRP2040のGPIO20-25を見ていきます。
(rp2040のデータシートpp.237より引用)
データシートによるとRP2040のGPIO20-25にはSPI0の割当ができるので、SPIペリフェラル経由でW5500を制御できると思っていたのですが、うまく動きません。
結論を先にいうと、W55RP20でW5500を制御するためにはPIOでSPI通信する必要があります。
SPI0で通信できない理由
SPI0を使って制御できない理由はW5500とRP2040のピン配線にあります。
通常SPI通信を行うためには、マイコンとデバイス間のIO方向があうように接続が必要です。
しかし、W55RP20のサンプルコードよりSPIピン配置を調べてみると、RP2040のデータシートに記されたピン配置とまったく合いません。
(W55RP20のサンプルコード更新履歴より引用)
RP2040のSPI0を使う前提で図示したらこんな感じでばらばらになっています。どういうことでしょう?
ここでW55RP20のsystem overviewを見直してみると、SPI接続部に「PIO SPI」と書かれていました。
(画像はW55RP20プロダクトページより引用)
また、W55RP20対応時の差分を見直してみると、PIOのアセンブリが追加されていました。
つまり、どうやらRP2040のSPI0はピンの接続があわなくて使えないので、PIOを使ってピンを入れ替えてW5500を制御する必要があるようです。
サンプルコード作成と動作確認
制御のためにPIOのプログラムが必要とわかったので、早速作って動かしてみました。
とりあえず動かすことを目的にSPI MODE0のみ対応かつクロックもテキトーなPIOのコードを書いて、emabssyのwiznet driverで使えるようにSpiBus traitを実装してSPIデバイス部を差し替えています。
抽象レイヤーをちゃんとつかって作られているライブラリは、こういう入れ替えが簡単にできて嬉しいです。
ベースにしたembassyのtcp_serverのサンプルコードは、入力をechobackするだけの簡単なTCPサーバーを立ち上げるだけです。
動作の様子はこんな感じです。
サンプルコードは以下で公開しています。
https://github.com/tnishinaga/w55rp20_tcp_server_example
感想
実際に触ってみての感想です。
- チップ面積が減るのは基板をつくる人的には大変嬉しい
- ライブラリが充実してくるまでは使いづらいチップかも
- W5500制御のためにPIOでSPI制御プログラムを作るのはちょっと大変
- デバッグ時に疑うところが増えるのも大変
- 逆に考えればPRチャンスでもある
- W5500制御のためにPIOでSPI制御プログラムを作るのはちょっと大変
- SPIの代わりにPIOが1つ使えなくなるのは一長一短
- RP2350ならPIOが3つ付いてるので欠点にならないかも?
- チップリビジョン変更時にSPI0でも制御できるようになると嬉しい
どこで買えるの?
公式通販サイトではcomming soonとなっていますが、digikeyではすでに買えそうでした。
チップ単体はまだ買えませんが、WIZnetさんが以下のような投稿をしているので近いうちに買えるようになると思います。楽しみですね。