diff --git a/firmware/memory.x b/firmware/memory.x index 30e765b..aae3d83 100644 --- a/firmware/memory.x +++ b/firmware/memory.x @@ -1,7 +1,7 @@ MEMORY { - RAM : ORIGIN = 0x01002000, LENGTH = 4K - FLASH : ORIGIN = 0x01000000, LENGTH = 8K + RAM : ORIGIN = 0x01004000, LENGTH = 4K + FLASH : ORIGIN = 0x01000000, LENGTH = 12K } REGION_ALIAS("REGION_TEXT", FLASH); diff --git a/firmware/src/i2c.rs b/firmware/src/i2c.rs index 8723560..f50fb59 100644 --- a/firmware/src/i2c.rs +++ b/firmware/src/i2c.rs @@ -44,7 +44,7 @@ impl AmlibI2c{ } fn is_nack(&self) -> bool { - unsafe { read_reg::(self.base_addr + SR) & 0x02 != 0 } + unsafe { read_reg::(self.base_addr + SR) & 0x02 == 0 } } } @@ -105,6 +105,10 @@ impl Read for AmlibI2c { return Err(Error::Busy); } + // Set read ACK to 1. Should probably ideally be done in an init() function + // but it doesn't really matter + write_reg(self.base_addr + CR, 0x30u8); + // START write_reg(self.base_addr + CR, 0x01u8); diff --git a/firmware/src/main.rs b/firmware/src/main.rs index 72cb53c..f59a89b 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -7,6 +7,7 @@ use core::{arch::asm, ptr::{write_volatile, read_volatile}}; use core::fmt::Write; use embedded_hal::prelude::{_embedded_hal_blocking_i2c_Write, _embedded_hal_blocking_i2c_Read}; +use mcp4726::Status; use riscv_rt::entry; mod eth; @@ -36,19 +37,31 @@ fn main() -> ! { //let mut buf = [0u8; 1]; //i2c.read(0b110_0011, &mut buf); + let mut buf = [0u8; 8]; + i2c.read(0x63, &mut buf[0..4]).unwrap(); + writeln!(uart, "DAC Read before config: {:x}, {:x}, {:x}, {:x}", buf[0], buf[1], buf[2], buf[3]).unwrap(); + let mut dac = mcp4726::MCP4726::new(3); - writeln!(uart, "Reading DAC status"); - dac.read_status(&mut i2c).unwrap(); - writeln!(uart, "Configuring DAC"); + writeln!(uart, "Reading DAC status").unwrap(); + match dac.read_status(&mut i2c) { + Ok(status) => writeln!(uart, "Is ready? {}, device powered? {}", status.ready, status.device_powered).unwrap(), + Err(e) => { + writeln!(uart, "Error: {:?}", e).unwrap(); + panic!(); + } + } + writeln!(uart, "Configuring DAC").unwrap(); dac.write_config(&mut i2c, mcp4726::Config { - vref_source: mcp4726::VRef::UnbufferedVRef, + vref_source: mcp4726::VRef::UnbufferedVDD, operation: mcp4726::PowerDown::NormalOperation, use_2x_gain: false, }).unwrap(); - writeln!(uart, "Setting DAC"); + writeln!(uart, "Setting DAC").unwrap(); dac.write_dac(&mut i2c, 0x0800).unwrap(); + i2c.read(0x63, &mut buf[0..4]).unwrap(); + writeln!(uart, "DAC Read after config: {:x}, {:x}, {:x}, {:x}", buf[0], buf[1], buf[2], buf[3]).unwrap(); loop { //eth::tranmsit(); //writeln!(uart, "Hello world!");