LCDDriver_NXP_Arduino 0.8.1
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 microvolt_t = double;
24
26 AFE_base( bool spi_addr, bool highspeed_variant, int nINT, int DRDY, int SYN, int nRESET );
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
45
47
56 virtual void open_logical_channel( int ch, uint16_t cc0, uint16_t cc1, uint16_t cc2, uint16_t cc3 ) = 0;
57
63 virtual void open_logical_channel( int ch, const uint16_t (&cc)[ 4 ] ) = 0;
64
69 virtual void close_logical_channel( int ch ) = 0;
70
73 virtual void close_logical_channel( void ) = 0;
74
79 virtual void start( int ch ) = 0;
80
83 virtual void start( void ) = 0;
84
87 virtual void start_continuous_conversion( void ) = 0;
88
93 virtual void DRDY_by_sequencer_done( bool flag = true ) = 0;
94
99 virtual raw_t read( int ch ) = 0;
100
105 virtual void read( raw_t *data_ptr ) = 0;
106
111 virtual raw_t start_and_read( int ch );
112
113#ifdef NON_TEMPLATE_VERSION_FOR_START_AND_READ
114
119 virtual void start_and_read( raw_t *data_ptr );
120
121#else
122 template<typename T>
123 inline void start_and_read( T data )
124 {
125// double wait_time = cbf_DRDY ? -1.0 : total_delay * delay_accuracy;
126 double wait_time = total_delay * delay_accuracy;
127
128 start();
129 wait_conversion_complete( wait_time );
130
131 read( data );
132 };
133#endif
134
140 inline double raw2uv( int ch, raw_t value )
141 {
142 return value * coeff_uV[ ch ];
143 }
144
150 inline double raw2mv( int ch, raw_t value )
151 {
152 return value * coeff_uV[ ch ] * 1e-3;
153 }
154
160 inline double raw2v( int ch, raw_t value )
161 {
162 return value * coeff_uV[ ch ] * 1e-6;
163 }
164
169 inline double coeff_mV( int ch )
170 {
171 return coeff_uV[ ch ];
172 }
173
178 inline double drdy_delay( int ch )
179 {
180 return ch_delay[ ch ];
181 }
182
185 inline double drdy_delay( void )
186 {
187 return total_delay;
188 }
189
191 inline int enabled_logical_channels( void )
192 {
193 return enabled_channels;
194 }
195
200 void use_DRDY_trigger( bool use = true );
201
202protected:
209
210 int bit_count( uint32_t value );
211
214
216 double coeff_uV[ 16 ];
217
219 double ch_delay[ 16 ];
221 static double delay_accuracy;
222
223
224 uint32_t drdy_count;
225 volatile bool drdy_flag;
226
227 constexpr static uint32_t timeout_limit = 100000000;
228
229 virtual void init( void );
230 void default_drdy_cb( void );
231
232 static void DRDY_cb( void );
233 int wait_conversion_complete( double delay = -1.0 );
234};
235
237{
238public:
239 using ch_setting_t = uint16_t[ 4 ];
240
241 typedef struct _reference_point {
242 double voltage;
243 int32_t data;
245
252
254 NAFE13388_Base( bool spi_addr, bool highspeed_variant, int nINT, int DRDY, int SYN, int nRESET );
255
257 virtual ~NAFE13388_Base();
258
260 virtual void boot( void );
261
263 virtual void reset( bool hardware_reset = false );
264
273 virtual void open_logical_channel( int ch, uint16_t cc0, uint16_t cc1, uint16_t cc2, uint16_t cc3 );
274
280 virtual void open_logical_channel( int ch, const uint16_t (&cc)[ 4 ] );
281
282private:
283 double calc_delay( int ch );
284 void channel_info_update( uint16_t value );
285
286public:
291 virtual void close_logical_channel( int ch );
292
295 virtual void close_logical_channel( void );
296
301 virtual void start( int ch );
302
305 virtual void start( void );
306
309 virtual void start_continuous_conversion();
310
315 virtual void DRDY_by_sequencer_done( bool flag = true );
316
321 virtual raw_t read( int ch );
322
327 virtual void read( raw_t *data );
328
329// constexpr static double pga_gain[] = { 0.2, 0.4, 0.8, 1, 2, 4, 8, 16 };
330 static double pga_gain[];
331
332 enum class Register16 : uint16_t {
341 GPI_DATA = 0x29,
347 GPO_DATA = 0x2F,
352 DIE_TEMP = 0x34,
355 THRS_TEMP = 0x37,
356 PN2 = 0x7C,
357 PN1 = 0x7D,
358 PN0 = 0x7E,
360 };
361
362 enum class Register24 : uint16_t {
363 CH_DATA0 = 0x40,
364 CH_DATA1 = 0x41,
365 CH_DATA2 = 0x42,
366 CH_DATA3 = 0x43,
367 CH_DATA4 = 0x44,
368 CH_DATA5 = 0x45,
369 CH_DATA6 = 0x46,
370 CH_DATA7 = 0x47,
371 CH_DATA8 = 0x48,
372 CH_DATA9 = 0x4A,
373 CH_DATA10 = 0x4B,
374 CH_DATA11 = 0x4C,
375 CH_DATA13 = 0x4D,
376 CH_DATA14 = 0x4E,
377 CH_DATA15 = 0x4F,
442 OPT_COEF0 = 0xA0,
443 OPT_COEF1 = 0xA1,
444 OPT_COEF2 = 0xA2,
445 OPT_COEF3 = 0xA3,
446 OPT_COEF4 = 0xA4,
447 OPT_COEF5 = 0xA5,
448 OPT_COEF6 = 0xA6,
449 OPT_COEF7 = 0xA7,
450 OPT_COEF8 = 0xA8,
451 OPT_COEF9 = 0xA9,
456 SERIAL1 = 0xAE,
457 SERIAL0 = 0xAF,
458 };
459
460 enum Command : uint16_t {
461 CMD_CH0 = 0x0000,
462 CMD_CH1 = 0x0001,
463 CMD_CH2 = 0x0002,
464 CMD_CH3 = 0x0003,
465 CMD_CH4 = 0x0004,
466 CMD_CH5 = 0x0005,
467 CMD_CH6 = 0x0006,
468 CMD_CH7 = 0x0007,
469 CMD_CH8 = 0x0008,
470 CMD_CH9 = 0x0009,
471 CMD_CH10 = 0x000A,
472 CMD_CH11 = 0x000B,
473 CMD_CH12 = 0x000C,
474 CMD_CH13 = 0x000D,
475 CMD_CH14 = 0x000E,
476 CMD_CH15 = 0x000F,
477 CMD_ABORT = 0x0010,
478 CMD_END = 0x0011,
481 CMD_RESET = 0x0014,
483 CMD_RELOAD = 0x0016,
484 TBD = 0x0017,
485 CMD_SS = 0x2000,
486 CMD_SC = 0x2001,
487 CMD_MM = 0x2002,
488 CMD_MC = 0x2003,
489 CMD_MS = 0x2004,
494 };
495
500 virtual void command( uint16_t com );
501
507 virtual void reg( Register16 r, uint16_t value );
508
514 virtual void reg( Register24 r, uint32_t value );
515
522 virtual uint16_t reg( Register16 r );
523
530 virtual uint32_t reg( Register24 r );
531
539 template<typename T>
540 uint32_t bit_op( T rg, uint32_t mask, uint32_t value )
542 uint32_t v = reg( rg );
543
544 v &= mask;
545 v |= value & ~mask;
546
547 reg( rg, v );
548
549 return v;
550 }
551
556 uint32_t part_number( void );
557
562 uint8_t revision_number( void );
563
568 uint64_t serial_number( void );
569
574 float temperature( void );
575
581 void gain_offset_coeff( const ref_points &ref );
582
583 enum CalibrationError : int {
587 };
588
600 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 );
601
603 void blink_leds( void );
604};
605
607{
608public:
610 NAFE13388( bool spi_addr = 0, bool highspeed_variant = false, int nINT = 2, int DRDY = 3, int SYN = 5, int nRESET = 6 );
611
613 virtual ~NAFE13388();
614};
615
617{
618public:
620 NAFE13388_UIM( bool spi_addr = 0, bool highspeed_variant = false, int nINT = 3, int DRDY = 4, int SYN = 6, int nRESET = 7 );
621
623 virtual ~NAFE13388_UIM();
624
625 void blink_leds( void );
626};
627
629{
630 return static_cast<NAFE13388_Base::Register16>( static_cast<uint16_t>( rn ) + n );
631}
632
634{
635 return static_cast<NAFE13388_Base::Register16>( n + static_cast<uint16_t>( rn ) );
636}
637
639{
640 return static_cast<NAFE13388_Base::Register24>( static_cast<uint16_t>( rn ) + n );
641}
642
644{
645 return static_cast<NAFE13388_Base::Register24>( n + static_cast<uint16_t>( rn ) );
646}
647
648#endif // ARDUINO_AFE_DRIVER_H
NAFE13388_Base::Register16 operator+(NAFE13388_Base::Register16 rn, int n)
Definition AFE_NXP.h:628
virtual void start_continuous_conversion(void)=0
virtual void close_logical_channel(void)=0
int32_t raw_t
Definition AFE_NXP.h:22
double microvolt_t
Definition AFE_NXP.h:23
void use_DRDY_trigger(bool use=true)
virtual ~AFE_base()
Definition AFE_NXP.cpp:31
virtual void open_logical_channel(int ch, const uint16_t(&cc)[4])=0
int pin_nINT
Definition AFE_NXP.h:205
AFE_base(bool spi_addr, bool highspeed_variant, int nINT, int DRDY, int SYN, int nRESET)
Definition AFE_NXP.cpp:16
virtual void init(void)
Definition AFE_NXP.cpp:35
static constexpr uint32_t timeout_limit
Definition AFE_NXP.h:227
static void DRDY_cb(void)
virtual void begin(void)
Definition AFE_NXP.cpp:45
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:178
void default_drdy_cb(void)
double raw2mv(int ch, raw_t value)
Definition AFE_NXP.h:150
bool highspeed_variant
Definition AFE_NXP.h:204
int enabled_logical_channels(void)
Definition AFE_NXP.h:191
virtual void reset(bool hardware_reset=false)=0
uint32_t drdy_count
Definition AFE_NXP.h:224
int bit_count(uint32_t value)
Definition AFE_NXP.cpp:76
double coeff_uV[16]
Definition AFE_NXP.h:216
virtual void read(raw_t *data_ptr)=0
virtual void start(int ch)=0
double raw2uv(int ch, raw_t value)
Definition AFE_NXP.h:140
virtual raw_t start_and_read(int ch)
Definition AFE_NXP.cpp:52
int enabled_channels
Definition AFE_NXP.h:213
virtual void start(void)=0
int wait_conversion_complete(double delay=-1.0)
Definition AFE_NXP.cpp:89
virtual void close_logical_channel(int ch)=0
volatile bool drdy_flag
Definition AFE_NXP.h:225
int pin_SYN
Definition AFE_NXP.h:207
static double delay_accuracy
Definition AFE_NXP.h:221
double ch_delay[16]
Definition AFE_NXP.h:219
virtual void boot(void)=0
int pin_nRESET
Definition AFE_NXP.h:208
double coeff_mV(int ch)
Definition AFE_NXP.h:169
bool dev_add
Definition AFE_NXP.h:203
void start_and_read(T data)
Definition AFE_NXP.h:123
double drdy_delay(void)
Definition AFE_NXP.h:185
virtual raw_t read(int ch)=0
double raw2v(int ch, raw_t value)
Definition AFE_NXP.h:160
virtual void DRDY_by_sequencer_done(bool flag=true)=0
int pin_DRDY
Definition AFE_NXP.h:206
double total_delay
Definition AFE_NXP.h:220
virtual void start_continuous_conversion()
Definition AFE_NXP.cpp:277
NAFE13388_Base(bool spi_addr, bool highspeed_variant, int nINT, int DRDY, int SYN, int nRESET)
Definition AFE_NXP.cpp:114
virtual void boot(void)
Definition AFE_NXP.cpp:123
void gain_offset_coeff(const ref_points &ref)
Definition AFE_NXP.cpp:346
double calc_delay(int ch)
Definition AFE_NXP.cpp:196
virtual void command(uint16_t com)
Definition AFE_NXP.cpp:297
void blink_leds(void)
Definition AFE_NXP.cpp:482
virtual raw_t read(int ch)
Definition AFE_NXP.cpp:287
static double pga_gain[]
Definition AFE_NXP.h:541
uint32_t bit_op(T rg, uint32_t mask, uint32_t value)
Definition AFE_NXP.h:540
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:378
struct NAFE13388_Base::_ref_points ref_points
virtual void start(void)
Definition AFE_NXP.cpp:272
virtual void reg(Register16 r, uint16_t value)
Definition AFE_NXP.cpp:302
struct NAFE13388_Base::_reference_point reference_point
uint8_t revision_number(void)
Definition AFE_NXP.cpp:327
virtual void close_logical_channel(void)
Definition AFE_NXP.cpp:260
virtual void DRDY_by_sequencer_done(bool flag=true)
Definition AFE_NXP.cpp:282
uint64_t serial_number(void)
Definition AFE_NXP.cpp:332
void channel_info_update(uint16_t value)
Definition AFE_NXP.cpp:180
virtual ~NAFE13388_Base()
Definition AFE_NXP.cpp:119
virtual void reset(bool hardware_reset=false)
Definition AFE_NXP.cpp:132
uint32_t part_number(void)
Definition AFE_NXP.cpp:322
virtual void open_logical_channel(int ch, uint16_t cc0, uint16_t cc1, uint16_t cc2, uint16_t cc3)
Definition AFE_NXP.cpp:246
uint16_t[4] ch_setting_t
Definition AFE_NXP.h:239
float temperature(void)
Definition AFE_NXP.cpp:341
NAFE13388_UIM(bool spi_addr=0, bool highspeed_variant=false, int nINT=3, int DRDY=4, int SYN=6, int nRESET=7)
Definition AFE_NXP.cpp:500
void blink_leds(void)
Definition AFE_NXP.cpp:509
virtual ~NAFE13388_UIM()
Definition AFE_NXP.cpp:505
virtual ~NAFE13388()
Definition AFE_NXP.cpp:494
NAFE13388(bool spi_addr=0, bool highspeed_variant=false, int nINT=2, int DRDY=3, int SYN=5, int nRESET=6)
Definition AFE_NXP.cpp:489
reference_point high
Definition AFE_NXP.h:248
reference_point low
Definition AFE_NXP.h:249