diff options
| author | Ulf Lilleengen <[email protected]> | 2023-10-12 10:44:27 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-12 10:44:27 +0000 |
| commit | 01eb1a73396002bf0a335f51d31328d21b32bb02 (patch) | |
| tree | 910a705a484f59bd385fc58ecd1038889b8131eb /examples | |
| parent | eb368f77a46682f76dcc4d75f9ba4ce80dfb4193 (diff) | |
| parent | f0d6ee69bcac6a22213c06f303176daf9f5445ff (diff) | |
Merge pull request #2033 from andresovela/stm32-add-timeout-to-i2c
stm32: add timeout to I2C driver
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/stm32f4/src/bin/i2c.rs | 9 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/i2c.rs | 9 | ||||
| -rw-r--r-- | examples/stm32h7/src/bin/i2c.rs | 9 |
3 files changed, 6 insertions, 21 deletions
diff --git a/examples/stm32f4/src/bin/i2c.rs b/examples/stm32f4/src/bin/i2c.rs index a92957325..032bd97ee 100644 --- a/examples/stm32f4/src/bin/i2c.rs +++ b/examples/stm32f4/src/bin/i2c.rs | |||
| @@ -5,10 +5,9 @@ | |||
| 5 | use defmt::*; | 5 | use defmt::*; |
| 6 | use embassy_executor::Spawner; | 6 | use embassy_executor::Spawner; |
| 7 | use embassy_stm32::dma::NoDma; | 7 | use embassy_stm32::dma::NoDma; |
| 8 | use embassy_stm32::i2c::{Error, I2c, TimeoutI2c}; | 8 | use embassy_stm32::i2c::{Error, I2c}; |
| 9 | use embassy_stm32::time::Hertz; | 9 | use embassy_stm32::time::Hertz; |
| 10 | use embassy_stm32::{bind_interrupts, i2c, peripherals}; | 10 | use embassy_stm32::{bind_interrupts, i2c, peripherals}; |
| 11 | use embassy_time::Duration; | ||
| 12 | use {defmt_rtt as _, panic_probe as _}; | 11 | use {defmt_rtt as _, panic_probe as _}; |
| 13 | 12 | ||
| 14 | const ADDRESS: u8 = 0x5F; | 13 | const ADDRESS: u8 = 0x5F; |
| @@ -34,13 +33,9 @@ async fn main(_spawner: Spawner) { | |||
| 34 | Default::default(), | 33 | Default::default(), |
| 35 | ); | 34 | ); |
| 36 | 35 | ||
| 37 | // I2C bus can freeze if SCL line is shorted or due to a broken device that clock stretches for too long. | ||
| 38 | // TimeoutI2c allows recovering from such errors by throwing `Error::Timeout` after a given delay. | ||
| 39 | let mut timeout_i2c = TimeoutI2c::new(&mut i2c, Duration::from_millis(1000)); | ||
| 40 | |||
| 41 | let mut data = [0u8; 1]; | 36 | let mut data = [0u8; 1]; |
| 42 | 37 | ||
| 43 | match timeout_i2c.blocking_write_read(ADDRESS, &[WHOAMI], &mut data) { | 38 | match i2c.blocking_write_read(ADDRESS, &[WHOAMI], &mut data) { |
| 44 | Ok(()) => info!("Whoami: {}", data[0]), | 39 | Ok(()) => info!("Whoami: {}", data[0]), |
| 45 | Err(Error::Timeout) => error!("Operation timed out"), | 40 | Err(Error::Timeout) => error!("Operation timed out"), |
| 46 | Err(e) => error!("I2c Error: {:?}", e), | 41 | Err(e) => error!("I2c Error: {:?}", e), |
diff --git a/examples/stm32h5/src/bin/i2c.rs b/examples/stm32h5/src/bin/i2c.rs index 8b6fe71ae..8b1662f39 100644 --- a/examples/stm32h5/src/bin/i2c.rs +++ b/examples/stm32h5/src/bin/i2c.rs | |||
| @@ -4,10 +4,9 @@ | |||
| 4 | 4 | ||
| 5 | use defmt::*; | 5 | use defmt::*; |
| 6 | use embassy_executor::Spawner; | 6 | use embassy_executor::Spawner; |
| 7 | use embassy_stm32::i2c::{Error, I2c, TimeoutI2c}; | 7 | use embassy_stm32::i2c::{Error, I2c}; |
| 8 | use embassy_stm32::time::Hertz; | 8 | use embassy_stm32::time::Hertz; |
| 9 | use embassy_stm32::{bind_interrupts, i2c, peripherals}; | 9 | use embassy_stm32::{bind_interrupts, i2c, peripherals}; |
| 10 | use embassy_time::Duration; | ||
| 11 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| 12 | 11 | ||
| 13 | const ADDRESS: u8 = 0x5F; | 12 | const ADDRESS: u8 = 0x5F; |
| @@ -33,13 +32,9 @@ async fn main(_spawner: Spawner) { | |||
| 33 | Default::default(), | 32 | Default::default(), |
| 34 | ); | 33 | ); |
| 35 | 34 | ||
| 36 | // I2C bus can freeze if SCL line is shorted or due to a broken device that clock stretches for too long. | ||
| 37 | // TimeoutI2c allows recovering from such errors by throwing `Error::Timeout` after a given delay. | ||
| 38 | let mut timeout_i2c = TimeoutI2c::new(&mut i2c, Duration::from_millis(1000)); | ||
| 39 | |||
| 40 | let mut data = [0u8; 1]; | 35 | let mut data = [0u8; 1]; |
| 41 | 36 | ||
| 42 | match timeout_i2c.blocking_write_read(ADDRESS, &[WHOAMI], &mut data) { | 37 | match i2c.blocking_write_read(ADDRESS, &[WHOAMI], &mut data) { |
| 43 | Ok(()) => info!("Whoami: {}", data[0]), | 38 | Ok(()) => info!("Whoami: {}", data[0]), |
| 44 | Err(Error::Timeout) => error!("Operation timed out"), | 39 | Err(Error::Timeout) => error!("Operation timed out"), |
| 45 | Err(e) => error!("I2c Error: {:?}", e), | 40 | Err(e) => error!("I2c Error: {:?}", e), |
diff --git a/examples/stm32h7/src/bin/i2c.rs b/examples/stm32h7/src/bin/i2c.rs index c2979c59b..9aa0ca08b 100644 --- a/examples/stm32h7/src/bin/i2c.rs +++ b/examples/stm32h7/src/bin/i2c.rs | |||
| @@ -4,10 +4,9 @@ | |||
| 4 | 4 | ||
| 5 | use defmt::*; | 5 | use defmt::*; |
| 6 | use embassy_executor::Spawner; | 6 | use embassy_executor::Spawner; |
| 7 | use embassy_stm32::i2c::{Error, I2c, TimeoutI2c}; | 7 | use embassy_stm32::i2c::{Error, I2c}; |
| 8 | use embassy_stm32::time::Hertz; | 8 | use embassy_stm32::time::Hertz; |
| 9 | use embassy_stm32::{bind_interrupts, i2c, peripherals}; | 9 | use embassy_stm32::{bind_interrupts, i2c, peripherals}; |
| 10 | use embassy_time::Duration; | ||
| 11 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| 12 | 11 | ||
| 13 | const ADDRESS: u8 = 0x5F; | 12 | const ADDRESS: u8 = 0x5F; |
| @@ -33,13 +32,9 @@ async fn main(_spawner: Spawner) { | |||
| 33 | Default::default(), | 32 | Default::default(), |
| 34 | ); | 33 | ); |
| 35 | 34 | ||
| 36 | // I2C bus can freeze if SCL line is shorted or due to a broken device that clock stretches for too long. | ||
| 37 | // TimeoutI2c allows recovering from such errors by throwing `Error::Timeout` after a given delay. | ||
| 38 | let mut timeout_i2c = TimeoutI2c::new(&mut i2c, Duration::from_millis(1000)); | ||
| 39 | |||
| 40 | let mut data = [0u8; 1]; | 35 | let mut data = [0u8; 1]; |
| 41 | 36 | ||
| 42 | match timeout_i2c.blocking_write_read(ADDRESS, &[WHOAMI], &mut data) { | 37 | match i2c.blocking_write_read(ADDRESS, &[WHOAMI], &mut data) { |
| 43 | Ok(()) => info!("Whoami: {}", data[0]), | 38 | Ok(()) => info!("Whoami: {}", data[0]), |
| 44 | Err(Error::Timeout) => error!("Operation timed out"), | 39 | Err(Error::Timeout) => error!("Operation timed out"), |
| 45 | Err(e) => error!("I2c Error: {:?}", e), | 40 | Err(e) => error!("I2c Error: {:?}", e), |
