nRF connect SDK:SPIM
SPIMはnRF SDKのコードがそのまま使える
SPIM自体は割と新しめのSDKで追加されたという記憶があるので、コードをなるべくいじらないように昔から動かしている場合はSPIMではなくSPI(もしくはNRFX_SPI)を使っていると思います。残念ながらSPIのコードは使えませんが、SPIMのコードであればそのまま使うことができます。
/*
* 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も変更が必要です。
# 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は公開しなくてもよいかと思って手元の下書きに放置していたのですが、せっかくなので公開することにします。
Author And Source
この問題について(nRF connect SDK:SPIM), 我々は、より多くの情報をここで見つけました https://qiita.com/yoshihiro0709/items/da74a06d35f6a36a4598著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .