Nordicの nRF54L15-DK から LSM6DSO センサへのZephyr Linux I2C インターフェース

この記事を読み進める前に、Nordicの nRF54L15-DK 開発キットに関する以前のインストール手順を参照してください。ここでは、この nRF54L15-DK 開発キットをDigikeyから入手可能なIoT用のLSM6DSO I2C センサに接続する手順を説明します。以下の図は、両者をどのように接続しているかを示しています。

まず、Zephyr OSのdevファイルに関連する以下のディレクトリ構造を作成します。

|-- CMakeLists.txt
|-- nrf54l15dk_nrf54l15.overlay
|-- prj.conf
`-- src
    `-- main.c


CMakeLists.txtは以下のとおりです。

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(blinky)

target_sources(app PRIVATE src/main.c)

proj.confファイルは以下のように示されます(CONFIG_CBPRINTF_FP_SUPPORT は浮動小数点印刷のサポートを提供するために使用されます)。

CONFIG_GPIO=y

CONFIG_I2C=y

CONFIG_CBPRINTF_FP_SUPPORT=y

そして最も重要なのは、以下のオーバーレイファイルです。これにより、I2Cインターフェース経由で LSM6DSO センサを、Digikeyから入手可能なNordicの nRF54L15-DK 開発キット上で動作するmain.c Zephyr「RTOS」アプリケーションに接続することができます。このオーバーレイファイルでは、I2Cインターフェースのマスター周波数を100KHz、I2Cスレーブアドレスを0x6Bに設定しています。

&i2c22 {
    status = "okay";
    pinctrl-0 = <&i2c22_default>;
	pinctrl-1 = <&i2c22_sleep>;
    clock-frequency = <100000>;
    pinctrl-names = "default", "sleep";
    mysensor: mysensor@6b{
        compatible = "i2c-device";
        status = "okay";
        reg = < 0x6b >;
    };
};

&pinctrl {
	/omit-if-no-ref/ i2c22_default: i2c22_default {
		group1  {
			psels = <NRF_PSEL(TWIM_SCL, 1, 11)>,
					<NRF_PSEL(TWIM_SDA, 1, 12)>;
		};
	};

	/omit-if-no-ref/ i2c22_sleep: i2c22_sleep {
		group1  {
			psels = <NRF_PSEL(TWIM_SCL, 1, 11)>,
					<NRF_PSEL(TWIM_SDA, 1, 12)>;
			low-power-enable;
		};
	};
};


main.cは以下のようになります。


#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/sys/printk.h>


#define I2C_NODE DT_NODELABEL(mysensor)
static const struct i2c_dt_spec dev_i2c = I2C_DT_SPEC_GET(I2C_NODE);
#define WHOAMI  0x0F

/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS   1000

/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)


static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

int main(void)
{


    if (!device_is_ready(dev_i2c.bus)) {
	    printk("I2C bus %s is not ready!\n\r",dev_i2c.bus->name);
	    return -1;
    }

	int ret;
	bool led_state = true;

	if (!gpio_is_ready_dt(&led)) {
		return 0;
	}

	ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
	if (ret < 0) {
		return 0;
	}

	while (1) {

        uint8_t id = 0;
	    uint8_t regs[] = {WHOAMI};
    
        int ret = i2c_write_read_dt(&dev_i2c, regs, 1, &id, 1);

	    if (ret != 0) {
		    printk("Failed to read register %x \n", regs[0]);
		    return -1;
	    }

	    if (id != 0x6C) {
		    printk("Invalid chip id! %x \n", id);
		    return -1;
	    }
        else {
            printk("Found WHOAMI = %x\n", id);
        }

		ret = gpio_pin_toggle_dt(&led);
		if (ret < 0) {
			return 0;
		}

		led_state = !led_state;
		printf("LED state: %s\n", led_state ? "ON" : "OFF");
		k_msleep(SLEEP_TIME_MS);


        //Read and print values
        uint8_t values[65];
	    ret = i2c_burst_read_dt(&dev_i2c, 0x00, values, 64);
	    if (ret != 0) {
		    printk("Failed to read registers %x \n", 0x00);
		    return;
	    }
        int i = 0;
        while(i < 64)
        {
            printk("Register %x = %x\n", i, values[i]);
            i = i + 1;
        }

	}

	return 0;
}

このmain.cは、WHOAMIレジスタを読み出すと同時にLEDを点滅させ、センサのASIC内の65個のレジスタアドレスの自動インクリメント(バースト)読み取りを実行します。これらの I2C トランザクションは以下のとおりです。

int ret = i2c_write_read_dt(&dev_i2c, regs, 1, &id, 1);

 ret = i2c_burst_read_dt(&dev_i2c, 0x00, values, 64);

上記は、Zephyr OSのAPIと適切なマクロを介して実行したものです。これをコンパイル(ビルド)するには、以下のステップを実行します。

(venv) $ west build -p always -b nrf54l15dk/nrf54l15/cpuapp -- -DEXTRA_DTC_OVERLAY_FILE=nrf54l15dk_nrf54l15.overlay

次に、 Nordic nRF54L15-DK を以下のようにプログラムします。

(venv) $ west flash

プログラミングが完了したら、以下のセットアップを使用して、SparkFunの6軸センサ LSM6DSO 用ブレークアウト基板を使用して、このI2C通信機能のデモを行います。

この動画では、I2Cインターフェースが LSM6DSO センサと通信している間、LEDが点滅している様子が確認できます。同時に、Techforumの記事で以前ご紹介したSparkfunの8チャンネルUSBロジックアナライザが、I2C通信をキャプチャしています。

IoT用 nRF54L15-DK 開発キットはUSB経由でホストに接続されています。SparkfunのチャンネルUSBロジックアナライザがI2Cのトランザクションをキャプチャし、以下のように正しく動作していることを確認できます。

このコマンドを使ってminicomターミナルを開いてください。

minicom -D /dev/ttyACM1

以下に示すように、SparkFunの6軸センサ LSM6DSO 用ブレークアウト基板のWHOAMIレジスタから取得したNordic nRF54L15-DK からの受信したデータを監視します。

Found WHOAMI = 6c
LED state: ON
Register 0 = 0
Register 1 = 0
Register 2 = 3f
Register 3 = 0
Register 4 = 0
Register 5 = 0
Register 6 = 0
Register 7 = 0
Register 8 = 0
Register 9 = 0
Register a = 0
Register b = 0
Register c = 0
Register d = 0
Register e = 0
Register f = 6c
Register 10 = 0
Register 11 = 0                                                                                                                     
Register 12 = 4                                                                                                                     
Register 13 = 0                                                                                                                     
Register 14 = 0                                                                                                                     
Register 15 = 0
Register 16 = 0
Register 17 = 0
Register 18 = e0
Register 19 = 0
Register 1a = 0
Register 1b = 0
Register 1c = 0
Register 1d = 0
Register 1e = 0
Register 1f = 28
Register 20 = 0
Register 21 = 0
Register 22 = 0
Register 23 = 0
Register 24 = 0
Register 25 = 0
Register 26 = 0
Register 27 = 0
Register 28 = 0
Register 29 = 0
Register 2a = 0
Register 2b = 0
Register 2c = 0
Register 2d = 0
Register 2e = 0
Register 2f = 0
Register 30 = 0
Register 31 = 0
Register 32 = 0
Register 33 = 0
Register 34 = 0
Register 35 = 0
Register 36 = 0
Register 37 = 0
Register 38 = 0
Register 39 = 0
Register 3a = 0
Register 3b = 0
Register 3c = 0
Register 3d = 0
Register 3e = 0
Register 3f = 0
Found WHOAMI = 6c
LED state: OFF

この記事では、Digikeyから入手可能なNordic nRF54L15-DK 開発ボードにI2C経由でセンサを接続する方法を説明しました。Digikeyでは、このIoT用Nordicの nRF54L15-DK 開発キットに取り付けることができる多くのI2 センサ を取り扱っています。ここで説明した手順を使用して多くのIoTプロジェクトを行うことができます。良い一日をお過ごしください!

この記事はスペイン語でここからからご覧いただけます。

Este artículo está disponible en lenguaje español aquí.




オリジナル・ソース(English)