i2c.rs 1.50 KiB
#![no_main]
#![no_std]
extern crate panic_halt;
use cortex_m::asm; 
use embedded_hal::blocking::i2c::{Read, Write};
use rtfm::app;
use lpc43xx_hal as driver;
use driver::i2c;
use driver::time::U32Ext;
#[app(device = lpc43xx_pac)]
const APP: () = {
    static mut I2C: i2c::I2C = ();
    #[init]
    fn init() -> init::LateResources {
        let scu = device.SCU;
        let i2c0 = device.I2C0;
        let rgu = device.RGU;
        // reset i2c peripheral
        rgu.reset_ctrl1.write(|w| {
                i2c0_rst().set_bit()
        });
        // wait for reset
        for _ in 0..10000 {
            asm::nop();
        let i2c = i2c::I2C::new(
            &scu.sfsi2c0,
            i2c0,
            i2c::Mode::Master,
            i2c::Speed::Normal,
            12.mhz());
        init::LateResources {
            I2C: i2c,
    #[idle(resources = [I2C])]
    fn idle() -> ! {
        let i2c = resources.I2C;
        let write_buffer: [u8; 2] = [0b000_1111, 234];
        let select_reg: [u8; 1] = [0b000_1111];
        let mut read_buffer: [u8; 1] = [0; 1];
        let slave_addr: u8 = 0b1010_000;
        i2c.write(slave_addr, &write_buffer).unwrap();
        i2c.write(slave_addr, &select_reg).unwrap();
        i2c.read(slave_addr, &mut read_buffer).unwrap();
        assert!(
            write_buffer[1] == read_buffer[0],
            "Data should be the same");
        asm::bkpt();
717273747576
loop { cortex_m::asm::wfi(); } } };