From 8ef4129c7d51edd813fb2bb3f9723af4bfe1c1f6 Mon Sep 17 00:00:00 2001 From: Christian Balcom Date: Mon, 17 Nov 2025 01:03:12 -0500 Subject: [PATCH 1/3] Fixed issue with rp i2c slave respond_to_read --- embassy-rp/src/i2c_slave.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/embassy-rp/src/i2c_slave.rs b/embassy-rp/src/i2c_slave.rs index 0853709df3..1e6c32f341 100644 --- a/embassy-rp/src/i2c_slave.rs +++ b/embassy-rp/src/i2c_slave.rs @@ -301,7 +301,7 @@ impl<'d, T: Instance> I2cSlave<'d, T> { return Err(Error::InvalidResponseBufferLength); } - let mut chunks = buffer.chunks(FIFO_SIZE as usize); + let mut bytes_written = 0; self.wait_on( |me| { @@ -319,10 +319,11 @@ impl<'d, T: Instance> I2cSlave<'d, T> { } } - if let Some(chunk) = chunks.next() { - for byte in chunk { + if bytes_written < buffer.len() { + for _ in 0..((FIFO_SIZE - p.ic_txflr().read().txflr()) as usize).min(buffer.len() - bytes_written) { p.ic_clr_rd_req().read(); - p.ic_data_cmd().write(|w| w.set_dat(*byte)); + p.ic_data_cmd().write(|w| w.set_dat(buffer[bytes_written])); + bytes_written += 1; } Poll::Pending From b7077f9200285cb81b9c7381bf1b19e65b209fd1 Mon Sep 17 00:00:00 2001 From: Christian Balcom Date: Mon, 17 Nov 2025 01:12:52 -0500 Subject: [PATCH 2/3] Rustfmt and changelog bump. --- embassy-rp/CHANGELOG.md | 1 + embassy-rp/src/i2c_slave.rs | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/embassy-rp/CHANGELOG.md b/embassy-rp/CHANGELOG.md index 4b0d738a76..8aa7833d5c 100644 --- a/embassy-rp/CHANGELOG.md +++ b/embassy-rp/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add reset_to_usb_boot for rp235x ([#4705](https://github.com/embassy-rs/embassy/pull/4705)) - Add fix #4822 in PIO onewire. Change to disable the state machine before setting y register ([#4824](https://github.com/embassy-rs/embassy/pull/4824)) - Add PIO::Ws2812 color order support +- Fix i2c_slave respond_to_read for buffers larger than one chunk ## 0.8.0 - 2025-08-26 diff --git a/embassy-rp/src/i2c_slave.rs b/embassy-rp/src/i2c_slave.rs index 1e6c32f341..24e19d17ce 100644 --- a/embassy-rp/src/i2c_slave.rs +++ b/embassy-rp/src/i2c_slave.rs @@ -5,7 +5,9 @@ use core::task::Poll; use pac::i2c; -use crate::i2c::{AbortReason, FIFO_SIZE, Instance, InterruptHandler, SclPin, SdaPin, set_up_i2c_pin}; +use crate::i2c::{ + AbortReason, FIFO_SIZE, Instance, InterruptHandler, SclPin, SdaPin, set_up_i2c_pin, +}; use crate::interrupt::typelevel::{Binding, Interrupt}; use crate::{Peri, pac}; @@ -320,7 +322,9 @@ impl<'d, T: Instance> I2cSlave<'d, T> { } if bytes_written < buffer.len() { - for _ in 0..((FIFO_SIZE - p.ic_txflr().read().txflr()) as usize).min(buffer.len() - bytes_written) { + for _ in 0..((FIFO_SIZE - p.ic_txflr().read().txflr()) as usize) + .min(buffer.len() - bytes_written) + { p.ic_clr_rd_req().read(); p.ic_data_cmd().write(|w| w.set_dat(buffer[bytes_written])); bytes_written += 1; From f61f243caf55681d48273f0084dc89bec63bd8dd Mon Sep 17 00:00:00 2001 From: Christian Balcom Date: Mon, 17 Nov 2025 01:16:06 -0500 Subject: [PATCH 3/3] Rustfmt --- embassy-rp/src/i2c_slave.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/embassy-rp/src/i2c_slave.rs b/embassy-rp/src/i2c_slave.rs index 24e19d17ce..9e31944c1b 100644 --- a/embassy-rp/src/i2c_slave.rs +++ b/embassy-rp/src/i2c_slave.rs @@ -5,9 +5,7 @@ use core::task::Poll; use pac::i2c; -use crate::i2c::{ - AbortReason, FIFO_SIZE, Instance, InterruptHandler, SclPin, SdaPin, set_up_i2c_pin, -}; +use crate::i2c::{AbortReason, FIFO_SIZE, Instance, InterruptHandler, SclPin, SdaPin, set_up_i2c_pin}; use crate::interrupt::typelevel::{Binding, Interrupt}; use crate::{Peri, pac}; @@ -322,9 +320,7 @@ impl<'d, T: Instance> I2cSlave<'d, T> { } if bytes_written < buffer.len() { - for _ in 0..((FIFO_SIZE - p.ic_txflr().read().txflr()) as usize) - .min(buffer.len() - bytes_written) - { + for _ in 0..((FIFO_SIZE - p.ic_txflr().read().txflr()) as usize).min(buffer.len() - bytes_written) { p.ic_clr_rd_req().read(); p.ic_data_cmd().write(|w| w.set_dat(buffer[bytes_written])); bytes_written += 1;