1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[repr(u8)]
8pub enum Register {
9 Status = 0x00,
11 AdcCtrl = 0x01,
13 Data = 0x02,
15 IoCtrl1 = 0x03,
17 IoCtrl2 = 0x04,
19 Id = 0x05,
21 Error = 0x06,
23 ErrorEn = 0x07,
25 MclkCount = 0x08,
27 Channel0 = 0x09,
29 Channel1 = 0x0A,
31 Channel2 = 0x0B,
33 Channel3 = 0x0C,
35 Channel4 = 0x0D,
37 Channel5 = 0x0E,
39 Channel6 = 0x0F,
41 Channel7 = 0x10,
43 Config0 = 0x19,
45 Config1 = 0x1A,
47 Config2 = 0x1B,
49 Config3 = 0x1C,
51 Config4 = 0x1D,
53 Config5 = 0x1E,
55 Config6 = 0x1F,
57 Config7 = 0x20,
59 Filter0 = 0x21,
61 Filter1 = 0x22,
63 Filter2 = 0x23,
65 Filter3 = 0x24,
67 Filter4 = 0x25,
69 Filter5 = 0x26,
71 Filter6 = 0x27,
73 Filter7 = 0x28,
75 Offset0 = 0x29,
77 Offset1 = 0x2A,
79 Offset2 = 0x2B,
81 Offset3 = 0x2C,
83 Offset4 = 0x2D,
85 Offset5 = 0x2E,
87 Offset6 = 0x2F,
89 Offset7 = 0x30,
91 Gain0 = 0x31,
93 Gain1 = 0x32,
95 Gain2 = 0x33,
97 Gain3 = 0x34,
99 Gain4 = 0x35,
101 Gain5 = 0x36,
103 Gain6 = 0x37,
105 Gain7 = 0x38,
107}
108
109impl Register {
110 pub fn addr(self) -> u8 {
112 self as u8
113 }
114
115 pub fn is_readonly(self) -> bool {
117 matches!(
118 self,
119 Register::Status
120 | Register::Data
121 | Register::Id
122 | Register::Error
123 | Register::MclkCount
124 )
125 }
126
127 pub fn size(self) -> u8 {
129 match self {
130 Register::Status => 1,
131 Register::AdcCtrl => 2,
132 Register::Data => 3,
133 Register::IoCtrl1 => 3,
134 Register::IoCtrl2 => 2,
135 Register::Id => 1,
136 Register::Error => 3,
137 Register::ErrorEn => 3,
138 Register::MclkCount => 1,
139 Register::Channel0
140 | Register::Channel1
141 | Register::Channel2
142 | Register::Channel3
143 | Register::Channel4
144 | Register::Channel5
145 | Register::Channel6
146 | Register::Channel7 => 2,
147 Register::Config0
148 | Register::Config1
149 | Register::Config2
150 | Register::Config3
151 | Register::Config4
152 | Register::Config5
153 | Register::Config6
154 | Register::Config7 => 2,
155 Register::Filter0
156 | Register::Filter1
157 | Register::Filter2
158 | Register::Filter3
159 | Register::Filter4
160 | Register::Filter5
161 | Register::Filter6
162 | Register::Filter7 => 3,
163 Register::Offset0
164 | Register::Offset1
165 | Register::Offset2
166 | Register::Offset3
167 | Register::Offset4
168 | Register::Offset5
169 | Register::Offset6
170 | Register::Offset7 => 3,
171 Register::Gain0
172 | Register::Gain1
173 | Register::Gain2
174 | Register::Gain3
175 | Register::Gain4
176 | Register::Gain5
177 | Register::Gain6
178 | Register::Gain7 => 3,
179 }
180 }
181}
182
183#[derive(Debug, Clone, Copy, PartialEq, Eq)]
185#[repr(u8)]
186pub enum OperatingMode {
187 Continuous = 0,
189 SingleConv = 1,
191 Standby = 2,
193 PowerDown = 3,
195 Idle = 4,
197 InternalZeroScale = 5,
199 InternalFullScale = 6,
201 SystemZeroScale = 7,
203 SystemFullScale = 8,
205}
206
207#[derive(Debug, Clone, Copy, PartialEq, Eq)]
209#[repr(u8)]
210pub enum PowerMode {
211 LowPower = 0,
213 MidPower = 1,
215 FullPower = 2,
217}
218
219#[derive(Debug, Clone, Copy, PartialEq, Eq)]
221#[repr(u8)]
222pub enum ClockSource {
223 Internal = 0,
225 InternalOutput = 1,
227 External = 2,
229 ExternalDiv4 = 3,
231}
232
233#[derive(Debug, Clone, Copy, PartialEq, Eq)]
235#[repr(u8)]
236pub enum ReferenceSource {
237 External1 = 0,
239 External2 = 1,
241 Internal = 2,
243 Avdd = 3,
245}
246
247#[derive(Debug, Clone, Copy, PartialEq, Eq)]
249#[cfg_attr(feature = "defmt", derive(defmt::Format))]
250#[repr(u8)]
251pub enum PgaGain {
252 Gain1 = 0,
254 Gain2 = 1,
256 Gain4 = 2,
258 Gain8 = 3,
260 Gain16 = 4,
262 Gain32 = 5,
264 Gain64 = 6,
266 Gain128 = 7,
268}
269
270impl PgaGain {
271 pub fn from_bits(bits: u8) -> Result<Self, crate::errors::AD7124CoreError> {
273 match bits & 0x07 {
274 0 => Ok(PgaGain::Gain1),
275 1 => Ok(PgaGain::Gain2),
276 2 => Ok(PgaGain::Gain4),
277 3 => Ok(PgaGain::Gain8),
278 4 => Ok(PgaGain::Gain16),
279 5 => Ok(PgaGain::Gain32),
280 6 => Ok(PgaGain::Gain64),
281 7 => Ok(PgaGain::Gain128),
282 _ => Err(crate::errors::AD7124CoreError::InvalidParameter),
283 }
284 }
285
286 pub fn value(self) -> u32 {
288 match self {
289 PgaGain::Gain1 => 1,
290 PgaGain::Gain2 => 2,
291 PgaGain::Gain4 => 4,
292 PgaGain::Gain8 => 8,
293 PgaGain::Gain16 => 16,
294 PgaGain::Gain32 => 32,
295 PgaGain::Gain64 => 64,
296 PgaGain::Gain128 => 128,
297 }
298 }
299
300 pub fn gain_value(self) -> f32 {
302 self.value() as f32
303 }
304}
305
306#[derive(Debug, Clone, Copy, PartialEq, Eq)]
308#[repr(u8)]
309pub enum BurnoutCurrent {
310 Off = 0,
312 Current0_5uA = 1,
314 Current2uA = 2,
316 Current4uA = 3,
318}
319
320#[derive(Debug, Clone, Copy, PartialEq, Eq)]
322#[repr(u8)]
323pub enum FilterType {
324 Sinc4 = 0,
326 Sinc3 = 5,
328 FastSettle = 4,
330}
331
332#[derive(Debug, Clone, Copy, PartialEq, Eq)]
334#[cfg_attr(feature = "defmt", derive(defmt::Format))]
335#[repr(u8)]
336pub enum ChannelInput {
337 Ain0 = 0,
339 Ain1 = 1,
341 Ain2 = 2,
343 Ain3 = 3,
345 Ain4 = 4,
347 Ain5 = 5,
349 Ain6 = 6,
351 Ain7 = 7,
353 Ain8 = 8,
355 Ain9 = 9,
357 Ain10 = 10,
359 Ain11 = 11,
361 Ain12 = 12,
363 Ain13 = 13,
365 Ain14 = 14,
367 Ain15 = 15,
369 TempSensor = 16,
371 IntRef = 17,
373 Dgnd = 18,
375 AvddAvssDiv5 = 19,
377}
378
379#[derive(Debug, Clone, Copy, PartialEq, Eq)]
381#[cfg_attr(feature = "defmt", derive(defmt::Format))]
382pub struct DeviceStatus {
383 pub raw: u8,
385}
386
387impl DeviceStatus {
388 pub fn new(raw: u8) -> Self {
390 Self { raw }
391 }
392
393 pub fn rdy(&self) -> bool {
395 (self.raw & 0x80) == 0
396 }
397
398 pub fn error(&self) -> bool {
400 (self.raw & 0x40) != 0
401 }
402
403 pub fn por_flag(&self) -> bool {
405 (self.raw & 0x10) != 0
406 }
407
408 pub fn channel(&self) -> u8 {
410 self.raw & 0x0F
411 }
412
413 pub fn active_channel(&self) -> Option<u8> {
415 let ch = self.channel();
416 if ch < 16 {
417 Some(ch)
418 } else {
419 None
420 }
421 }
422
423 pub fn is_ready(&self) -> bool {
425 self.rdy()
426 }
427
428 pub fn has_error(&self) -> bool {
430 self.error()
431 }
432
433 pub fn is_channel_ready(&self, channel: u8) -> bool {
435 self.is_ready() && self.channel() == channel
436 }
437}
438
439impl core::fmt::Display for DeviceStatus {
440 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
441 write!(f, "Status(0x{:02X})", self.raw)?;
442 if self.rdy() {
443 write!(f, " RDY")?;
444 }
445 if self.error() {
446 write!(f, " ERROR")?;
447 }
448 if self.por_flag() {
449 write!(f, " POR")?;
450 }
451 write!(f, " CH{}", self.channel())?;
452 Ok(())
453 }
454}
455
456pub mod bit_fields {
458 pub fn extract_bits(value: u32, offset: u8, width: u8) -> u32 {
460 let mask = (1u32 << width) - 1;
461 (value >> offset) & mask
462 }
463
464 pub fn insert_bits(value: u32, field: u32, offset: u8, width: u8) -> u32 {
466 let mask = (1u32 << width) - 1;
467 (value & !(mask << offset)) | ((field & mask) << offset)
468 }
469
470 pub fn set_bit(value: u32, bit: u8) -> u32 {
472 value | (1 << bit)
473 }
474
475 pub fn clear_bit(value: u32, bit: u8) -> u32 {
477 value & !(1 << bit)
478 }
479
480 pub fn is_bit_set(value: u32, bit: u8) -> bool {
482 (value & (1 << bit)) != 0
483 }
484}