aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHybridChild <[email protected]>2025-08-23 10:50:05 +0200
committerHybridChild <[email protected]>2025-08-23 10:50:05 +0200
commit944ac0bf138ab78f602627fae97891024c8fd082 (patch)
tree75e77de53100e1e7abc022d3e2abba0626d4b84a
parent97d5de640a90ce31b81411a742b33d9b86d2b441 (diff)
Run cargo fmt for examples
-rw-r--r--examples/stm32f4/src/bin/i2c_slave_async.rs44
-rw-r--r--examples/stm32f4/src/bin/i2c_slave_blocking.rs41
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
10use defmt_rtt as _;
11use defmt::{error, info}; 10use defmt::{error, info};
11use defmt_rtt as _;
12use embassy_executor::Spawner; 12use embassy_executor::Spawner;
13use embassy_stm32::{bind_interrupts, peripherals}; 13use embassy_stm32::i2c::{self, Address, I2c, SlaveAddrConfig, SlaveCommand, SlaveCommandKind};
14use embassy_stm32::i2c::{self, I2c, SlaveAddrConfig, SlaveCommand, SlaveCommandKind, Address};
15use embassy_stm32::time::Hertz; 14use embassy_stm32::time::Hertz;
15use embassy_stm32::{bind_interrupts, peripherals};
16use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; 16use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex;
17use embassy_sync::mutex::Mutex; 17use embassy_sync::mutex::Mutex;
18use embassy_time::{Duration, Timer}; 18use embassy_time::{Duration, Timer};
@@ -30,38 +30,39 @@ bind_interrupts!(struct Irqs {
30#[embassy_executor::main] 30#[embassy_executor::main]
31async fn main(spawner: Spawner) { 31async 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]
59pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Async, i2c::mode::MultiMaster>) { 57pub 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
9use defmt_rtt as _;
10use defmt::{error, info}; 9use defmt::{error, info};
10use defmt_rtt as _;
11use embassy_executor::Spawner; 11use embassy_executor::Spawner;
12use embassy_stm32::i2c::{self, I2c, SlaveAddrConfig, SlaveCommand, SlaveCommandKind, Address}; 12use embassy_stm32::i2c::{self, Address, I2c, SlaveAddrConfig, SlaveCommand, SlaveCommandKind};
13use embassy_stm32::{bind_interrupts, peripherals};
14use embassy_stm32::time::Hertz; 13use embassy_stm32::time::Hertz;
14use embassy_stm32::{bind_interrupts, peripherals};
15use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; 15use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex;
16use embassy_sync::mutex::Mutex; 16use embassy_sync::mutex::Mutex;
17use embassy_time::{Duration, Timer}; 17use embassy_time::{Duration, Timer};
@@ -29,36 +29,38 @@ bind_interrupts!(struct Irqs {
29#[embassy_executor::main] 29#[embassy_executor::main]
30async fn main(spawner: Spawner) { 30async 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]
56pub async fn i2c_slave_task(mut i2c_slave: I2c<'static, embassy_stm32::mode::Blocking, i2c::mode::MultiMaster>) { 55pub 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;