Skip to content

Commit 6c6c8c5

Browse files
authored
Merge pull request #415 from stm32-rs/i2c-error
I2c error
2 parents 6ff9c63 + ecc60d0 commit 6c6c8c5

File tree

3 files changed

+31
-27
lines changed

3 files changed

+31
-27
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1313
- `flash`: add one-cycle delay of reading `BSY` bit after setting `STRT` bit to
1414
fix errata.
1515
- `PwmHz::get_period`: fix computation of return value, prevent division by zero
16+
- return `i2c::Error::Timeout` instead of `nb::WouldBlock` when time is out
1617

1718
### Breaking changes
1819

src/i2c.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ use crate::pac::{DWT, I2C1, I2C2, RCC};
1111
use crate::rcc::{BusClock, Clocks, Enable, Reset};
1212
use crate::time::{kHz, Hertz};
1313
use core::ops::Deref;
14-
use nb::Error::{Other, WouldBlock};
15-
use nb::{Error as NbError, Result as NbResult};
1614

1715
pub mod blocking;
1816
pub use blocking::BlockingI2c;
@@ -30,7 +28,7 @@ pub enum Error {
3028
/// Overrun/underrun
3129
Overrun,
3230
// Pec, // SMBUS mode only
33-
// Timeout, // SMBUS mode only
31+
Timeout,
3432
// Alert, // SMBUS mode only
3533
}
3634

src/i2c/blocking.rs

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -118,33 +118,38 @@ macro_rules! wait_for_flag {
118118

119119
if sr1.berr().bit_is_set() {
120120
$i2c.sr1.write(|w| w.berr().clear_bit());
121-
Err(Other(Error::Bus))
121+
Err(Error::Bus.into())
122122
} else if sr1.arlo().bit_is_set() {
123123
$i2c.sr1.write(|w| w.arlo().clear_bit());
124-
Err(Other(Error::Arbitration))
124+
Err(Error::Arbitration.into())
125125
} else if sr1.af().bit_is_set() {
126126
$i2c.sr1.write(|w| w.af().clear_bit());
127-
Err(Other(Error::Acknowledge))
127+
Err(Error::Acknowledge.into())
128128
} else if sr1.ovr().bit_is_set() {
129129
$i2c.sr1.write(|w| w.ovr().clear_bit());
130-
Err(Other(Error::Overrun))
130+
Err(Error::Overrun.into())
131131
} else if sr1.$flag().bit_is_set() {
132132
Ok(())
133133
} else {
134-
Err(WouldBlock)
134+
Err(nb::Error::WouldBlock)
135135
}
136136
}};
137137
}
138138

139139
macro_rules! busy_wait {
140140
($nb_expr:expr, $exit_cond:expr) => {{
141141
loop {
142-
let res = $nb_expr;
143-
if res != Err(WouldBlock) {
144-
break res;
145-
}
146-
if $exit_cond {
147-
break res;
142+
match $nb_expr {
143+
Err(nb::Error::Other(e)) => {
144+
#[allow(unreachable_code)]
145+
break Err(e);
146+
}
147+
Err(nb::Error::WouldBlock) => {
148+
if $exit_cond {
149+
break Err(Error::Timeout);
150+
}
151+
}
152+
Ok(x) => break Ok(x),
148153
}
149154
}
150155
}};
@@ -190,26 +195,26 @@ where
190195
/// Check if START condition is generated. If the condition is not generated, this
191196
/// method returns `WouldBlock` so the program can act accordingly
192197
/// (busy wait, async, ...)
193-
fn wait_after_sent_start(&mut self) -> NbResult<(), Error> {
198+
fn wait_after_sent_start(&mut self) -> nb::Result<(), Error> {
194199
wait_for_flag!(self.nb.i2c, sb)
195200
}
196201

197202
/// Check if STOP condition is generated. If the condition is not generated, this
198203
/// method returns `WouldBlock` so the program can act accordingly
199204
/// (busy wait, async, ...)
200-
fn wait_for_stop(&mut self) -> NbResult<(), Error> {
205+
fn wait_for_stop(&mut self) -> nb::Result<(), Error> {
201206
if self.nb.i2c.cr1.read().stop().is_no_stop() {
202207
Ok(())
203208
} else {
204-
Err(WouldBlock)
209+
Err(nb::Error::WouldBlock)
205210
}
206211
}
207212

208-
fn send_start_and_wait(&mut self) -> NbResult<(), Error> {
213+
fn send_start_and_wait(&mut self) -> Result<(), Error> {
209214
// According to http://www.st.com/content/ccc/resource/technical/document/errata_sheet/f5/50/c9/46/56/db/4a/f6/CD00197763.pdf/files/CD00197763.pdf/jcr:content/translations/en.CD00197763.pdf
210215
// 2.14.4 Wrong behavior of I2C peripheral in master mode after a misplaced STOP
211216
let mut retries_left = self.start_retries;
212-
let mut last_ret: NbResult<(), Error> = Err(WouldBlock);
217+
let mut last_ret = Ok(());
213218
while retries_left > 0 {
214219
self.nb.send_start();
215220
last_ret = busy_wait_cycles!(self.wait_after_sent_start(), self.timeouts.start);
@@ -223,17 +228,17 @@ where
223228
last_ret
224229
}
225230

226-
fn send_addr_and_wait(&mut self, addr: u8, read: bool) -> NbResult<(), Error> {
231+
fn send_addr_and_wait(&mut self, addr: u8, read: bool) -> Result<(), Error> {
227232
self.nb.i2c.sr1.read();
228233
self.nb.send_addr(addr, read);
229234
let ret = busy_wait_cycles!(wait_for_flag!(self.nb.i2c, addr), self.timeouts.addr);
230-
if ret == Err(Other(Error::Acknowledge)) {
235+
if ret == Err(Error::Acknowledge) {
231236
self.nb.send_stop();
232237
}
233238
ret
234239
}
235240

236-
fn write_bytes_and_wait(&mut self, bytes: &[u8]) -> NbResult<(), Error> {
241+
fn write_bytes_and_wait(&mut self, bytes: &[u8]) -> Result<(), Error> {
237242
self.nb.i2c.sr1.read();
238243
self.nb.i2c.sr2.read();
239244

@@ -248,12 +253,12 @@ where
248253
Ok(())
249254
}
250255

251-
fn write_without_stop(&mut self, addr: u8, bytes: &[u8]) -> NbResult<(), Error> {
256+
fn write_without_stop(&mut self, addr: u8, bytes: &[u8]) -> Result<(), Error> {
252257
self.send_start_and_wait()?;
253258
self.send_addr_and_wait(addr, false)?;
254259

255260
let ret = self.write_bytes_and_wait(bytes);
256-
if ret == Err(Other(Error::Acknowledge)) {
261+
if ret == Err(Error::Acknowledge) {
257262
self.nb.send_stop();
258263
}
259264
ret
@@ -264,7 +269,7 @@ impl<I2C, PINS> Write for BlockingI2c<I2C, PINS>
264269
where
265270
I2C: Instance,
266271
{
267-
type Error = NbError<Error>;
272+
type Error = Error;
268273

269274
fn write(&mut self, addr: u8, bytes: &[u8]) -> Result<(), Self::Error> {
270275
self.write_without_stop(addr, bytes)?;
@@ -279,7 +284,7 @@ impl<I2C, PINS> Read for BlockingI2c<I2C, PINS>
279284
where
280285
I2C: Instance,
281286
{
282-
type Error = NbError<Error>;
287+
type Error = Error;
283288

284289
fn read(&mut self, addr: u8, buffer: &mut [u8]) -> Result<(), Self::Error> {
285290
self.send_start_and_wait()?;
@@ -351,7 +356,7 @@ impl<I2C, PINS> WriteRead for BlockingI2c<I2C, PINS>
351356
where
352357
I2C: Instance,
353358
{
354-
type Error = NbError<Error>;
359+
type Error = Error;
355360

356361
fn write_read(&mut self, addr: u8, bytes: &[u8], buffer: &mut [u8]) -> Result<(), Self::Error> {
357362
if !bytes.is_empty() {

0 commit comments

Comments
 (0)