forked from M-Labs/zynq-rs
eeprom: check I2C (n)ack on read/write
This commit is contained in:
parent
b2b3e5c933
commit
9f4503a94c
|
@ -51,11 +51,17 @@ impl<'a> EEPROM<'a> {
|
||||||
self.select()?;
|
self.select()?;
|
||||||
|
|
||||||
self.i2c.start()?;
|
self.i2c.start()?;
|
||||||
self.i2c.write(self.address << 1)?;
|
if !self.i2c.write(self.address << 1)? {
|
||||||
self.i2c.write(addr)?;
|
return Err("eeprom failed to ack control byte (write)");
|
||||||
|
}
|
||||||
|
if !self.i2c.write(addr)? {
|
||||||
|
return Err("eeprom failed to ack read address");
|
||||||
|
}
|
||||||
|
|
||||||
self.i2c.restart()?;
|
self.i2c.restart()?;
|
||||||
self.i2c.write((self.address << 1) | 1)?;
|
if !self.i2c.write((self.address << 1) | 1)? {
|
||||||
|
return Err("eeprom failed to ack control byte (read)");
|
||||||
|
}
|
||||||
let buf_len = buf.len();
|
let buf_len = buf.len();
|
||||||
for (i, byte) in buf.iter_mut().enumerate() {
|
for (i, byte) in buf.iter_mut().enumerate() {
|
||||||
*byte = self.i2c.read(i < buf_len - 1)?;
|
*byte = self.i2c.read(i < buf_len - 1)?;
|
||||||
|
@ -80,10 +86,16 @@ impl<'a> EEPROM<'a> {
|
||||||
for (i, byte) in buf.iter().enumerate() {
|
for (i, byte) in buf.iter().enumerate() {
|
||||||
if (i == 0) || (pb == 0) {
|
if (i == 0) || (pb == 0) {
|
||||||
self.i2c.start()?;
|
self.i2c.start()?;
|
||||||
self.i2c.write(self.address << 1)?;
|
if !self.i2c.write(self.address << 1)? {
|
||||||
self.i2c.write(addr + (i as u8))?;
|
return Err("eeprom failed to ack control byte (write)");
|
||||||
|
}
|
||||||
|
if !self.i2c.write(addr + (i as u8))? {
|
||||||
|
return Err("eeprom failed to ack write address");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !self.i2c.write(*byte)? {
|
||||||
|
return Err("eeprom failed to ack written value");
|
||||||
}
|
}
|
||||||
self.i2c.write(*byte)?;
|
|
||||||
pb += 1;
|
pb += 1;
|
||||||
|
|
||||||
if (i == buf_len-1) || (pb == self.page_size) {
|
if (i == buf_len-1) || (pb == self.page_size) {
|
||||||
|
|
Loading…
Reference in New Issue