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 /examples/stm32f4/src/bin/i2c_slave_blocking.rs | |
| parent | 97d5de640a90ce31b81411a742b33d9b86d2b441 (diff) | |
Run cargo fmt for examples
Diffstat (limited to 'examples/stm32f4/src/bin/i2c_slave_blocking.rs')
| -rw-r--r-- | examples/stm32f4/src/bin/i2c_slave_blocking.rs | 41 |
1 files changed, 23 insertions, 18 deletions
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; |
