#![no_std] #![no_main] use cortex_m_semihosting::hprintln; use cortex_m_semihosting::dbg; use embedded_hal::blocking::i2c; use hal::pwm::Timer; use panic_halt as _; use tm4c_hal::gpio; // you can put a breakpoint on `rust_begin_unwind` to catch panics use cortex_m_rt::entry; use tm4c123x_hal::{self as hal, prelude::*, delay::Delay, i2c::I2c}; #[entry] fn main() -> ! { let p = hal::Peripherals::take().unwrap(); let cp = hal::CorePeripherals::take().unwrap(); let mut sc = p.SYSCTL.constrain(); sc.clock_setup.oscillator = hal::sysctl::Oscillator::Main( hal::sysctl::CrystalFrequency::_16mhz, hal::sysctl::SystemClock::UsePll(hal::sysctl::PllOutputFrequency::_80_00mhz), ); let clocks = sc.clock_setup.freeze(); let mut portb = p.GPIO_PORTB.split(&sc.power_control); let scl = portb.pb2.into_af_push_pull::(&mut portb.control); let sda = portb.pb3.into_af_open_drain::(&mut portb.control); let mut i2c = I2c::i2c0(p.I2C0, (scl, sda), 100_000u32.hz(), &clocks, &sc.power_control); hprintln!("Hello world!"); let mut delay = Delay::new(cp.SYST, &clocks); let mut buffer: [u8; 5] = [0; 5]; let mut count: u8 = 0; const ADDRESS: u8 = 0b1110101; fn write_on(buffer: &mut [u8], address: u8, count: &mut u8) { for data in buffer.iter_mut() { *data = *count; *count = (*count).wrapping_add(1); } buffer[0] = address; } let mut rx_buffer: [u8; 20] = [0; 20]; loop { write_on(&mut buffer, 0, &mut count); if i2c.write(ADDRESS, &mut buffer).is_err() { hprintln!("There was an error during write"); } write_on(&mut buffer, 10, &mut count); if i2c.write(ADDRESS, &mut buffer).is_err() { hprintln!("There was an error during write"); } let res = i2c.write_read(ADDRESS, &[0], &mut rx_buffer); if res.is_ok() { dbg!(rx_buffer); } else { hprintln!("Got an error when trying to read :("); } delay.delay_ms(1000u16); } }