AFE_NXP_Arduino 2.0.3
Analog Front-End (AFE) device operation sample code for Arduino
Loading...
Searching...
No Matches
AFE_NXP.h
Go to the documentation of this file.
1
9#ifndef ARDUINO_AFE_DRIVER_H
10#define ARDUINO_AFE_DRIVER_H
11
12#include <Arduino.h>
13#include <math.h>
14#include <stdint.h>
15#include <SPI_for_AFE.h>
16
17class AFE_base : public SPI_for_AFE
18{
19public:
20
22 using raw_t = int32_t;
23 using volt_t = double;
24
26 AFE_base( bool spi_addr, bool highspeed_variant, int nINT, int DRDY, int SYN, int nRESET, int DRDY_input, int SYNCDAC );
27
29 virtual ~AFE_base();
30
37 virtual void begin( void );
38
40 virtual void boot( void ) = 0;
41
43 virtual void reset( bool hardware_reset = false ) = 0;
44
46 typedef void (*callback_fp_t)( void );
47 virtual void set_DRDY_callback( callback_fp_t fnc );
48
60
66 virtual void open_logical_channel( int ch, const uint16_t (&cc)[ 4 ] ) = 0;
67
72 virtual void close_logical_channel( int ch ) = 0;
73
76 virtual void close_logical_channel( void ) = 0;
77
82 virtual void enable_logical_channel( int ch ) = 0;
83
88 virtual void start( int ch ) = 0;
89
92 virtual void start( void ) = 0;
93
96 virtual void start_continuous_conversion( void ) = 0;
97
102 virtual void DRDY_by_sequencer_done( bool flag = true ) = 0;
103
108 virtual raw_t read( int ch ) = 0;
109
114 virtual void read( raw_t *data_ptr ) = 0;
115
120 virtual void read( volt_t *data_ptr ) = 0;
121
126 virtual raw_t start_and_read( int ch );
127
128#ifdef NON_TEMPLATE_VERSION_FOR_START_AND_READ
129
134 virtual void start_and_read( raw_t *data_ptr );
135
136#else
137 template<typename T>
138 inline void start_and_read( T data )
139 {
140 double wait_time = cbf_DRDY ? -1.0 : total_delay * delay_accuracy;
141
142 start();
144
145 read( data );
146 };
147#endif
148
158
164 inline double raw2uv( int ch, raw_t value )
165 {
166 return raw2v( ch, value ) * 1e6;
167 }
168
174 inline double raw2mv( int ch, raw_t value )
175 {
176 return raw2v( ch, value ) * 1e3;
177 }
178
184 virtual double raw2v( int ch, raw_t value ) = 0;
185
190 inline double drdy_delay( int ch )
191 {
192 return ch_delay[ ch ];
193 }
194
197 inline double drdy_delay( void )
198 {
199 return total_delay;
200 }
201
203 inline int enabled_logical_channels( void )
204 {
205 return enabled_channels;
206 }
207
212 void use_DRDY_trigger( bool use = true );
213
214protected:
223
224
225 int bit_count( uint32_t value );
226
229
232
234 double coeff_V[ 16 ];
235
237 int mux_setting[ 16 ];
238
240 double ch_delay[ 16 ];
242 static double delay_accuracy;
243
244 constexpr static uint32_t timeout_limit = 10000000;
245
246 void default_drdy_cb();
247 static void static_default_drdy_cb();
249 volatile bool drdy_flag;
251 static void DRDY_cb();
252
253 virtual void init( void );
254
255 int wait_conversion_complete( double delay = -1.0 );
256
257public:
259};
260
262{
263public:
266
267 void enable( void );
268 void disable( void );
269
270 template<class T> T read(void);
271
272 operator AFE_base::raw_t(void);
273 operator AFE_base::volt_t(void);
274
275 template<class T> double operator+( T v ) { return (double)(*this) + (double)v; }
276 template<class T> double operator-( T v ) { return (double)(*this) - (double)v; }
277 template<class T> double operator*( T v ) { return (double)(*this) * (double)v; }
278 template<class T> double operator/( T v ) { return (double)(*this) / (double)v; }
279 template<class T> friend double operator+( T v, LogicalChannel_Base lc ) { return (double)v + (double)lc; }
280 template<class T> friend double operator-( T v, LogicalChannel_Base lc ) { return (double)v - (double)lc; }
281 template<class T> friend double operator*( T v, LogicalChannel_Base lc ) { return (double)v * (double)lc; }
282 template<class T> friend double operator/( T v, LogicalChannel_Base lc ) { return (double)v / (double)lc; }
283
286};
287
289{
290public:
291 using ch_setting_t = uint16_t[ 4 ];
292
297
304
306 NAFE13388_Base( bool spi_addr, bool highspeed_variant, int nINT, int DRDY, int SYN, int nRESET, int DRDY_input, int SYNCDAC );
307
309 virtual ~NAFE13388_Base();
310
312 virtual void boot( void );
313
315 virtual void reset( bool hardware_reset = false );
316
326
332 virtual void open_logical_channel( int ch, const uint16_t (&cc)[ 4 ] );
333
335 {
336 public:
338 virtual ~LogicalChannel();
339
340 void configure( const uint16_t (&cc)[ 4 ] );
341 void configure( uint16_t cc0 = 0x0000, uint16_t cc1 = 0x0000, uint16_t cc2 = 0x0000, uint16_t cc3 = 0x0000 );
342 };
343
345
346 private:
347 double calc_delay( int ch );
349
350public:
355 virtual void close_logical_channel( int ch );
356
359 virtual void close_logical_channel( void );
360
365 void enable_logical_channel( int ch );
366
371 virtual void start( int ch );
372
375 virtual void start( void );
376
379 virtual void start_continuous_conversion();
380
385 virtual void DRDY_by_sequencer_done( bool flag = true );
386
391 virtual raw_t read( int ch );
392
397 virtual void read( raw_t *data );
398
403 virtual void read( volt_t *data );
404
410 inline double raw2v( int ch, raw_t value )
411 {
412 double v = value * coeff_V[ ch ];
413
414 if ( HV_MUX != mux_setting[ ch ] )
415 {
416 switch ( mux_setting[ ch ] )
417 {
418 case REF2_REF2:
419 case GPIO0_GPIO1:
420 return v;
421 break;
422 case REFCOARSE_REF2:
423 case VADD_REF2:
424 return 2.00 * (v + 1.50);
425 break;
426 case VHDD_REF2:
427 return 32.00 * (v + 0.25);
428 break;
429 case REF2_VHSS:
430 return -32.00 * (v - 0.25);
431 break;
432 }
433 }
434 return v;
435 }
436
437
438// constexpr static double pga_gain[] = { 0.2, 0.4, 0.8, 1, 2, 4, 8, 16 };
439 static double pga_gain[];
440
451
452 enum class Register16 : uint16_t {
453 CH_CONFIG0 = 0x20,
454 CH_CONFIG1 = 0x21,
455 CH_CONFIG2 = 0x22,
456 CH_CONFIG3 = 0x23,
457 CH_CONFIG4 = 0x24,
458 CRC_CONF_REGS = 0x25,
459 CRC_COEF_REGS = 0x26,
460 CRC_TRIM_REGS = 0x27,
461 GPI_DATA = 0x29,
462 GPIO_CONFIG0 = 0x2A,
463 GPIO_CONFIG1 = 0x2B,
464 GPIO_CONFIG2 = 0x2C,
465 GPI_EDGE_POS = 0x2D,
466 GPI_EDGE_NEG = 0x2E,
467 GPO_DATA = 0x2F,
468 SYS_CONFIG0 = 0x30,
469 SYS_STATUS0 = 0x31,
470 GLOBAL_ALARM_ENABLE = 0x32,
472 DIE_TEMP = 0x34,
473 CH_STATUS0 = 0x35,
474 CH_STATUS1 = 0x36,
475 THRS_TEMP = 0x37,
476 PN2 = 0x7C,
477 PN1 = 0x7D,
478 PN0 = 0x7E,
479 CRC_TRIM_INT = 0x7F,
480 };
481
482 enum class Register24 : uint16_t {
483 CH_DATA0 = 0x40,
484 CH_DATA1 = 0x41,
485 CH_DATA2 = 0x42,
486 CH_DATA3 = 0x43,
487 CH_DATA4 = 0x44,
488 CH_DATA5 = 0x45,
489 CH_DATA6 = 0x46,
490 CH_DATA7 = 0x47,
491 CH_DATA8 = 0x48,
492 CH_DATA9 = 0x4A,
493 CH_DATA10 = 0x4B,
494 CH_DATA11 = 0x4C,
495 CH_DATA13 = 0x4D,
496 CH_DATA14 = 0x4E,
497 CH_DATA15 = 0x4F,
498 CH_CONFIG5_0 = 0x50,
499 CH_CONFIG5_1 = 0x51,
500 CH_CONFIG5_2 = 0x52,
501 CH_CONFIG5_3 = 0x53,
502 CH_CONFIG5_4 = 0x54,
503 CH_CONFIG5_5 = 0x55,
504 CH_CONFIG5_6 = 0x56,
505 CH_CONFIG5_7 = 0x57,
506 CH_CONFIG5_8 = 0x58,
507 CH_CONFIG5_9 = 0x59,
508 CH_CONFIG5_10 = 0x5A,
509 CH_CONFIG5_11 = 0x5B,
510 CH_CONFIG5_12 = 0x5C,
511 CH_CONFIG5_13 = 0x5D,
512 CH_CONFIG5_14 = 0x5E,
513 CH_CONFIG5_15 = 0x5F,
514 CH_CONFIG6_0 = 0x60,
515 CH_CONFIG6_1 = 0x61,
516 CH_CONFIG6_2 = 0x62,
517 CH_CONFIG6_3 = 0x63,
518 CH_CONFIG6_4 = 0x64,
519 CH_CONFIG6_5 = 0x65,
520 CH_CONFIG6_6 = 0x66,
521 CH_CONFIG6_7 = 0x67,
522 CH_CONFIG6_8 = 0x68,
523 CH_CONFIG6_9 = 0x69,
524 CH_CONFIG6_10 = 0x6A,
525 CH_CONFIG6_11 = 0x6B,
526 CH_CONFIG6_12 = 0x6C,
527 CH_CONFIG6_13 = 0x6D,
528 CH_CONFIG6_14 = 0x6E,
529 CH_CONFIG6_15 = 0x6F,
530 GAIN_COEFF0 = 0x80,
531 GAIN_COEFF1 = 0x81,
532 GAIN_COEFF2 = 0x82,
533 GAIN_COEFF3 = 0x83,
534 GAIN_COEFF4 = 0x84,
535 GAIN_COEFF5 = 0x85,
536 GAIN_COEFF6 = 0x86,
537 GAIN_COEFF7 = 0x87,
538 GAIN_COEFF8 = 0x88,
539 GAIN_COEFF9 = 0x89,
540 GAIN_COEFF10 = 0x8A,
541 GAIN_COEFF11 = 0x8B,
542 GAIN_COEFF12 = 0x8C,
543 GAIN_COEFF13 = 0x8D,
544 GAIN_COEFF14 = 0x8E,
545 GAIN_COEFF15 = 0x8F,
546 OFFSET_COEFF0 = 0x90,
547 OFFSET_COEFF1 = 0x91,
548 OFFSET_COEFF2 = 0x92,
549 OFFSET_COEFF3 = 0x93,
550 OFFSET_COEFF4 = 0x94,
551 OFFSET_COEFF5 = 0x95,
552 OFFSET_COEFF6 = 0x96,
553 OFFSET_COEFF7 = 0x97,
554 OFFSET_COEFF8 = 0x98,
555 OFFSET_COEFF9 = 0x99,
556 OFFSET_COEFF10 = 0x9A,
557 OFFSET_COEFF11 = 0x9B,
558 OFFSET_COEFF12 = 0x9C,
559 OFFSET_COEFF13 = 0x9D,
560 OFFSET_COEFF14 = 0x9E,
561 OFFSET_COEFF15 = 0x9F,
562 OPT_COEF0 = 0xA0,
563 OPT_COEF1 = 0xA1,
564 OPT_COEF2 = 0xA2,
565 OPT_COEF3 = 0xA3,
566 OPT_COEF4 = 0xA4,
567 OPT_COEF5 = 0xA5,
568 OPT_COEF6 = 0xA6,
569 OPT_COEF7 = 0xA7,
570 OPT_COEF8 = 0xA8,
571 OPT_COEF9 = 0xA9,
572 OPT_COEF10 = 0xAA,
573 OPT_COEF11 = 0xAB,
574 OPT_COEF12 = 0xAC,
575 OPT_COEF13 = 0xAD,
576 SERIAL1 = 0xAE,
577 SERIAL0 = 0xAF,
578 };
579
581 CMD_CH0 = 0x0000,
582 CMD_CH1 = 0x0001,
583 CMD_CH2 = 0x0002,
584 CMD_CH3 = 0x0003,
585 CMD_CH4 = 0x0004,
586 CMD_CH5 = 0x0005,
587 CMD_CH6 = 0x0006,
588 CMD_CH7 = 0x0007,
589 CMD_CH8 = 0x0008,
590 CMD_CH9 = 0x0009,
591 CMD_CH10 = 0x000A,
592 CMD_CH11 = 0x000B,
593 CMD_CH12 = 0x000C,
594 CMD_CH13 = 0x000D,
595 CMD_CH14 = 0x000E,
596 CMD_CH15 = 0x000F,
597 CMD_ABORT = 0x0010,
598 CMD_END = 0x0011,
601 CMD_RESET = 0x0014,
603 CMD_RELOAD = 0x0016,
604 TBD = 0x0017,
605 CMD_SS = 0x2000,
606 CMD_SC = 0x2001,
607 CMD_MM = 0x2002,
608 CMD_MC = 0x2003,
609 CMD_MS = 0x2004,
614 };
615
620 virtual void command( uint16_t com );
621
627 virtual void reg( Register16 r, uint16_t value );
628
634 virtual void reg( Register24 r, uint32_t value );
635
642 virtual uint16_t reg( Register16 r );
643
650 virtual uint32_t reg( Register24 r );
651
659 template<typename T>
661 {
662 uint32_t v = reg( rg );
663
664 v &= mask;
665 v |= value & ~mask;
666
667 reg( rg, v );
668
669 return v;
671
676 uint32_t part_number( void );
677
682 uint8_t revision_number( void );
683
688 uint64_t serial_number( void );
689
694 float temperature( void );
695
701 void gain_offset_coeff( const ref_points &ref );
702
703 enum CalibrationError : int {
707 };
708
720 int self_calibrate( int pga_gain_index, int channel_selection = 15, int input_select = 0, double reference_source_voltage = 0, bool use_positive_side = true );
721
723 void blink_leds( void );
724};
725
727{
728public:
730 NAFE13388( bool spi_addr = 0, bool highspeed_variant = false, int nINT = 2, int DRDY = 4, int SYN = 5, int nRESET = 6, int DRDY_input = 15, int SYNCDAC = 14 );
731
733 virtual ~NAFE13388();
734};
735
737{
738public:
740 NAFE13388_UIM( bool spi_addr = 0, bool highspeed_variant = false, int nINT = 3, int DRDY = 4, int SYN = 6, int nRESET = 7, int DRDY_input = 2, int SYNCDAC = 14 );
741
743 virtual ~NAFE13388_UIM();
744
745 void blink_leds( void );
746};
747
749{
750 return static_cast<NAFE13388_Base::Register16>( static_cast<uint16_t>( rn ) + n );
751}
752
754{
755 return static_cast<NAFE13388_Base::Register16>( n + static_cast<uint16_t>( rn ) );
756}
757
759{
760 return static_cast<NAFE13388_Base::Register24>( static_cast<uint16_t>( rn ) + n );
761}
762
764{
765 return static_cast<NAFE13388_Base::Register24>( n + static_cast<uint16_t>( rn ) );
766}
767
768#endif // ARDUINO_AFE_DRIVER_H
NAFE13388_Base::Register16 operator+(NAFE13388_Base::Register16 rn, int n)
Definition AFE_NXP.h:748
virtual void enable_logical_channel(int ch)=0
virtual void start_continuous_conversion(void)=0
static AFE_base * instance
Definition AFE_NXP.h:258
static callback_fp_t cbf_DRDY
Definition AFE_NXP.h:250
virtual void close_logical_channel(void)=0
int32_t raw_t
Definition AFE_NXP.h:22
double volt_t
Definition AFE_NXP.h:23
void use_DRDY_trigger(bool use=true)
Definition AFE_NXP.cpp:194
virtual ~AFE_base()
Definition AFE_NXP.cpp:84
virtual void open_logical_channel(int ch, const uint16_t(&cc)[4])=0
static void DRDY_cb()
Definition AFE_NXP.cpp:114
virtual double raw2v(int ch, raw_t value)=0
virtual void read(volt_t *data_ptr)=0
int pin_nINT
Definition AFE_NXP.h:217
virtual void set_DRDY_callback(callback_fp_t fnc)
Definition AFE_NXP.cpp:109
int pin_DRDY_input
Definition AFE_NXP.h:221
virtual void init(void)
Definition AFE_NXP.cpp:88
static constexpr uint32_t timeout_limit
Definition AFE_NXP.h:244
virtual void begin(void)
Definition AFE_NXP.cpp:98
virtual void open_logical_channel(int ch, uint16_t cc0, uint16_t cc1, uint16_t cc2, uint16_t cc3)=0
double drdy_delay(int ch)
Definition AFE_NXP.h:190
double raw2mv(int ch, raw_t value)
Definition AFE_NXP.h:174
@ VADD_REF2
Definition AFE_NXP.h:153
@ REF2_VHSS
Definition AFE_NXP.h:155
@ GPIO0_GPIO1
Definition AFE_NXP.h:151
@ REF2_REF2
Definition AFE_NXP.h:150
@ REFCOARSE_REF2
Definition AFE_NXP.h:152
@ VHDD_REF2
Definition AFE_NXP.h:154
bool highspeed_variant
Definition AFE_NXP.h:216
int enabled_logical_channels(void)
Definition AFE_NXP.h:203
virtual void reset(bool hardware_reset=false)=0
uint32_t drdy_count
Definition AFE_NXP.h:248
int bit_count(uint32_t value)
Definition AFE_NXP.cpp:155
int pin_SYNCDAC
Definition AFE_NXP.h:222
virtual void read(raw_t *data_ptr)=0
virtual void start(int ch)=0
void default_drdy_cb()
Definition AFE_NXP.cpp:126
double raw2uv(int ch, raw_t value)
Definition AFE_NXP.h:164
void(* callback_fp_t)(void)
Definition AFE_NXP.h:46
double coeff_V[16]
Definition AFE_NXP.h:234
virtual raw_t start_and_read(int ch)
Definition AFE_NXP.cpp:132
int enabled_channels
Definition AFE_NXP.h:228
uint8_t sequence_order[16]
Definition AFE_NXP.h:231
static void static_default_drdy_cb()
Definition AFE_NXP.cpp:120
virtual void start(void)=0
int wait_conversion_complete(double delay=-1.0)
Definition AFE_NXP.cpp:168
virtual void close_logical_channel(int ch)=0
volatile bool drdy_flag
Definition AFE_NXP.h:249
int pin_SYN
Definition AFE_NXP.h:219
static double delay_accuracy
Definition AFE_NXP.h:242
double ch_delay[16]
Definition AFE_NXP.h:240
int mux_setting[16]
Definition AFE_NXP.h:237
virtual void boot(void)=0
int pin_nRESET
Definition AFE_NXP.h:220
bool dev_add
Definition AFE_NXP.h:215
void start_and_read(T data)
Definition AFE_NXP.h:138
double drdy_delay(void)
Definition AFE_NXP.h:197
virtual raw_t read(int ch)=0
virtual void DRDY_by_sequencer_done(bool flag=true)=0
int pin_DRDY
Definition AFE_NXP.h:218
double total_delay
Definition AFE_NXP.h:241
virtual ~LogicalChannel_Base()
Definition AFE_NXP.h:265
double operator+(T v)
Definition AFE_NXP.h:275
friend double operator-(T v, LogicalChannel_Base lc)
Definition AFE_NXP.h:280
void enable(void)
Definition AFE_NXP.cpp:14
AFE_base * afe_ptr
Definition AFE_NXP.h:285
double operator-(T v)
Definition AFE_NXP.h:276
double operator*(T v)
Definition AFE_NXP.h:277
friend double operator/(T v, LogicalChannel_Base lc)
Definition AFE_NXP.h:282
friend double operator*(T v, LogicalChannel_Base lc)
Definition AFE_NXP.h:281
friend double operator+(T v, LogicalChannel_Base lc)
Definition AFE_NXP.h:279
double operator/(T v)
Definition AFE_NXP.h:278
void disable(void)
Definition AFE_NXP.cpp:19
void configure(const uint16_t(&cc)[4])
Definition AFE_NXP.cpp:56
virtual void start_continuous_conversion()
Definition AFE_NXP.cpp:396
double raw2v(int ch, raw_t value)
Definition AFE_NXP.h:410
virtual void boot(void)
Definition AFE_NXP.cpp:222
void gain_offset_coeff(const ref_points &ref)
Definition AFE_NXP.cpp:475
double calc_delay(int ch)
Definition AFE_NXP.cpp:307
virtual void command(uint16_t com)
Definition AFE_NXP.cpp:426
void blink_leds(void)
Definition AFE_NXP.cpp:611
virtual raw_t read(int ch)
Definition AFE_NXP.cpp:406
LogicalChannel logical_channel[16]
Definition AFE_NXP.h:344
static double pga_gain[]
Definition AFE_NXP.h:670
uint32_t bit_op(T rg, uint32_t mask, uint32_t value)
Definition AFE_NXP.h:660
int self_calibrate(int pga_gain_index, int channel_selection=15, int input_select=0, double reference_source_voltage=0, bool use_positive_side=true)
Definition AFE_NXP.cpp:507
struct NAFE13388_Base::_ref_points ref_points
virtual void start(void)
Definition AFE_NXP.cpp:391
virtual void reg(Register16 r, uint16_t value)
Definition AFE_NXP.cpp:431
struct NAFE13388_Base::_reference_point reference_point
uint8_t revision_number(void)
Definition AFE_NXP.cpp:456
virtual void close_logical_channel(void)
Definition AFE_NXP.cpp:379
virtual void DRDY_by_sequencer_done(bool flag=true)
Definition AFE_NXP.cpp:401
uint64_t serial_number(void)
Definition AFE_NXP.cpp:461
void channel_info_update(uint16_t value)
Definition AFE_NXP.cpp:282
virtual ~NAFE13388_Base()
Definition AFE_NXP.cpp:218
void enable_logical_channel(int ch)
Definition AFE_NXP.cpp:363
virtual void reset(bool hardware_reset=false)
Definition AFE_NXP.cpp:230
uint32_t part_number(void)
Definition AFE_NXP.cpp:451
virtual void open_logical_channel(int ch, uint16_t cc0, uint16_t cc1, uint16_t cc2, uint16_t cc3)
Definition AFE_NXP.cpp:357
uint16_t[4] ch_setting_t
Definition AFE_NXP.h:291
float temperature(void)
Definition AFE_NXP.cpp:470
void blink_leds(void)
Definition AFE_NXP.cpp:638
virtual ~NAFE13388_UIM()
Definition AFE_NXP.cpp:634
virtual ~NAFE13388()
Definition AFE_NXP.cpp:623
reference_point high
Definition AFE_NXP.h:300
reference_point low
Definition AFE_NXP.h:301