センサーを初期化する
センサーを初期化しましょう。そのために、まず embassy-nrf と BSP クレートを使用して I2C インターフェースを作成します。I2C インターフェースを生成したら、それを Lsm303agr ドライバーに渡してセンサーを初期化します。
必要な import を追加します:
#![allow(unused)] fn main() { use embassy_nrf::{self as hal, twim::Twim}; use hal::twim; use lsm303agr::Lsm303agr; }
マスターモードの Two Wire Interface (TWIM)
embassy-nrf クレートが提供する I2C 互換の TWIM ドライバーを初期化します。このペリフェラルにより、nRF プロセッサーは I2C マスターとして動作し、LSM303AGR センサーのようなデバイスと通信できます。
Twim インスタンスを作成します。これには、I2C ペリフェラル (TWISPI0)、割り込みハンドラー (Irqs)、I2C ピン (SDA と SCL)、および設定 (ここではデフォルトのまま使用します) が必要です。
#![allow(unused)] fn main() { static RAM_BUFFER: ConstStaticCell<[u8; 16]> = ConstStaticCell::new([0; 16]); let twim_config = twim::Config::default(); let twim0 = Twim::new( board.twispi0, Irqs, board.i2c_int_sda, // 内部 I2C SDA、GPIO ピン: P0_08 board.i2c_int_scl, // 内部 I2C SCL、GPIO ピン: P0_08 twim_config, RAM_BUFFER.take(), ); }
最後のパラメーターは、TWIM ドライバーがデータ送信時に使用する RAM バッファーです。データがフラッシュメモリに保存されている場合 (コード内に記述した固定のバイト配列など)、それを I2C 経由で直接送信することはできません。ドライバーはまずこのバッファーを使ってそのデータを RAM にコピーします。ConstStaticCell を使用して RAM 上に安全にバッファーを作成し、.take() でそれに安全にアクセスできます。16 バイトのバッファーは、センサーとの通信のような一般的な I2C タスクには通常十分です。RAM バッファーが送信対象のデータを保持するには小さすぎる場合、TWIM ドライバーは panic し、RAMBufferTooSmall エラーを返します。
Lsm303agr ドライバー
TWIM が初期化されたら、それを Lsm303agr::new_with_i2c 関数に渡せます。この関数は、指定した I2C インターフェースを使用してセンサードライバーの新しいインスタンスを作成します。
#![allow(unused)] fn main() { let mut sensor = Lsm303agr::new_with_i2c(twim0); }