nRF Connect SDK:FatFS

# FatFSとは
ELMという方が作った、組込みシステムでFATファイルシステムを使うためのモジュールです。私もFPGA時代には非常にお世話になりました。過去に使ったことがあるというのは大きくてnRF SDKでもnRF Connect SDK(以下NCS)でも比較的すんなりと入ることができます。

:::note warn
とは言ってみたけれど、実は過去に一度使おうと思って動かしてみた時には思いっきり挫折しました。動かし方が全く分かりませんでした・・・。
:::

ちなみに本家のホームページはこちらです。昔は日本語版もあったけれど現在は英語のみのようです

http://elm-chan.org/fsw/ff/00index_e.html

# そもそもにおいて
当たり前の話なのですが、SDカードを読み書きするものなので評価ボード単体では動かすことはできません。評価ボードにSDカードを挿すこともできませんが、それは別売りで秋月電子などで簡単に入手することが可能です。

https://akizukidenshi.com/catalog/g/gK-05488/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/7123c5ec-2f80-1a28-8380-70225089723d.png)

例えばこんなのを使ってジャンパー線で接続すれば動かすことができそうです。

# サンプルプロジェクトはある
FatFSのサンプルプロジェクトはNCSに含まれていて、以下のパスにあります。
/zephyr/samples/subsys/fs/fat_fs
ですが、これをプロジェクトとして開いてみてもSDカードはうんともすんとも言いません。(ここでまずハマった)
SDカードの機能はoverlayとして定義されており、そのoverlayはblipというボード用に記述されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/40fc3c53-9e62-aaef-ceda-cff1bf6067cb.png)
なるほど、ということはblipという基板はおそらく最初からSDカードスロットが付いているんだ！と思って興味本位で探してみましたが・・・あれ？(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/81cc3738-d4c3-1a28-0af7-f3561ba3cb87.png)
なお、blip用のボードファイルはDKとは全然ピン配が違うので、このボードの設定でNordicの評価ボードを使うことはできません。ですので、このblip用のoverlayをNordicの評価ボード用に名前を変えることで読み込ませます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/4643bc92-2923-c488-c55a-96bf66ce1f3f.png)

:::note
私はnRF52840DKを使っているのでnRF52840にしています。
:::

# 一応中身は見てみる・・・！
ところでoverlayで用意されているSDカード用のconfigって何が書いてあるんだろう・・・一応確認しておきますかね。
```
/*
 * Copyright (c) 2019 Tavish Naruka <tavishnaruka@gmail.com>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

&spi1 {
        status = "okay";
        cs-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;

        sdhc0: sdhc@0 {
                compatible = "zephyr,mmc-spi-slot";
                reg = <0>;
                status = "okay";
                label = "SDHC0";
                spi-max-frequency = <24000000>;
        };
};
```
なるほど、どうもSPI1をSDMMCとして使う設定らしいです。いや、でもなんか気になるんですが・・・SDMMCのCSってアクティブハイなんですか？え？え？普通のSPIなのでCSはアクティブローじゃないの？ま、いいか・・・。

:::note warn
もちろんハマりますw
あと、評価ボードではGPIO0の17番はUARTに割り当てられているのでこれもそのままでは使えません。
:::

```
CONFIG_DISK_DRIVER_SDMMC=y
CONFIG_SPI=y
```

CONFIGはこんな感じ。なるほど、これも必要なんですね。そりゃ試しにプロジェクトを読み込んでみても動かないわけですよ。というか、動作する基板を限定するならoverlayにしなくてもいいのでは・・・。

# Nordic評価ボード用に修正
CSピンはそのままでは使えないので変更します。空いているところなら別にどこでもよいです。
また、先にも書きましたがCSはアクティブローなのでこちらも変更します。blip基板の詳細がよく分かりませんが、インバーターとかMUXが入っているのではないでしょうか？

::: note
さっきの基板の写真ではそんな風には見えませんけどね(笑)
:::

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

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

        sdhc0: sdhc@0 {
                compatible = "zephyr,mmc-spi-slot";
                reg = <0>;
                status = "okay";
                label = "SDHC0";
                spi-max-frequency = <24000000>;
        };
};
```
こんな感じですかね。
# main.cは手を加えなくても動く
ここまで来たらあとは動かすだけです。ということでコンパイルして動かしてみると・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/910c8f27-f16c-4af9-bbf6-c18392d1067f.png)
ちゃんと32GのSDカードを認識しています。よかったよかった。

::: note
ここまで辿り着くのにかなり苦労しましたよ、ええ・・・w
:::