nRF52840 + SES で SDカードサンプルプログラムを試す


環境

  • Nordic nRF5 SDK v15.2.0
  • SEGGER Embedded studio for ARM V4.10a
  • J-link v9(中華製)
  • Raytac MDBT50Q-DB

中華製の micro SD カード DIP 化モジュールを使いました。

接続

ジャンパーワイヤーを使って接続します。

nRF52840側は、空いているGPIOに接続しました。

microSD側 MDBT50Q DB(nRF52840)側
CLK(SCK) P0.22
MOSI P0.14
MISO P0.25
CS P0.23
3V3 適当なVCC
GND GND

但し、GPIOは Low frequency I/O only というのがあるらしく、それだけ注意(巻末のおまけ参照)。

なお、写真の上に伸びているものは J-Link へのケーブル、下側の黒いケーブルは適当な GND に接続しています。

全体構成。

サンプルプログラム

examples/peripheral/fatfs を基に、以下のように変更しました。

fatfs フォルダの中の pca10056/blank/ses/fatfs_pca10056.emProject
を開きます。


/*
#define SDC_SCK_PIN     ARDUINO_13_PIN  ///< SDC serial clock (SCK) pin.
#define SDC_MOSI_PIN    ARDUINO_11_PIN  ///< SDC serial data in (DI) pin.
#define SDC_MISO_PIN    ARDUINO_12_PIN  ///< SDC serial data out (DO) pin.
#define SDC_CS_PIN      ARDUINO_10_PIN  ///< SDC chip select (CS) pin.
*/

#define SDC_SCK_PIN     22  ///< SDC serial clock (SCK) pin.
#define SDC_MOSI_PIN    14  ///< SDC serial data in (DI) pin.
#define SDC_MISO_PIN    25  ///< SDC serial data out (DO) pin.
#define SDC_CS_PIN      23  ///< SDC chip select (CS) pin.

ちなみに、元々の設定の ARDUINO_12_PIN だとかの割当は以下のようになっていました。


#define ARDUINO_13_PIN              NRF_GPIO_PIN_MAP(1, 15)  // Digital pin 13
#define ARDUINO_12_PIN              NRF_GPIO_PIN_MAP(1, 14)  // Digital pin 12
#define ARDUINO_11_PIN              NRF_GPIO_PIN_MAP(1, 13)  // Digital pin 11
#define ARDUINO_10_PIN              NRF_GPIO_PIN_MAP(1, 12)  // Digital pin 10

(Nordic/SDK/components/boards/pca10056.h)

実行結果は NRF_LOG_INFO で情報が出るようになっています。

sdk_config.h 中では、


#ifndef NRF_LOG_BACKEND_UART_ENABLED
#define NRF_LOG_BACKEND_UART_ENABLED 1
#endif

となっているので UART に出力されるようになっています。
今回は、RTTに出力するので


#ifndef NRF_LOG_BACKEND_UART_ENABLED
#define NRF_LOG_BACKEND_UART_ENABLED 1
#endif

とし、代わりに


#ifndef NRF_LOG_BACKEND_RTT_ENABLED
#define NRF_LOG_BACKEND_RTT_ENABLED 0
#endif

を以下に変更しました。


#ifndef NRF_LOG_BACKEND_RTT_ENABLED
#define NRF_LOG_BACKEND_RTT_ENABLED 1
#endif

これで、Debug Terminal に出力されるようになります。

実行結果

「Build」 - 「Build and Debug」 で試してみます。

「Disk initialization failed.」エラーが出ています。何回か実行しなおして、3回めに成功しています。これは、ジャンパーピンの接触が悪く、3回めは手で押さえながら実行したものです。

おまけ 低速用の GPIO ピン

nRF52840 では、「Low frequency I/O only」 として、以下の GPIO ピンが指定されています。

  • P0.02
  • P0.03
  • P0.09
  • P0.10
  • P0.28
  • P0.30
  • P1.01
  • P1.02
  • P1.03
  • P1.04
  • P1.05
  • P1.06
  • P1.07
  • P1.10
  • P1.11
  • P1.12
  • P1.13
  • P1.14
  • P1.15

Low frequency I/O is signals with a frequency up to 10 kHz.とDatasheetにはあります。
https://devzone.nordicsemi.com/f/nordic-q-a/36367/using-gpios-marked-as-standard-drive-low-frequency-for-spi-on-nrf52840

によると、
due to HF interference being injected into the RF radio
だそうです。このQ&Aでは、8MHzのSPIで使えたけど?と質問があります。実際に僕はSPIではなくI2Cで該当ピンを使ってみて、単体テストでは使えましたがいろんな機能と共に動かすと不安定になりました。