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
,AUTOEND
ISR
:TXIS
,RXNE
,TC
TXDR
:TXDATA
RXDR
:RXDATA