1つのレジスタを読む
理論を実践してみましょう!
USARTペリフェラルと同様に、mainに到達する前に全てを初期化しています。
下記レジスタを取り扱うだけで済みます。
CR2. コントロールレジスタ2ISR. 割込み、ステータスレジスタTXDR. 送信データレジスタRXDR. 受信データレジスタ
これらのレジスタは、リファレンスマニュアルの下記セクションに記載されています。
Section 28.7 I2C registers - Page 868 - Reference Manual
PB6(SCL)とPB7(SDA)ピンにつながっている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,AUTOENDISR:TXIS,RXNE,TCTXDR:TXDATARXDR:RXDATA