nRF connect SDK:SPIM


SPIMはnRF SDKのコードがそのまま使える

SPIM自体は割と新しめのSDKで追加されたという記憶があるので、コードをなるべくいじらないように昔から動かしている場合はSPIMではなくSPI(もしくはNRFX_SPI)を使っていると思います。残念ながらSPIのコードは使えませんが、SPIMのコードであればそのまま使うことができます。

main.c
/*
 * Copyright (c) 2012-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

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

#define SPIM_SCLK         (32 + 12)
#define SPIM_MOSI         (32 + 13)
#define SPIM_MISO         (32 + 14)
#define SPIM_SS           (32 + 15)

static const nrfx_spim_t m_spim1 = NRFX_SPIM_INSTANCE(0);

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 spim1_config = NRFX_SPIM_DEFAULT_CONFIG(SPIM_SCLK, SPIM_MOSI, SPIM_MISO, SPIM_SS);
    err_code = nrfx_spim_init(&m_spim1, &spim1_config, NULL, NULL);
    if (err_code != NRFX_SUCCESS)
    {
        printk("SPIM Initialize failed with:%d\n", err_code);
    }

    // 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_spim1, &spim_xfer_desc, 0);
    if (err_code != NRFX_SUCCESS)
    {
        printk("SPI Error with:%d\n", err_code);
    }
}

あ、当然ですがprj.confも変更が必要です。

prj.conf
# Use necessary peripherals
CONFIG_NRFX_SPIM0=y

SPIMはTRX一択でOK

TWIM(I2C)は受信(リード)しないのにTRXを使うとハングアップしてしまいますが、SPIMは特にそのような制限はないので、常にTRX一択で問題ないです。お行儀のよいコード(笑)を目指すのであればTX/RX/TRXを使い分けましょう。

非同期処理がやりやすくなっている

nRF SDK時代も非同期処理で使っていた方はいると思いますが、シングルタスクなのでそれなりに考えないと非同期処理がめんどくさいというのは否めませんでした。特にデバイス初期化時にコマンドを連続する場合などは同期処理で勝手に待っていてくれた方がはるかに楽です。
nRF Connect SDKではRTOSでタスク処理になったこともあってシングルスレッドで動くことはありえないため、逆に非同期でのペリフェラル処理はやりやすく(?)なっています。
(単に複数のワーカースレッドを動かすことになるので、その一つとしてペリフェラルコールバックが入るだけという意味です)
ペリフェラルごとにスレッドを作ればコールバックがなくても事実上の非同期処理にもなります。

余談

TWIMの記事を公開しているので別にSPIMは公開しなくてもよいかと思って手元の下書きに放置していたのですが、せっかくなので公開することにします。