diff options
| author | HybridChild <[email protected]> | 2025-08-23 10:50:05 +0200 |
|---|---|---|
| committer | HybridChild <[email protected]> | 2025-08-23 10:50:05 +0200 |
| commit | 944ac0bf138ab78f602627fae97891024c8fd082 (patch) | |
| tree | 75e77de53100e1e7abc022d3e2abba0626d4b84a | |
| parent | 97d5de640a90ce31b81411a742b33d9b86d2b441 (diff) | |
Run cargo fmt for examples
| -rw-r--r-- | examples/stm32f4/src/bin/i2c_slave_async.rs | 44 | ||||
| -rw-r--r-- | examples/stm32f4/src/bin/i2c_slave_blocking.rs | 41 |
2 files changed, 47 insertions, 38 deletions
diff --git a/examples/stm32f4/src/bin/i2c_slave_async.rs b/examples/stm32f4/src/bin/i2c_slave_async.rs index 072c9875e..c0719af5e 100644 --- a/examples/stm32f4/src/bin/i2c_slave_async.rs +++ b/examples/stm32f4/src/bin/i2c_slave_async.rs | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | //! I2C slave example using async operations with DMA | 1 | //! I2C slave example using async operations with DMA |
| 2 | //! | 2 | //! |
| 3 | //! This example demonstrates DMA-accelerated I2C slave operations, | 3 | //! This example demonstrates DMA-accelerated I2C slave operations, |
| 4 | //! which provide better performance and lower CPU overhead for | 4 | //! which provide better performance and lower CPU overhead for |
| 5 | //! high-frequency I2C transactions. | 5 | //! high-frequency I2C transactions. |
| @@ -7,12 +7,12 @@ | |||
| 7 | #![no_std] | 7 | #![no_std] |
| 8 | #![no_main] | 8 | #![no_main] |
| 9 | 9 | ||
| 10 | use defmt_rtt as _; | ||
| 11 | use defmt::{error, info}; | 10 | use defmt::{error, info}; |
| 11 | use defmt_rtt as _; | ||
| 12 | use embassy_executor::Spawner; | 12 | use embassy_executor::Spawner; |
| 13 | use embassy_stm32::{bind_interrupts, peripherals}; | 13 | use embassy_stm32::i2c::{self, Address, I2c, SlaveAddrConfig, SlaveCommand, SlaveCommandKind}; |
| 14 | use embassy_stm32::i2c::{self, I2c, SlaveAddrConfig, SlaveCommand, SlaveCommandKind, Address}; | ||
| 15 | use embassy_stm32::time::Hertz; | 14 | use embassy_stm32::time::Hertz; |
| 15 | use embassy_stm32::{bind_interrupts, peripherals}; | ||
| 16 | use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; | 16 | use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; |
| 17 | use embassy_sync::mutex::Mutex; | 17 | use embassy_sync::mutex::Mutex; |
| 18 | use embassy_time::{Duration, Timer}; | 18 | use embassy_time::{Duration, Timer}; |
| @@ -30,38 +30,39 @@ bind_interrupts!(struct Irqs { | |||
| 30 | #[embassy_executor::main] | 30 | #[embassy_executor::main] |
| 31 | async fn main(spawner: Spawner) { | 31 | async fn main(spawner: Spawner) { |
| 32 | let p = embassy_stm32::init(Default::default()); | 32 | let p = embassy_stm32::init(Default::default()); |
| 33 | 33 | ||
| 34 | // Configure I2C | 34 | // Configure I2C |
| 35 | let mut i2c_config = i2c::Config::default(); | 35 | let mut i2c_config = i2c::Config::default(); |
| 36 | i2c_config.sda_pullup = false; | 36 | i2c_config.sda_pullup = false; |
| 37 | i2c_config.scl_pullup = false; | 37 | i2c_config.scl_pullup = false; |
| 38 | i2c_config.frequency = Hertz(100_000); // 100kHz I2C speed | 38 | i2c_config.frequency = Hertz(100_000); // 100kHz I2C speed |
| 39 | 39 | ||
| 40 | // Initialize I2C as master first | 40 | // Initialize I2C as master first |
| 41 | let i2c_master = I2c::new( | 41 | let i2c_master = I2c::new( |
| 42 | p.I2C1, | 42 | p.I2C1, p.PB8, // SCL |
| 43 | p.PB8, // SCL | 43 | p.PB9, // SDA |
| 44 | p.PB9, // SDA | 44 | Irqs, p.DMA1_CH6, // TX DMA |
| 45 | Irqs, | ||
| 46 | p.DMA1_CH6, // TX DMA | ||
| 47 | p.DMA1_CH0, // RX DMA | 45 | p.DMA1_CH0, // RX DMA |
| 48 | i2c_config, | 46 | i2c_config, |
| 49 | ); | 47 | ); |
| 50 | 48 | ||
| 51 | // Convert to MultiMaster mode | 49 | // Convert to MultiMaster mode |
| 52 | let slave_config = SlaveAddrConfig::basic(I2C_SLAVE_ADDR); | 50 | let slave_config = SlaveAddrConfig::basic(I2C_SLAVE_ADDR); |
| 53 | let i2c_slave = i2c_master.into_slave_multimaster(slave_config); | 51 | let i2c_slave = i2c_master.into_slave_multimaster(slave_config); |
| 54 | 52 | ||
| 55 | spawner.spawn(i2c_slave_task(i2c_slave)).unwrap(); | 53 | spawner.spawn(i2c_slave_task(i2c_slave)).unwrap(); |
| 56 | } | 54 | } |
| 57 | 55 | ||
| 58 | #[embassy_executor::task] | 56 | #[embassy_executor::task] |
| 59 | pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Async, i2c::mode::MultiMaster>) { | 57 | pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Async, i2c::mode::MultiMaster>) { |
| 60 | info!("Async I2C slave ready at address 0x{:02X}", I2C_SLAVE_ADDR); | 58 | info!("Async I2C slave ready at address 0x{:02X}", I2C_SLAVE_ADDR); |
| 61 | 59 | ||
| 62 | loop { | 60 | loop { |
| 63 | match i2c_slave.listen().await { | 61 | match i2c_slave.listen().await { |
| 64 | Ok(SlaveCommand { kind: SlaveCommandKind::Write, address }) => { | 62 | Ok(SlaveCommand { |
| 63 | kind: SlaveCommandKind::Write, | ||
| 64 | address, | ||
| 65 | }) => { | ||
| 65 | let addr_val = match address { | 66 | let addr_val = match address { |
| 66 | Address::SevenBit(addr) => addr, | 67 | Address::SevenBit(addr) => addr, |
| 67 | Address::TenBit(addr) => (addr & 0xFF) as u8, | 68 | Address::TenBit(addr) => (addr & 0xFF) as u8, |
| @@ -70,7 +71,7 @@ pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Asy | |||
| 70 | info!("I2C: Received write command - Address 0x{:02X}", addr_val); | 71 | info!("I2C: Received write command - Address 0x{:02X}", addr_val); |
| 71 | 72 | ||
| 72 | let mut data_buffer = I2C_BUFFER.lock().await; | 73 | let mut data_buffer = I2C_BUFFER.lock().await; |
| 73 | 74 | ||
| 74 | match i2c_slave.respond_to_write(&mut *data_buffer).await { | 75 | match i2c_slave.respond_to_write(&mut *data_buffer).await { |
| 75 | Ok(_) => { | 76 | Ok(_) => { |
| 76 | info!("I2C: Data received - Buffer now contains: 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}", | 77 | info!("I2C: Data received - Buffer now contains: 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}", |
| @@ -81,8 +82,11 @@ pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Asy | |||
| 81 | } | 82 | } |
| 82 | } | 83 | } |
| 83 | } | 84 | } |
| 84 | 85 | ||
| 85 | Ok(SlaveCommand { kind: SlaveCommandKind::Read, address }) => { | 86 | Ok(SlaveCommand { |
| 87 | kind: SlaveCommandKind::Read, | ||
| 88 | address, | ||
| 89 | }) => { | ||
| 86 | let addr_val = match address { | 90 | let addr_val = match address { |
| 87 | Address::SevenBit(addr) => addr, | 91 | Address::SevenBit(addr) => addr, |
| 88 | Address::TenBit(addr) => (addr & 0xFF) as u8, // Show low byte for 10-bit | 92 | Address::TenBit(addr) => (addr & 0xFF) as u8, // Show low byte for 10-bit |
| @@ -91,7 +95,7 @@ pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Asy | |||
| 91 | info!("I2C: Received read command - Address 0x{:02X}", addr_val); | 95 | info!("I2C: Received read command - Address 0x{:02X}", addr_val); |
| 92 | 96 | ||
| 93 | let data_buffer = I2C_BUFFER.lock().await; | 97 | let data_buffer = I2C_BUFFER.lock().await; |
| 94 | 98 | ||
| 95 | match i2c_slave.respond_to_read(&data_buffer[..BUFFER_SIZE]).await { | 99 | match i2c_slave.respond_to_read(&data_buffer[..BUFFER_SIZE]).await { |
| 96 | Ok(_) => { | 100 | Ok(_) => { |
| 97 | info!("I2C: Responded to read command"); | 101 | info!("I2C: Responded to read command"); |
| @@ -101,7 +105,7 @@ pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Asy | |||
| 101 | } | 105 | } |
| 102 | } | 106 | } |
| 103 | } | 107 | } |
| 104 | 108 | ||
| 105 | Err(e) => { | 109 | Err(e) => { |
| 106 | error!("I2C: Listen error: {}", format_i2c_error(&e)); | 110 | error!("I2C: Listen error: {}", format_i2c_error(&e)); |
| 107 | Timer::after(Duration::from_millis(100)).await; | 111 | Timer::after(Duration::from_millis(100)).await; |
diff --git a/examples/stm32f4/src/bin/i2c_slave_blocking.rs b/examples/stm32f4/src/bin/i2c_slave_blocking.rs index c55f2f6c1..e027cd511 100644 --- a/examples/stm32f4/src/bin/i2c_slave_blocking.rs +++ b/examples/stm32f4/src/bin/i2c_slave_blocking.rs | |||
| @@ -1,17 +1,17 @@ | |||
| 1 | //! Complete I2C slave example using blocking operations | 1 | //! Complete I2C slave example using blocking operations |
| 2 | //! | 2 | //! |
| 3 | //! This example shows how to set up an STM32F4 as an I2C slave device | 3 | //! This example shows how to set up an STM32F4 as an I2C slave device |
| 4 | //! that can handle both read and write transactions from master devices. | 4 | //! that can handle both read and write transactions from master devices. |
| 5 | 5 | ||
| 6 | #![no_std] | 6 | #![no_std] |
| 7 | #![no_main] | 7 | #![no_main] |
| 8 | 8 | ||
| 9 | use defmt_rtt as _; | ||
| 10 | use defmt::{error, info}; | 9 | use defmt::{error, info}; |
| 10 | use defmt_rtt as _; | ||
| 11 | use embassy_executor::Spawner; | 11 | use embassy_executor::Spawner; |
| 12 | use embassy_stm32::i2c::{self, I2c, SlaveAddrConfig, SlaveCommand, SlaveCommandKind, Address}; | 12 | use embassy_stm32::i2c::{self, Address, I2c, SlaveAddrConfig, SlaveCommand, SlaveCommandKind}; |
| 13 | use embassy_stm32::{bind_interrupts, peripherals}; | ||
| 14 | use embassy_stm32::time::Hertz; | 13 | use embassy_stm32::time::Hertz; |
| 14 | use embassy_stm32::{bind_interrupts, peripherals}; | ||
| 15 | use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; | 15 | use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; |
| 16 | use embassy_sync::mutex::Mutex; | 16 | use embassy_sync::mutex::Mutex; |
| 17 | use embassy_time::{Duration, Timer}; | 17 | use embassy_time::{Duration, Timer}; |
| @@ -29,36 +29,38 @@ bind_interrupts!(struct Irqs { | |||
| 29 | #[embassy_executor::main] | 29 | #[embassy_executor::main] |
| 30 | async fn main(spawner: Spawner) { | 30 | async fn main(spawner: Spawner) { |
| 31 | let p = embassy_stm32::init(Default::default()); | 31 | let p = embassy_stm32::init(Default::default()); |
| 32 | 32 | ||
| 33 | // Configure I2C | 33 | // Configure I2C |
| 34 | let mut i2c_config = i2c::Config::default(); | 34 | let mut i2c_config = i2c::Config::default(); |
| 35 | i2c_config.sda_pullup = false; | 35 | i2c_config.sda_pullup = false; |
| 36 | i2c_config.scl_pullup = false; | 36 | i2c_config.scl_pullup = false; |
| 37 | i2c_config.frequency = Hertz(100_000); | 37 | i2c_config.frequency = Hertz(100_000); |
| 38 | i2c_config.timeout = embassy_time::Duration::from_millis(30000); | 38 | i2c_config.timeout = embassy_time::Duration::from_millis(30000); |
| 39 | 39 | ||
| 40 | // Initialize I2C as master first | 40 | // Initialize I2C as master first |
| 41 | let i2c_master = I2c::new_blocking( | 41 | let i2c_master = I2c::new_blocking( |
| 42 | p.I2C1, | 42 | p.I2C1, p.PB8, // SCL |
| 43 | p.PB8, // SCL | 43 | p.PB9, // SDA |
| 44 | p.PB9, // SDA | ||
| 45 | i2c_config, | 44 | i2c_config, |
| 46 | ); | 45 | ); |
| 47 | 46 | ||
| 48 | // Convert to slave+master mode | 47 | // Convert to slave+master mode |
| 49 | let slave_config = SlaveAddrConfig::basic(I2C_SLAVE_ADDR); | 48 | let slave_config = SlaveAddrConfig::basic(I2C_SLAVE_ADDR); |
| 50 | let i2c_slave = i2c_master.into_slave_multimaster(slave_config); | 49 | let i2c_slave = i2c_master.into_slave_multimaster(slave_config); |
| 51 | 50 | ||
| 52 | spawner.spawn(i2c_slave_task(i2c_slave)).unwrap(); | 51 | spawner.spawn(i2c_slave_task(i2c_slave)).unwrap(); |
| 53 | } | 52 | } |
| 54 | 53 | ||
| 55 | #[embassy_executor::task] | 54 | #[embassy_executor::task] |
| 56 | pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Blocking, i2c::mode::MultiMaster>) { | 55 | pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Blocking, i2c::mode::MultiMaster>) { |
| 57 | info!("Blocking I2C slave ready at address 0x{:02X}", I2C_SLAVE_ADDR); | 56 | info!("Blocking I2C slave ready at address 0x{:02X}", I2C_SLAVE_ADDR); |
| 58 | 57 | ||
| 59 | loop { | 58 | loop { |
| 60 | match i2c_slave.blocking_listen() { | 59 | match i2c_slave.blocking_listen() { |
| 61 | Ok(SlaveCommand { kind: SlaveCommandKind::Write, address }) => { | 60 | Ok(SlaveCommand { |
| 61 | kind: SlaveCommandKind::Write, | ||
| 62 | address, | ||
| 63 | }) => { | ||
| 62 | let addr_val = match address { | 64 | let addr_val = match address { |
| 63 | Address::SevenBit(addr) => addr, | 65 | Address::SevenBit(addr) => addr, |
| 64 | Address::TenBit(addr) => (addr & 0xFF) as u8, | 66 | Address::TenBit(addr) => (addr & 0xFF) as u8, |
| @@ -66,7 +68,7 @@ pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Blo | |||
| 66 | 68 | ||
| 67 | info!("I2C: Received write command - Address 0x{:02X}", addr_val); | 69 | info!("I2C: Received write command - Address 0x{:02X}", addr_val); |
| 68 | let mut data_buffer = I2C_BUFFER.lock().await; | 70 | let mut data_buffer = I2C_BUFFER.lock().await; |
| 69 | 71 | ||
| 70 | match i2c_slave.blocking_respond_to_write(&mut *data_buffer) { | 72 | match i2c_slave.blocking_respond_to_write(&mut *data_buffer) { |
| 71 | Ok(bytes_received) => { | 73 | Ok(bytes_received) => { |
| 72 | info!("I2C: Received {} bytes - Buffer now contains: 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}", | 74 | info!("I2C: Received {} bytes - Buffer now contains: 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}, 0x{:02X}", |
| @@ -77,8 +79,11 @@ pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Blo | |||
| 77 | } | 79 | } |
| 78 | } | 80 | } |
| 79 | } | 81 | } |
| 80 | 82 | ||
| 81 | Ok(SlaveCommand { kind: SlaveCommandKind::Read, address }) => { | 83 | Ok(SlaveCommand { |
| 84 | kind: SlaveCommandKind::Read, | ||
| 85 | address, | ||
| 86 | }) => { | ||
| 82 | let addr_val = match address { | 87 | let addr_val = match address { |
| 83 | Address::SevenBit(addr) => addr, | 88 | Address::SevenBit(addr) => addr, |
| 84 | Address::TenBit(addr) => (addr & 0xFF) as u8, // Show low byte for 10-bit | 89 | Address::TenBit(addr) => (addr & 0xFF) as u8, // Show low byte for 10-bit |
| @@ -86,7 +91,7 @@ pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Blo | |||
| 86 | 91 | ||
| 87 | info!("I2C: Received read command - Address 0x{:02X}", addr_val); | 92 | info!("I2C: Received read command - Address 0x{:02X}", addr_val); |
| 88 | let data_buffer = I2C_BUFFER.lock().await; | 93 | let data_buffer = I2C_BUFFER.lock().await; |
| 89 | 94 | ||
| 90 | match i2c_slave.blocking_respond_to_read(&data_buffer[..BUFFER_SIZE]) { | 95 | match i2c_slave.blocking_respond_to_read(&data_buffer[..BUFFER_SIZE]) { |
| 91 | Ok(bytes_sent) => { | 96 | Ok(bytes_sent) => { |
| 92 | info!("I2C: Responded to read - {} bytes sent", bytes_sent); | 97 | info!("I2C: Responded to read - {} bytes sent", bytes_sent); |
| @@ -96,7 +101,7 @@ pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Blo | |||
| 96 | } | 101 | } |
| 97 | } | 102 | } |
| 98 | } | 103 | } |
| 99 | 104 | ||
| 100 | Err(e) => { | 105 | Err(e) => { |
| 101 | error!("I2C: Listen error: {}", format_i2c_error(&e)); | 106 | error!("I2C: Listen error: {}", format_i2c_error(&e)); |
| 102 | Timer::after(Duration::from_millis(100)).await; | 107 | Timer::after(Duration::from_millis(100)).await; |
