NuttX for Raspberry Pi PicoでSPIが使用できるようになったので、以下のSPI接続のネットワークモジュールを使ってネットワークに接続します。
デバイス側からの割り込みを受けられる必要があるので、GPIOドライバに割り込み対応を追加しました。
接続
Raspberry Pi PicoとENC28J60を以下のようにつなぎます。
この記事 などでも触れられていますが、Amazon等で売られている上記のENC28J60モジュールはシルク印刷の端子の表記が一部おかしいので注意が必要です。
ENC28J60 | Pico端子 | Pico ピン番号 |
---|---|---|
GND | GND | 3, 38 などのGNDピンのどれか |
3.3 (Q3) | 3V3 | 36 |
SI (ST) | GP15 (SPI1 TX) | 20 |
SCK | GP14 (SPI1 SCK) | 19 |
CS | GP13 (SPI1 CSn) | 17 |
SO | GP12 (SPI1 RX) | 16 |
INT (LNT) | GP11 | 15 |
RST | GP10 | 14 |
NuttXのビルド
コンフィグレーションにraspberrypi-pico:enc28j60
を指定してビルドします。
ENC28J60、SPIの他に、ネットワーク周りの機能が有効にされています。
$ git clone https://github.com/apache/incubator-nuttx.git nuttx
$ git clone https://github.com/apache/incubator-nuttx-apps.git apps
$ cd nuttx
$ ./tools/configure.sh raspberrypi-pico:enc28j60
$ make
ENC28J60の接続先は、.configの以下の箇所で設定します。これらを変更することで、接続するSPI、GPIOピン番号を変えることができます。
CONFIG_RP2040_ENC28J60_SPI_CH=1
CONFIG_RP2040_ENC28J60_INTR_GPIO=11
CONFIG_RP2040_ENC28J60_RESET_GPIO=10
ネットワーク周りは、以下のような設定になっています。
- IPアドレスはDHCPで取得
- DNSサーバはGoogle Public DNS (8.8.8.8)を使用
- NTPクライアントを起動して時刻取得
それぞれ、.configの以下の箇所で設定されています。
CONFIG_NETINIT_DHCPC=y
CONFIG_NETINIT_DNS=y
CONFIG_NETINIT_DNSIPADDR=0x08080808
CONFIG_SYSTEM_NTPC=y
起動
NuttXを起動して、ネットワーク周りをいろいろ操作してみます。
(起動時にDHCPでアドレスを取得しているため、最初のプロンプトが出るまで少しかかります)