nRF Connect SDK:SDMMC(V2.0+ 改版)

# 前書き
正直、こいつが一番強敵でした・・・なぜ動かないのか全然分かりませんでした。
# 前回の記事
以前(V2.0より前のSDK)の記事はこちらです。

https://qiita.com/yoshihiro0709/items/cb493bc0399775706ee2

とりあえず以前の記事で紹介したコードを動かしてみます。が、前書きに書いていることからも分かるようにうんともすんとも言いませんでした。
V2.0になって大幅に変わったのかと思ってSDK付属のサンプルプロジェクトから起こし直してみますが、特に何かが変わっているようには見えません。試しに起こし直したサンプルプロジェクトを動かしてみると・・・動かんやんけ！(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/94eec6ad-9a89-1e3f-af2f-06ca65319149.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/086d1ef3-ccc3-308d-d63c-e91aabc40d98.png)
もしかしてSPIの接続が間違っているのかとか、SDカードが読めなくなっているかとか、色んなことを調べましたが分かりません。オシロスコープで波形を見てみてもクロックすら出ていません。正直、完全にお手上げでした。

::: note
ちなみに2～3日費やしました・・・本当に分かりませんでした。
:::

# bindingsから調べよう
ハードウェア面やサンプルプロジェクトを探る面からは完全にお手上げになったので、今度は一つずつ分解していこうと思い立ちました。というより、それくらいしか見るところがなかったからです。きっかけはなんとなくoverlayファイルを開いたときだったのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/a3a78ee9-e966-44cc-e1ab-8f58a8539071.png)
え？Unknown node typeってなに・・・？存在しないってこと？(そうだよ(笑))
早速SDK内のbindingsファイルを検索してみたのですがやはり見つからず・・・。ちなみにV2.0より前のSDKにはちゃんとあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/65f29e01-cbc7-9f91-79aa-acfd10119a54.png)
# やっと見つけた
きっとここらへんに問題があるというのが分かってきたので検索して調べてみたところ、やっと見つけました。Zephyr 3.1のリリースノートに記載がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/797a494b-0a10-cf12-ba9b-ef14ecbf49ae.png)
いや、ちょっと待てよ。Bindingだけ削除してサンプルプロジェクトはそのまんまかよ！というツッコミはしてはいけません(笑)

::: note
このせいでどれだけ時間を費やしたことか・・・
:::

# どう直せばよいか
というのも調べていくとドキュメントの中にありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/23b01050-53ac-0efe-3534-5bb932d873ec.png)

```
&spi1 {
        status = "okay";
        cs-gpios = <&porta 27 GPIO_ACTIVE_LOW>;

        sdhc0: sdhc@0 {
        compatible = "zephyr,sdhc-spi-slot";
                reg = <0>;
                status = "okay";
        mmc {
        compatible = "zephyr,sdmmc-disk";
        status = "okay";
        };
                spi-max-frequency = <24000000>;
        };
};
```
このように修正すればよいみたいです。なお、そのまんま貼り付けるとなぜかmmcのnodeに破線が表示されますが、強行突破(コンパイル)してみたところ問題なさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/07cd90ac-14f2-15e2-71e8-fb5b4edb665b.png)

::: note
だってspi1ってSD Busだしな・・・
:::

なお、こちらにも記載があります。

https://docs.zephyrproject.org/3.1.0/services/storage/disk/access.html

# ということで
やっとSDカードを読み込むことができました。この不具合は近々修正されるのではないかと思いますが、もし急いで使いたいという方がいたら参考になれば幸いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/f5f618b7-f72a-2e82-7037-434d2a1defe2.png)

::: note
あえてSDカードの中身をそのまま表示していますがあまりジロジロ見ないでね・・・(笑)
:::

# ソースコード
``` main.c
サンプルコードそのままなので省略
```

``` prj.conf
CONFIG_SPI=y
CONFIG_DISK_DRIVER_SDMMC=y
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_NRFX_SPIM0=y
CONFIG_NRFX_SPIM2=y
CONFIG_DEBUG_THREAD_INFO=y
CONFIG_FILE_SYSTEM=y
CONFIG_FAT_FILESYSTEM_ELM=y
CONFIG_FS_FATFS_LFN=y
CONFIG_FS_FATFS_CODEPAGE=932
CONFIG_LOG=y
CONFIG_DEBUG_OPTIMIZATIONS=y
```

``` overlay
/*
 * Copyright (c) 2019 Tavish Naruka <tavishnaruka@gmail.com>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

&spi1 {
        status = "okay";
        cs-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;

        sdhc0: sdhc@0 {
                compatible = "zephyr,sdhc-spi-slot";
                reg = <0>;
                status = "okay";
                mmc {
                        compatible = "zephyr,sdmmc-disk";
                        status = "okay";
                };
                spi-max-frequency = <24000000>;
        };
};
```

::: note
なお、デフォルトのSPI1のピン設定は
SCLK = P0.30
MISO = P0.31
MOSI = P1.08
です。
:::