1つのレジスタを読む

理論を実践してみましょう!

USARTペリフェラルと同様に、mainに到達する前に全てを初期化しています。 下記レジスタを取り扱うだけで済みます。

  • CR2. コントロールレジスタ2
  • ISR. 割込み、ステータスレジスタ
  • TXDR. 送信データレジスタ
  • RXDR. 受信データレジスタ

これらのレジスタは、リファレンスマニュアルの下記セクションに記載されています。

Section 28.7 I2C registers - Page 868 - Reference Manual

PB6SCL)とPB7SDA)ピンにつながっているI2C1ペリフェラルを使います。

今回は、何も配線する必要がありません。センサはボード上にあり、既にマイクロコントローラと接続されているからです。 しかし、ボードを動かしやすくするために、シリアル / BluetoothモジュールをF3から外すことをお勧めします。 後ほど、ボードをかなり動かします。

あなたのタスクは、磁力計のIRA_REG_Mレジスタの内容を読み取るプログラムを書くことです。 このレジスタは読み込み専用で、常に0b01001000という値が入っています。

マイクロコントローラは、I2Cマスターの役割を果たします。そしてLSM303DLHC内の磁力計は、I2Cスレーブになります。

スターターコードはこちらです。TODOの部分を実装しなければなりません。

#![deny(unsafe_code)]
#![no_main]
#![no_std]

#[allow(unused_imports)]
use aux14::{entry, iprint, iprintln, prelude::*};

// スレーブアドレス
const MAGNETOMETER: u16 = 0b0011_1100;

// 磁力計レジスタのアドレス
const OUT_X_H_M: u8 = 0x03;
const IRA_REG_M: u8 = 0x0A;

#[entry]
fn main() -> ! {
    let (i2c1, _delay, mut itm) = aux14::init();

    // ステージ1:読みたいレジスタのアドレスを磁力計に送信します。
    {
        // TODO STARTをブロードキャストします

        // TODO 磁力計のアドレスをR/WビットをWriteに設定して、ブロードキャストします

        // TODO 読みたい`IRA_REG_M`レジスタのアドレスを送信します
    }

    // ステージ2:要求したレジスタの内容を受信します
    let byte = {
        // TODO RESTARTをブロードキャストします

        // TODO 磁力計のアドレスをR/WビットをReadに設定して、ブロードキャストします

        // TODO レジスタの内容を受信します

        // TODO STOPをブロードキャストします
        0
    };

    // 期待する出力:0x0A - 0b01001000
    iprintln!(&mut itm.stim[0], "0x{:02X} - 0b{:08b}", IRA_REG_M, byte);

    loop {}
}

追加のヒントです。取り扱う正確なビットフィールドを示します。

  • CR2: SADD1, RD_WRN, NBYTES, START, AUTOEND
  • ISR: TXIS, RXNE, TC
  • TXDR: TXDATA
  • RXDR: RXDATA