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

# 過去の記事
以前にもSPIMの使い方の記事を書きました。

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

この時のSDKはまだV1.xだったこともあってSegger Embedded Studio(以下SES)での開発でした。

::: note warn
SESでの開発が関係あるのかは検証しておりませんが・・・。
:::

# VSCodeで動かしてみる
V2.0以降はVSCodeしかサポートしていないこともあって改めて検証してみます。と言っても普通に考えれば動くはずなんですけどね・・・けどね・・・動かないやん！(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/75749502-d027-c68e-b1e6-a8ec9886b916.png)
## コンパイルできない
エラーメッセージを見てみるとNRFX_SPIM_INSTANCE(0)が見つからないらしい。んなアホな！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/767df592-b9d8-1f1c-30b0-3d5e9b069926.png)
## Kconfigを見てみる
V2.0になってからKconfigが結構な勢いで刷新されたので、もしかしたら設定が何か変わっているのかな、と思って確認してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/453013f7-1d96-e212-804a-a3883b739f1c.png)
なんだこれ、グレーアウトしているということは使えないということ？どういうことなんだ・・・？
## どうやらこういうことらしい
ここで紹介しているサンプルコードは全てNordicの評価ボードを使用しています。そのNordicの評価ボードのDT(Device Tree)で定義されているのが原因のようです。具体的には

``` 52840dk.dts
&spi0 {
	compatible = "nordic,nrf-spi";
	/* Cannot be used together with i2c0. */
	/* status = "okay"; */
	pinctrl-0 = <&spi0_default>;
	pinctrl-1 = <&spi0_sleep>;
	pinctrl-names = "default", "sleep";
};

&spi1 {
	compatible = "nordic,nrf-spi";
	status = "okay";
	pinctrl-0 = <&spi1_default>;
	pinctrl-1 = <&spi1_sleep>;
	pinctrl-names = "default", "sleep";
};

&spi2 {
	compatible = "nordic,nrf-spi";
	status = "disabled";
	pinctrl-0 = <&spi2_default>;
	pinctrl-1 = <&spi2_sleep>;
	pinctrl-names = "default", "sleep";
};
```

の中にある

```
compatible = "nordic,nrf-spi";
```

があるため、SPIMではなくSPIとしてペリフェラルが定義されているようです。つまり、Nordicの評価ボードを使うのであればSPIMは3しか使えないということになります。
ということで修正してみました。
``` main.c
/*
 * Copyright (c) 2012-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/zephyr.h>
#include <nrfx_spim.h>

#define SPIM_SCLK         (22)
#define SPIM_MOSI         (23)
#define SPIM_MISO         (24)
#define SPIM_SS           (25)

static const nrfx_spim_t m_spim3 = NRFX_SPIM_INSTANCE(3);

static uint8_t m_spim_tx_buffer[32], m_spim_rx_buffer[32];

void main(void)
{
    nrfx_err_t err_code;
    size_t tx_length, rx_length;

    // Initialize
    const nrfx_spim_config_t spim3_config = NRFX_SPIM_DEFAULT_CONFIG(SPIM_SCLK, SPIM_MOSI, SPIM_MISO, SPIM_SS);
    err_code = nrfx_spim_init(&m_spim3, &spim3_config, NULL, NULL);
    if (err_code != NRFX_SUCCESS)
    {
        printk("SPIM Initialize failed with:%d\n", err_code);
    }

    while (1)
    {
        // Read from SPI Device
        m_spim_tx_buffer[0] = 0xff;
        m_spim_tx_buffer[1] = 0x80;
        tx_length = 2;
        rx_length = 14;
        nrfx_spim_xfer_desc_t spim_xfer_desc = NRFX_SPIM_XFER_TRX(m_spim_tx_buffer, tx_length, m_spim_rx_buffer, rx_length);
        err_code = nrfx_spim_xfer(&m_spim3, &spim_xfer_desc, 0);
        if (err_code != NRFX_SUCCESS)
        {
            printk("SPI Error with:%d\n", err_code);
        }
        
        // Wait
        k_msleep(1000);
    }
}
```
これで無事にコンパイルが通りました。めでたしめでたし。
## カスタムボードを作れば？
今回の問題を起こしているのが標準で存在しているNordic評価ボードのDTということは・・・ピコーン！自分でDTを作ればいいのでは？
はい、その通りです。先ほどの
```
compatible = "nordic,nrf-spi";
```
さえなくなればよいのです。ということで早速カスタムボードを作ってみます。カスタムボードの作り方は以前にも紹介しています。いや、紹介というレベルの記事じゃないですが(笑)

https://qiita.com/yoshihiro0709/items/969d23ca5a58e3382a1f