Embassy-rp I2C: Fix 1664

Change embassy-rp i2c.rs impl of embedded_hal_async::i2c::I2c::transaction
to only do the call to setup() for address once per call to transactions.
Calling setup multiple times results in I2C transactions being skipped
on the bus, even across calls to transaction() or devices.
This commit is contained in:
Alex Ferro 2023-07-16 19:59:35 -06:00
parent 6b5df4523a
commit e4ad1aa542

View File

@ -716,6 +716,9 @@ mod nightly {
async fn transaction(&mut self, address: A, operations: &mut [Operation<'_>]) -> Result<(), Self::Error> { async fn transaction(&mut self, address: A, operations: &mut [Operation<'_>]) -> Result<(), Self::Error> {
let addr: u16 = address.into(); let addr: u16 = address.into();
if operations.len() > 0 {
Self::setup(addr)?;
}
let mut iterator = operations.iter_mut(); let mut iterator = operations.iter_mut();
while let Some(op) = iterator.next() { while let Some(op) = iterator.next() {
@ -723,11 +726,9 @@ mod nightly {
match op { match op {
Operation::Read(buffer) => { Operation::Read(buffer) => {
Self::setup(addr)?;
self.read_async_internal(buffer, false, last).await?; self.read_async_internal(buffer, false, last).await?;
} }
Operation::Write(buffer) => { Operation::Write(buffer) => {
Self::setup(addr)?;
self.write_async_internal(buffer.into_iter().cloned(), last).await?; self.write_async_internal(buffer.into_iter().cloned(), last).await?;
} }
} }