Skip to content
30 changes: 18 additions & 12 deletions examples/rt685s-evk/src/bin/i2c-loopback-async-10bit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
use defmt::info;
use embassy_executor::Spawner;
use embassy_imxrt::i2c::master::I2cMaster;
use embassy_imxrt::i2c::slave::{Address, Command, I2cSlave, Response};
use embassy_imxrt::i2c::slave::{Address, AsyncI2cSlave, ReadResult, Transaction, WriteResult};
use embassy_imxrt::i2c::{self, Async};
use embassy_imxrt::{bind_interrupts, peripherals};
use embedded_hal_async::i2c::I2c;
Expand Down Expand Up @@ -32,7 +32,7 @@ fn generate_buffer<const SIZE: usize>() -> [u8; SIZE] {
}

#[embassy_executor::task]
async fn slave_service(mut slave: I2cSlave<'static, Async>) {
async fn slave_service(mut slave: AsyncI2cSlave<'static>) {
loop {
// Buffer containing data read by the master
let t_buf: [u8; SLAVE_BUFLEN] = generate_buffer();
Expand All @@ -43,26 +43,29 @@ async fn slave_service(mut slave: I2cSlave<'static, Async>) {
let expected_buf: [u8; SLAVE_BUFLEN] = generate_buffer();

match slave.listen().await.unwrap() {
Command::Probe => {
Transaction::Deselect => {
info!("Probe, nothing to do");
}
Command::Read => {
Transaction::Read { mut handler, .. } => {
info!("Read");
loop {
match slave.respond_to_read(&t_buf).await.unwrap() {
Response::Complete(n) => {
match handler.handle_part(&t_buf).await.unwrap() {
ReadResult::Complete(n) => {
info!("Response complete read with {} bytes", n);
break;
}
Response::Pending(n) => info!("Response to read got {} bytes, more bytes to fill", n),
ReadResult::Partial(next_handler) => {
handler = next_handler;
info!("Response to read got {} bytes, more bytes to fill", t_buf.len())
}
}
}
}
Command::Write => {
Transaction::Write { mut handler, .. } => {
info!("Write");
loop {
match slave.respond_to_write(&mut r_buf).await.unwrap() {
Response::Complete(n) => {
match handler.handle_part(&mut r_buf).await.unwrap() {
WriteResult::Complete(n) => {
info!("Response complete write with {} bytes", n);
info!("i2cm write data: {:x}", r_buf[0..n]);

Expand All @@ -71,7 +74,10 @@ async fn slave_service(mut slave: I2cSlave<'static, Async>) {
assert!(r_buf[0..n] == expected_buf[0..n]);
break;
}
Response::Pending(n) => info!("Response to write got {} bytes, more bytes pending", n),
WriteResult::Partial(next_handler) => {
handler = next_handler;
info!("Response to write got {} bytes, more bytes pending", r_buf.len())
}
}
}
}
Expand Down Expand Up @@ -135,7 +141,7 @@ async fn main(spawner: Spawner) {
info!("i2c loopback example");
let p = embassy_imxrt::init(Default::default());

let slave = I2cSlave::new_async(p.FLEXCOMM2, p.PIO0_18, p.PIO0_17, Irqs, SLAVE_ADDR.unwrap(), p.DMA0_CH4).unwrap();
let slave = AsyncI2cSlave::new(p.FLEXCOMM2, p.PIO0_18, p.PIO0_17, Irqs, SLAVE_ADDR.unwrap(), p.DMA0_CH4).unwrap();

let master = I2cMaster::new_async(p.FLEXCOMM4, p.PIO0_29, p.PIO0_30, Irqs, Default::default(), p.DMA0_CH9).unwrap();

Expand Down
Loading