Skip to content

Commit 0eeb7ee

Browse files
committed
i2c: Merge NoAcknowledgeData and NoAcknowledgeAddress into one variant
A source enum was added to indicate if the NACK was from an address or a data byte. Some drivers may not be able to differentiate so they should use `Unknown`.
1 parent 683e41e commit 0eeb7ee

File tree

1 file changed

+32
-6
lines changed

1 file changed

+32
-6
lines changed

src/i2c.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,16 +123,33 @@ pub enum ErrorKind {
123123
Bus,
124124
/// The arbitration was lost, e.g. electrical problems with the clock signal
125125
ArbitrationLoss,
126-
/// The device did not acknowledge its address. The device may be missing.
127-
NoAcknowledgeAddress,
128-
/// The device did not acknowled the data. It may not be ready to process requests at the moment.
129-
NoAcknowledgeData,
126+
/// A bus operation was not acknowledged, e.g. due to the addressed device not
127+
/// being available on the bus or the device not being ready to process requests
128+
/// at the moment
129+
NoAcknowledge(NoAcknowledgeSource),
130130
/// The peripheral receive buffer was overrun
131131
Overrun,
132132
/// A different error occurred. The original error may contain more information.
133133
Other,
134134
}
135135

136+
/// I2C no acknowledge error source
137+
///
138+
/// In cases where it is possible, a device should indicate if a no acknowledge
139+
/// response was received to an address versus a no acknowledge to a data byte.
140+
/// Where it is not possible to differentiate, `Unknown` should be indicated.
141+
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
142+
pub enum NoAcknowledgeSource {
143+
/// The device did not acknowledge its address. The device may be missing.
144+
Address,
145+
/// The device did not acknowledge the data. It may not be ready to process
146+
/// requests at the moment.
147+
Data,
148+
/// Either the device did not acknowledge its address or the data, but it is
149+
/// unknown which.
150+
Unknown,
151+
}
152+
136153
impl Error for ErrorKind {
137154
fn kind(&self) -> ErrorKind {
138155
*self
@@ -144,8 +161,7 @@ impl core::fmt::Display for ErrorKind {
144161
match self {
145162
Self::Bus => write!(f, "Bus error occurred"),
146163
Self::ArbitrationLoss => write!(f, "The arbitration was lost"),
147-
Self::NoAcknowledgeAddress => write!(f, "The device did not acknowledge its address"),
148-
Self::NoAcknowledgeData => write!(f, "The device did not acknowledge the data"),
164+
Self::NoAcknowledge(s) => s.fmt(f),
149165
Self::Overrun => write!(f, "The peripheral receive buffer was overrun"),
150166
Self::Other => write!(
151167
f,
@@ -155,6 +171,16 @@ impl core::fmt::Display for ErrorKind {
155171
}
156172
}
157173

174+
impl core::fmt::Display for NoAcknowledgeSource {
175+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
176+
match self {
177+
Self::Address => write!(f, "The device did not acknowledge its address"),
178+
Self::Data => write!(f, "The device did not acknowledge the data"),
179+
Self::Unknown => write!(f, "The device did not acknowledge its address or the data"),
180+
}
181+
}
182+
}
183+
158184
/// Address mode (7-bit / 10-bit)
159185
///
160186
/// Note: This trait is sealed and should not be implemented outside of this crate.

0 commit comments

Comments
 (0)