读取单个寄存器
让我们把所有这些理论付诸实践吧!
就像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