#![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: 読み取りたいレジスタのアドレスを
// 磁力計に送信する
{
// START をブロードキャストする
// R/W ビットを Write に設定した MAGNETOMETER アドレスをブロードキャストする
i2c1.cr2.write(|w| {
w.start().set_bit();
w.sadd().bits(MAGNETOMETER);
w.rd_wrn().clear_bit();
w.nbytes().bits(1);
w.autoend().clear_bit()
});
// さらにデータを送信できるようになるまで待つ
while i2c1.isr.read().txis().bit_is_clear() {}
// 読み取りたいレジスタのアドレスを送信する: IRA_REG_M
i2c1.txdr.write(|w| w.txdata().bits(IRA_REG_M));
// 前のバイトが送信されるまで待つ
while i2c1.isr.read().tc().bit_is_clear() {}
}
// ステージ2: 要求したレジスタの内容を受信する
let byte = {
// RESTART をブロードキャストする
// R/W ビットを Read に設定した MAGNETOMETER アドレスをブロードキャストする
i2c1.cr2.modify(|_, w| {
w.start().set_bit();
w.nbytes().bits(1);
w.rd_wrn().set_bit();
w.autoend().set_bit()
});
// レジスタの内容を受信するまで待つ
while i2c1.isr.read().rxne().bit_is_clear() {}
// STOP をブロードキャストする(`AUTOEND = 1` のため自動)
i2c1.rxdr.read().rxdata().bits()
};
// 期待される出力: 0x0A - 0b01001000
iprintln!(&mut itm.stim[0], "0x{:02X} - 0b{:08b}", IRA_REG_M, byte);
loop {}
}