nRF52840 DKで遊ぼう⑥~enc28j60でエコーサーバ~
はじめに
先日、IoTSecJPTokyo Version 5のデモ用に、nRF52840 USB Dongle+enc28j60 Ether MAC+Zephyrでエコーサーバを構築しました。 同様のものをnRF52840 DKで動くように移植を行っていきます。
USB Dongleから、DKへの移植は、GPIOピンの設定変更だけで可能です。
ピン設定
ピン設定は次のようにしました。
enc28j60 | nRF52840 DK |
---|---|
CK | 0.27 |
MOSI | 0.26 |
MISO | 1.08 |
CS | 1.12 |
INT | 1.11 |
nRF52840 DKでは、GPIO 0.00 - 0.25は、LED、スイッチ、UART、外部メモリなどに割り当てられています。 自由に使用できるGPIOピンから、高速デジタルIO向けのピンを選択しています。
SPI設定は、デバイスツリーを変更します。
&spi0 { status = "ok"; sck-pin = <27>; mosi-pin = <26>; miso-pin = <40>; };
CSとINT (割り込みピン) は、defconfigに反映します。
|> overlay-enc28j60-pca10056.conf
# BOARD specific GPIO configurations CONFIG_ETH_ENC28J60_0_GPIO_PORT_NAME="GPIO_1" CONFIG_ETH_ENC28J60_0_GPIO_PIN=11 CONFIG_ETH_ENC28J60_0_GPIO_SPI_CS=y CONFIG_ETH_ENC28J60_0_SPI_CS_PORT_NAME="GPIO_1" CONFIG_ETH_ENC28J60_0_SPI_CS_PIN=12
ビルドしてDKに書き込みます。
mkdir dk_build && cd $_ cmake -GNinja -DBOARD=nrf52840_pca10056 -DCONF_FILE="prj.conf overlay-enc28j60.conf overlay-enc28j60-pca10056.conf" .. ninja flash
ターゲットボードが無事、起動します。
***** Booting Zephyr OS v1.13.99-ncs2-10-gdad14f4 ***** TCP echo server waits for a connection on port 4242... wait for client on socket #0
2019年ですが、telnetで接続しに行きます。
$ telnet fe80::204:a3ff:fe2d:3036%enp0s9 4242 Trying fe80::204:a3ff:fe2d:3036%enp0s9... Connected to fe80::204:a3ff:fe2d:3036%enp0s9. Escape character is '^]'. hello hello # echo back from nRF52840 DK!
失敗談
ピン設定
nRF52840 USB Dongleと異なり、DKでは豊富にGPIOピンが引き出されています。 そこで、当初は適当に、高速デジタルIOピンを選んでSPIピンと割り込みピンに割り当てました。
悲劇の始まりです。
デバッグ
一通りピン設定をして、ハードウェアを接続し、動作確認したところ、SPIでのデータ受信でブロックされてしまいました。 会社からオシロスコープが支給されたので、ピンを1つずつ当たっていきます。
RIGOL (リゴル) デジタルオシロスコープ 50MHz 4ch 1GSa/s 【国内正規品】,DS1054Z
- 出版社/メーカー: リゴルジャパン
- メディア: Tools & Hardware
- この商品を含むブログを見る
SCKは、約8us周期でクロックの波形が取れました。128KHzなので合っています。 MOSIは、リセット直後、ソフトリセット (0xFF) を送信していそうです。 CS、明らかに動いていないです!
CSで指定していたGPIO17は、外部メモリに接続されていました!ダメじゃん! ということで、ピンマッピング見直して、上述のピン設定に落ち着きました。