读取单个寄存器

让我们把所有这些理论付诸实践吧!

就像USART外围设备一样,我已经在你到达main之前完成了初始化,所以你只需要处理以下寄存器:

  • CR2. 控制寄存器2。
  • ISR. 中断和状态寄存器。
  • TXDR. 传输数据寄存器。
  • RXDR. 接收数据寄存器。

这些寄存器记录在参考手册的以下章节中:

第28.7节I2C寄存器-第868页-参考手册

我们将结合引脚PB6 (SCL)和PB7 (SDA)使用I2C1外围设备。

这次你不必布线,因为传感器在板上,并且已经连接到微控制器。 但是,我建议您断开串行/蓝牙模块与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::*};

// Slave address
const MAGNETOMETER: u16 = 0b0011_1100;

// Addresses of the magnetometer's registers
const OUT_X_H_M: u8 = 0x03;
const IRA_REG_M: u8 = 0x0A;

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

    // Stage 1: Send the address of the register we want to read to the
    // magnetometer
    {
        // TODO Broadcast START

        // TODO Broadcast the MAGNETOMETER address with the R/W bit set to Write

        // TODO Send the address of the register that we want to read: IRA_REG_M
    }

    // Stage 2: Receive the contents of the register we asked for
    let byte = {
        // TODO Broadcast RESTART

        // TODO Broadcast the MAGNETOMETER address with the R/W bit set to Read

        // TODO Receive the contents of the register

        // TODO Broadcast STOP
        0
    };

    // Expected output: 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