はじめに
ncs v1.6.1環境にて nRF9160DKやnRF9160 feather等で Ethernet Sheild(W5500&SDカードの SPI モジュール)を利用する方法についての覚書。
Zephyrのライブラリはとっつきにくいのでかなりハマる。
今回の記事での実装方法は、動作はするが正解ではないと思われる。
正解を知りたいが情報が少ない。
配線について
できれば直結、もしくはできるだけシンプルに短い配線を心がけないと、
まともな波形は出なかった。
ライブラリなど
W5500は、Zephyrのドライバを使用せず、wiznet提供のライブラリを無理やり移植。
https://github.com/Wiznet/ioLibrary_Driver
SDカードは、Zephyrのライブラリを利用することで、
とりあえず動作するようになった。
一番の問題は SPI の操作。
普通(?)のやり方で実装しても全く動作しなかった。
NRFX_SPIMライブラリを利用するやり方を試したらなぜか動作した。
CONFIG_SPI=n
CONFIG_NRFX_SPIM=y
CONFIG_NRFX_SPIM2=y
CONFIG_NRFX_SPIM3=y
CONFIG_DISK_ACCESS=y
CONFIG_DISK_DRIVER_SDMMC=y
CONFIG_SDMMC_OVER_SPI=y
CONFIG_FILE_SYSTEM=y
CONFIG_FAT_FILESYSTEM_ELM=y
SPI2 を SD カード用、 SPI3 を W5500 用に利用。
割り込みがUARTやI2Cとコンフリクトするので、無効化する必要がある。
追記:overlay ファイルにて、 spim3 の
compatible = "nordic,nrf-spim";
を
compatible = "wiznet,w5500";
に変更したら、下記の症状はなくなり、
irq_connect_dynamicを利用したり、nrfx_spimライブラリの修正する必要はなくなった。
// SEGGER Embedded Studio auto generated
&uart1 {
status = "disabled";
};
&gpio0 {
status = "okay";
};
&gpiote {
status = "okay";
};
&i2c2 {
status = "disabled";
};
&spi1 {
status = "disabled";
};
&spi2 {
compatible = "nordic,nrf-spim";
status = "okay";
mosi-pin = <21>;
miso-pin = <22>;
sck-pin = <19>;
cs-gpios = <&gpio0 3 GPIO_ACTIVE_LOW>; /* SDHC */
sdhc0: sdhc@0 {
compatible = "zephyr,mmc-spi-slot";
reg = <0>;
status = "okay";
label = "SDHC0";
//spi-max-frequency = <24000000>;
spi-max-frequency = <8000000>;
};
};
&spi3 {
// compatible = "nordic,nrf-spim";
compatible = "wiznet,w5500";
interrupts = < 0xb 0x1 >;
status = "okay";
mosi-pin = <21>;
miso-pin = <22>;
sck-pin = <19>;
cs-gpios = <&gpio0 4 GPIO_ACTIVE_LOW>; /* W5500 */
};
featherのピン配置は、以下のように設定
COPI(MOSI)ピンは 21 ピン
CIPO(MISO)ピンは 22 ピン
SCKピンは、19ピン
W5500 の CSピン は 4ピン(基板上の 8ピン)
SDCard の CSピン は 3ピン(基板上の 7ピン)
Ethernet Sheild の W5500 と SDCard の MOSI,MISO,SCK は共通なので、こんな感じにしてみた。
その他の注意点
W5500(SPI3)と SD(SPI2)の切り替え時には
NRF_SPIM3->ENABLE = 0; //もしくは NRF_SPIM2->ENABLE = 0;
のように利用しない方のSPIを無効化する必要があった。
有効化は 0 の代わりに 7 を代入すればよい。
これも正しい方法がわからないので、とりあえず動作したレベルの話。
NORDIC nRF9160DK
nRF9160DKは、Ethernet Sheild の直挿しで動作した。
事前に、nRF9160DK 上の nRF52840 に、ピンの配線を切り替えるプログラムを書き込んでおかないと、ちゃんと動作しないので注意。
nRF9160DK のボード配線のコントロールは nRF52840 側で設定する必要がある。
デフォルトだとLEDやスイッチにつながっている。
UARTもVCOM(USB上の仮想ポート)に接続しているので、ピンに配線しても何も出力されないし入力もされない。
さいごに
nRF9160 は LTE 通信を手軽に利用できるメリットが大変素晴らしい。
しかし開発環境が難解かつライブラリの仕様がコロコロ変わるのが惜しいところ。
ただし、当面は付き合わないといけないチップなので、頑張るしかない。
以上、ご参考まで。
P.S. ソースを公開できなくて申し訳ないです