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つずつ当たっていきます。

SCKは、約8us周期でクロックの波形が取れました。128KHzなので合っています。 MOSIは、リセット直後、ソフトリセット (0xFF) を送信していそうです。 CS、明らかに動いていないです!

f:id:tomo-wait-for-it-yuki:20190318093959p:plain
nRF52840 DK note for external pins

CSで指定していたGPIO17は、外部メモリに接続されていました!ダメじゃん! ということで、ピンマッピング見直して、上述のピン設定に落ち着きました。