AFE_NXP_Arduino 2.0.4
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
8
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
52 virtual void set_DRDY_callback( callback_fp_t fnc );
53
62 virtual void open_logical_channel( int ch, uint16_t cc0, uint16_t cc1, uint16_t cc2, uint16_t cc3 ) = 0;
63
69 virtual void open_logical_channel( int ch, const uint16_t (&cc)[ 4 ] ) = 0;
70
75 virtual void close_logical_channel( int ch ) = 0;
76
79 virtual void close_logical_channel( void ) = 0;
80
85 virtual void enable_logical_channel( int ch ) = 0;
86
91 virtual void start( int ch ) = 0;
92
95 virtual void start( void ) = 0;
96
99 virtual void start_continuous_conversion( void ) = 0;
100
105 virtual void DRDY_by_sequencer_done( bool flag = true ) = 0;
106
111 virtual raw_t read( int ch ) = 0;
112
117 virtual void read( raw_t *data_ptr ) = 0;
118
123 virtual void read( volt_t *data_ptr ) = 0;
124
129 virtual raw_t start_and_read( int ch );
130
131#ifdef NON_TEMPLATE_VERSION_FOR_START_AND_READ
132
137 virtual void start_and_read( raw_t *data_ptr );
138
139#else
144 template<typename T>
145 inline void start_and_read( T data )
146 {
147 double wait_time = cbf_DRDY ? -1.0 : total_delay * delay_accuracy;
148
149 start();
150 wait_conversion_complete( wait_time );
151
152 read( data );
153 };
154#endif
155
166
172 inline double raw2uv( int ch, raw_t value )
173 {
174 return raw2v( ch, value ) * 1e6;
175 }
176
182 inline double raw2mv( int ch, raw_t value )
183 {
184 return raw2v( ch, value ) * 1e3;
185 }
186
192 virtual double raw2v( int ch, raw_t value ) = 0;
193
198 inline double drdy_delay( int ch )
199 {
200 return ch_delay[ ch ];
201 }
202
205 inline double drdy_delay( void )
206 {
207 return total_delay;
208 }
209
211 inline int enabled_logical_channels( void )
212 {
213 return enabled_channels;
214 }
215
220 void use_DRDY_trigger( bool use = true );
221
222protected:
231
232
238 int bit_count( uint32_t value );
239
242
244 uint8_t sequence_order[ 16 ];
245
247 double coeff_V[ 16 ];
248
250 int mux_setting[ 16 ];
251
253 double ch_delay[ 16 ];
255 static double delay_accuracy;
256
257 constexpr static uint32_t timeout_limit = 10000000;
258
259 void default_drdy_cb();
260 static void static_default_drdy_cb();
261 uint32_t drdy_count;
262 volatile bool drdy_flag;
264 static void DRDY_cb();
265
267 virtual void init( void );
268
274 int wait_conversion_complete( double delay = -1.0 );
275
276public:
278};
279
281{
282public:
285
287 void enable( void );
289 void disable( void );
290
295 template<class T> T read(void);
296
298 operator AFE_base::raw_t(void);
300 operator AFE_base::volt_t(void);
301
303 template<class T> double operator+( T v ) { return (double)(*this) + (double)v; }
304 template<class T> double operator-( T v ) { return (double)(*this) - (double)v; }
305 template<class T> double operator*( T v ) { return (double)(*this) * (double)v; }
306 template<class T> double operator/( T v ) { return (double)(*this) / (double)v; }
307 template<class T> friend double operator+( T v, LogicalChannel_Base lc ) { return (double)v + (double)lc; }
308 template<class T> friend double operator-( T v, LogicalChannel_Base lc ) { return (double)v - (double)lc; }
309 template<class T> friend double operator*( T v, LogicalChannel_Base lc ) { return (double)v * (double)lc; }
310 template<class T> friend double operator/( T v, LogicalChannel_Base lc ) { return (double)v / (double)lc; }
312
315};
316
318{
319public:
320 using ch_setting_t = uint16_t[ 4 ];
321
322 typedef struct _reference_point {
323 double voltage;
324 int32_t data;
326
333
335 NAFE13388_Base( bool spi_addr, bool highspeed_variant, int nINT, int DRDY, int SYN, int nRESET, int DRDY_input, int SYNCDAC );
336
338 virtual ~NAFE13388_Base();
339
341 virtual void boot( void );
342
344 virtual void reset( bool hardware_reset = false );
345
354 virtual void open_logical_channel( int ch, uint16_t cc0, uint16_t cc1, uint16_t cc2, uint16_t cc3 );
355
361 virtual void open_logical_channel( int ch, const uint16_t (&cc)[ 4 ] );
362
364 {
365 public:
367 virtual ~LogicalChannel();
368
373 void configure( const uint16_t (&cc)[ 4 ] );
374
382 void configure( uint16_t cc0 = 0x0000, uint16_t cc1 = 0x0000, uint16_t cc2 = 0x0000, uint16_t cc3 = 0x0000 );
383 };
384
386
387 private:
388 double calc_delay( int ch );
389 void channel_info_update( uint16_t value );
390
391public:
396 virtual void close_logical_channel( int ch );
397
400 virtual void close_logical_channel( void );
401
406 void enable_logical_channel( int ch );
407
412 virtual void start( int ch );
413
416 virtual void start( void );
417
420 virtual void start_continuous_conversion();
421
426 virtual void DRDY_by_sequencer_done( bool flag = true );
427
432 virtual raw_t read( int ch );
433
438 virtual void read( raw_t *data );
439
444 virtual void read( volt_t *data );
445
451 inline double raw2v( int ch, raw_t value )
452 {
453 double v = value * coeff_V[ ch ];
454
455 if ( HV_MUX != mux_setting[ ch ] )
456 {
457 switch ( mux_setting[ ch ] )
458 {
459 case REF2_REF2:
460 case GPIO0_GPIO1:
461 return v;
462 break;
463 case REFCOARSE_REF2:
464 case VADD_REF2:
465 return 2.00 * (v + 1.50);
466 break;
467 case VHDD_REF2:
468 return 32.00 * (v + 0.25);
469 break;
470 case REF2_VHSS:
471 return -32.00 * (v - 0.25);
472 break;
473 }
474 }
475 return v;
476 }
477
478
479// constexpr static double pga_gain[] = { 0.2, 0.4, 0.8, 1, 2, 4, 8, 16 };
480 static double pga_gain[];
481
492
493 enum class Register16 : uint16_t {
502 GPI_DATA = 0x29,
508 GPO_DATA = 0x2F,
513 DIE_TEMP = 0x34,
516 THRS_TEMP = 0x37,
517 PN2 = 0x7C,
518 PN1 = 0x7D,
519 PN0 = 0x7E,
521 };
522
523 enum class Register24 : uint16_t {
524 CH_DATA0 = 0x40,
525 CH_DATA1 = 0x41,
526 CH_DATA2 = 0x42,
527 CH_DATA3 = 0x43,
528 CH_DATA4 = 0x44,
529 CH_DATA5 = 0x45,
530 CH_DATA6 = 0x46,
531 CH_DATA7 = 0x47,
532 CH_DATA8 = 0x48,
533 CH_DATA9 = 0x4A,
534 CH_DATA10 = 0x4B,
535 CH_DATA11 = 0x4C,
536 CH_DATA13 = 0x4D,
537 CH_DATA14 = 0x4E,
538 CH_DATA15 = 0x4F,
603 OPT_COEF0 = 0xA0,
604 OPT_COEF1 = 0xA1,
605 OPT_COEF2 = 0xA2,
606 OPT_COEF3 = 0xA3,
607 OPT_COEF4 = 0xA4,
608 OPT_COEF5 = 0xA5,
609 OPT_COEF6 = 0xA6,
610 OPT_COEF7 = 0xA7,
611 OPT_COEF8 = 0xA8,
612 OPT_COEF9 = 0xA9,
617 SERIAL1 = 0xAE,
618 SERIAL0 = 0xAF,
619 };
620
621 enum Command : uint16_t {
622 CMD_CH0 = 0x0000,
623 CMD_CH1 = 0x0001,
624 CMD_CH2 = 0x0002,
625 CMD_CH3 = 0x0003,
626 CMD_CH4 = 0x0004,
627 CMD_CH5 = 0x0005,
628 CMD_CH6 = 0x0006,
629 CMD_CH7 = 0x0007,
630 CMD_CH8 = 0x0008,
631 CMD_CH9 = 0x0009,
632 CMD_CH10 = 0x000A,
633 CMD_CH11 = 0x000B,
634 CMD_CH12 = 0x000C,
635 CMD_CH13 = 0x000D,
636 CMD_CH14 = 0x000E,
637 CMD_CH15 = 0x000F,
638 CMD_ABORT = 0x0010,
639 CMD_END = 0x0011,
642 CMD_RESET = 0x0014,
644 CMD_RELOAD = 0x0016,
645 TBD = 0x0017,
646 CMD_SS = 0x2000,
647 CMD_SC = 0x2001,
648 CMD_MM = 0x2002,
649 CMD_MC = 0x2003,
650 CMD_MS = 0x2004,
655 };
656
661 virtual void command( uint16_t com );
662
669 virtual void reg( Register16 r, uint16_t value );
677 virtual void reg( Register24 r, uint32_t value );
678
685 virtual uint16_t reg( Register16 r );
686
693 virtual uint32_t reg( Register24 r );
694
702 template<typename T>
703 uint32_t bit_op( T rg, uint32_t mask, uint32_t value )
704 {
705 uint32_t v = reg( rg );
706
707 v &= mask;
708 v |= value & ~mask;
709
710 reg( rg, v );
711
712 return v;
713 }
714
719 uint32_t part_number( void );
720
725 uint8_t revision_number( void );
726
731 uint64_t serial_number( void );
732
737 float temperature( void );
738
744 void gain_offset_coeff( const ref_points &ref );
745
746 enum CalibrationError : int {
750 };
751
763 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 );
764
766 void blink_leds( void );
767};
768
770{
771public:
773 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 );
774
776 virtual ~NAFE13388();
777};
778
780{
781public:
783 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 );
784
786 virtual ~NAFE13388_UIM();
787
789 void blink_leds( void );
790};
791
793{
794 return static_cast<NAFE13388_Base::Register16>( static_cast<uint16_t>( rn ) + n );
795}
796
798{
799 return static_cast<NAFE13388_Base::Register16>( n + static_cast<uint16_t>( rn ) );
800}
801
803{
804 return static_cast<NAFE13388_Base::Register24>( static_cast<uint16_t>( rn ) + n );
805}
806
808{
809 return static_cast<NAFE13388_Base::Register24>( n + static_cast<uint16_t>( rn ) );
810}
811
812#endif // ARDUINO_AFE_DRIVER_H
NAFE13388_Base::Register16 operator+(NAFE13388_Base::Register16 rn, int n)
Definition AFE_NXP.h:792
virtual void enable_logical_channel(int ch)=0
virtual void start_continuous_conversion(void)=0
static AFE_base * instance
Definition AFE_NXP.h:277
static callback_fp_t cbf_DRDY
Definition AFE_NXP.h:263
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:225
virtual void set_DRDY_callback(callback_fp_t fnc)
Definition AFE_NXP.cpp:109
int pin_DRDY_input
Definition AFE_NXP.h:229
virtual void init(void)
Definition AFE_NXP.cpp:88
static constexpr uint32_t timeout_limit
Definition AFE_NXP.h:257
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:198
double raw2mv(int ch, raw_t value)
Definition AFE_NXP.h:182
@ VADD_REF2
Definition AFE_NXP.h:161
@ REF2_VHSS
Definition AFE_NXP.h:163
@ GPIO0_GPIO1
Definition AFE_NXP.h:159
@ REF2_REF2
Definition AFE_NXP.h:158
@ REFCOARSE_REF2
Definition AFE_NXP.h:160
@ VHDD_REF2
Definition AFE_NXP.h:162
bool highspeed_variant
Definition AFE_NXP.h:224
int enabled_logical_channels(void)
Definition AFE_NXP.h:211
virtual void reset(bool hardware_reset=false)=0
uint32_t drdy_count
Definition AFE_NXP.h:261
int bit_count(uint32_t value)
Definition AFE_NXP.cpp:155
int pin_SYNCDAC
Definition AFE_NXP.h:230
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:172
void(* callback_fp_t)(void)
Definition AFE_NXP.h:46
double coeff_V[16]
Definition AFE_NXP.h:247
virtual raw_t start_and_read(int ch)
Definition AFE_NXP.cpp:132
int enabled_channels
Definition AFE_NXP.h:241
uint8_t sequence_order[16]
Definition AFE_NXP.h:244
static void static_default_drdy_cb()
Definition AFE_NXP.cpp:120
virtual void start(void)=0
AFE_base(bool spi_addr, bool highspeed_variant, int nINT, int DRDY, int SYN, int nRESET, int DRDY_input, int SYNCDAC)
Definition AFE_NXP.cpp:70
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:262
int pin_SYN
Definition AFE_NXP.h:227
static double delay_accuracy
Definition AFE_NXP.h:255
double ch_delay[16]
Definition AFE_NXP.h:253
int mux_setting[16]
Definition AFE_NXP.h:250
virtual void boot(void)=0
int pin_nRESET
Definition AFE_NXP.h:228
bool dev_add
Definition AFE_NXP.h:223
void start_and_read(T data)
Definition AFE_NXP.h:145
double drdy_delay(void)
Definition AFE_NXP.h:205
virtual raw_t read(int ch)=0
virtual void DRDY_by_sequencer_done(bool flag=true)=0
int pin_DRDY
Definition AFE_NXP.h:226
double total_delay
Definition AFE_NXP.h:254
virtual ~LogicalChannel_Base()
Definition AFE_NXP.h:284
double operator+(T v)
Definition AFE_NXP.h:303
friend double operator-(T v, LogicalChannel_Base lc)
Definition AFE_NXP.h:308
void enable(void)
Definition AFE_NXP.cpp:14
AFE_base * afe_ptr
Definition AFE_NXP.h:314
double operator-(T v)
Definition AFE_NXP.h:304
double operator*(T v)
Definition AFE_NXP.h:305
friend double operator/(T v, LogicalChannel_Base lc)
Definition AFE_NXP.h:310
friend double operator*(T v, LogicalChannel_Base lc)
Definition AFE_NXP.h:309
friend double operator+(T v, LogicalChannel_Base lc)
Definition AFE_NXP.h:307
double operator/(T v)
Definition AFE_NXP.h:306
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:451
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:385
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:703
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
NAFE13388_Base(bool spi_addr, bool highspeed_variant, int nINT, int DRDY, int SYN, int nRESET, int DRDY_input, int SYNCDAC)
Definition AFE_NXP.cpp:208
uint16_t[4] ch_setting_t
Definition AFE_NXP.h:320
float temperature(void)
Definition AFE_NXP.cpp:470
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)
Definition AFE_NXP.cpp:629
void blink_leds(void)
Definition AFE_NXP.cpp:638
virtual ~NAFE13388_UIM()
Definition AFE_NXP.cpp:634
virtual ~NAFE13388()
Definition AFE_NXP.cpp:623
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)
Definition AFE_NXP.cpp:618
reference_point high
Definition AFE_NXP.h:329
reference_point low
Definition AFE_NXP.h:330