Module f3::examples::spi_read_multi [] [src]

SPI - read multiple gyroscope registers in "one shot"

#![no_main]
#![no_std]

#[macro_use]
extern crate f3;

use f3::peripheral;

#[export_name = "main"]
pub extern "C" fn main() -> ! {
    // OUT_X_L
    const REGISTER_ADDRESS_START: u8 = 0x28;
    // Read the register
    const READ: u8 = 1 << 7;
    // Multiple reading.
    const MS: u8 = 1 << 6;

    let mut bytes = [0; 6];

    unsafe {
        let spi1 = peripheral::spi1_mut();
        let gpioe = peripheral::gpioe();

        // CS: low
        gpioe.bsrr.write(|w| w.br3(true));

        while !spi1.sr.read().txe() {}
        spi1.dr.write_u8(READ | MS | REGISTER_ADDRESS_START);
        while !spi1.sr.read().rxne() {}
        spi1.dr.read_u8();
        for byte in &mut bytes {
            while !spi1.sr.read().txe() {}
            spi1.dr.write_u8(0x0);
            while !spi1.sr.read().rxne() {}
            *byte = spi1.dr.read_u8();
        }

        // CS: high
        gpioe.bsrr.write(|w| w.bs3(true));
    }

    for (byte, i) in bytes.iter().zip(0..) {
        iprintln!("0x{:02x} - 0x{:02x}", REGISTER_ADDRESS_START + i, byte);
    }

    loop {}
}