This version has been verified for basic register R/W. No calibration has been added yet. See example main code at https://os.mbed.com/users/laserdad/code/MAX11410_testing/

Dependents:   MAX11410_testing MAX11410_test MAX11410-test

Committer:
laserdad
Date:
Thu Mar 22 20:24:43 2018 +0000
Revision:
5:c38d406f8d02
Parent:
3:5864c56ac8c5
made the ADCs sample simultaneously. added IIR filter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
laserdad 0:b90ccc530cb1 1 #include "MAX11410.h"
laserdad 0:b90ccc530cb1 2 #include "mbed.h"
laserdad 0:b90ccc530cb1 3
laserdad 0:b90ccc530cb1 4 extern Serial pc;
laserdad 0:b90ccc530cb1 5
laserdad 0:b90ccc530cb1 6 //write functions
laserdad 0:b90ccc530cb1 7 MAX11410::MAX11410(SPI *spi_itf, DigitalOut *cs_pin)
laserdad 0:b90ccc530cb1 8 {
laserdad 0:b90ccc530cb1 9 spi = spi_itf;
laserdad 0:b90ccc530cb1 10 cs = cs_pin;
laserdad 0:b90ccc530cb1 11 *cs = 1; // Assert CS high
laserdad 0:b90ccc530cb1 12 wait_us(5);
laserdad 0:b90ccc530cb1 13 //POR, wake it up, turn on buffer, etc.
laserdad 0:b90ccc530cb1 14 };
laserdad 0:b90ccc530cb1 15
laserdad 3:5864c56ac8c5 16
laserdad 0:b90ccc530cb1 17 void MAX11410::reset()
laserdad 2:4784f0a3b76d 18 {
laserdad 0:b90ccc530cb1 19 write8bitReg(REG_PD, MODE_RESET);
laserdad 0:b90ccc530cb1 20 }
laserdad 0:b90ccc530cb1 21
laserdad 3:5864c56ac8c5 22
laserdad 0:b90ccc530cb1 23 bool MAX11410::interrupt()
laserdad 0:b90ccc530cb1 24 {
laserdad 2:4784f0a3b76d 25
laserdad 0:b90ccc530cb1 26 *cs = 0;
laserdad 0:b90ccc530cb1 27 bool result = spi->write(_READ(0));
laserdad 0:b90ccc530cb1 28 *cs =1;
laserdad 0:b90ccc530cb1 29 return !result; //low = interrupt
laserdad 0:b90ccc530cb1 30 }
laserdad 0:b90ccc530cb1 31
laserdad 0:b90ccc530cb1 32
laserdad 0:b90ccc530cb1 33 void MAX11410::write8bitReg(char regAddr, char bits2write)
laserdad 0:b90ccc530cb1 34 {
laserdad 2:4784f0a3b76d 35
laserdad 0:b90ccc530cb1 36 *cs = 0;
laserdad 0:b90ccc530cb1 37 spi->write( _WRITE(regAddr) );
laserdad 0:b90ccc530cb1 38 spi->write( bits2write );
laserdad 0:b90ccc530cb1 39 *cs = 1;
laserdad 0:b90ccc530cb1 40 }
laserdad 0:b90ccc530cb1 41
laserdad 0:b90ccc530cb1 42
laserdad 0:b90ccc530cb1 43 void MAX11410::write24bitReg(char regAddr, uint32_t bits2write)
laserdad 0:b90ccc530cb1 44 {
laserdad 2:4784f0a3b76d 45
laserdad 2:4784f0a3b76d 46 char write_buffer[8];
laserdad 2:4784f0a3b76d 47 write_buffer[0] = _WRITE(regAddr) ;
laserdad 2:4784f0a3b76d 48 write_buffer[1] = (bits2write & 0x00FF0000) >> 16;
laserdad 2:4784f0a3b76d 49 write_buffer[2] = (bits2write & 0x00FF0000) >> 8;
laserdad 2:4784f0a3b76d 50 write_buffer[3] = (bits2write & 0x000000FF);
laserdad 0:b90ccc530cb1 51 *cs = 0;
laserdad 2:4784f0a3b76d 52 for (int n=0;n<4;n++)
laserdad 2:4784f0a3b76d 53 {
laserdad 2:4784f0a3b76d 54 spi->write(write_buffer[n]);
laserdad 2:4784f0a3b76d 55 }
laserdad 0:b90ccc530cb1 56 *cs = 1;
laserdad 0:b90ccc530cb1 57 }
laserdad 0:b90ccc530cb1 58
laserdad 0:b90ccc530cb1 59 char MAX11410::read8bits(char regAddr, bool *int_status)
laserdad 0:b90ccc530cb1 60 {
laserdad 0:b90ccc530cb1 61 //the interrupt status (INTB) is the MISO value during the register write, 0 = interrupt is assert
laserdad 2:4784f0a3b76d 62 *cs=0;
laserdad 0:b90ccc530cb1 63 *int_status = spi->write(_READ(regAddr));
laserdad 2:4784f0a3b76d 64 char data = spi->write(0x00);
laserdad 2:4784f0a3b76d 65 *cs=1;
laserdad 2:4784f0a3b76d 66 return data;
laserdad 0:b90ccc530cb1 67 }
laserdad 0:b90ccc530cb1 68
laserdad 0:b90ccc530cb1 69
laserdad 0:b90ccc530cb1 70 uint32_t MAX11410::read24bits(char regAddr, bool *int_status)
laserdad 0:b90ccc530cb1 71 {
laserdad 0:b90ccc530cb1 72 //the interrupt status is the MISO value during the register write
laserdad 2:4784f0a3b76d 73 char read_buffer[3];
laserdad 0:b90ccc530cb1 74 *cs = 0;
laserdad 2:4784f0a3b76d 75 *int_status = spi->write(_READ(regAddr));
laserdad 2:4784f0a3b76d 76 for (int n=0;n<3;n++)
laserdad 2:4784f0a3b76d 77 {
laserdad 2:4784f0a3b76d 78 read_buffer[n]=spi->write(0x00);
laserdad 2:4784f0a3b76d 79 }
laserdad 0:b90ccc530cb1 80 *cs = 1;
laserdad 2:4784f0a3b76d 81 return (read_buffer[0]<<16) | (read_buffer[1] <<8) | read_buffer[2];
laserdad 2:4784f0a3b76d 82 }
laserdad 2:4784f0a3b76d 83
laserdad 2:4784f0a3b76d 84 int32_t MAX11410::read24bitsSigned(char regAddr, bool *int_status)
laserdad 2:4784f0a3b76d 85 {
laserdad 2:4784f0a3b76d 86 //the interrupt status is the MISO value during the register write
laserdad 2:4784f0a3b76d 87 char read_buffer[3];
laserdad 2:4784f0a3b76d 88 *cs = 0;
laserdad 2:4784f0a3b76d 89 *int_status = spi->write(_READ(regAddr));
laserdad 2:4784f0a3b76d 90 for (int n=0;n<3;n++)
laserdad 2:4784f0a3b76d 91 {
laserdad 2:4784f0a3b76d 92 read_buffer[n]=spi->write(0x00);
laserdad 2:4784f0a3b76d 93 }
laserdad 2:4784f0a3b76d 94 *cs = 1;
laserdad 2:4784f0a3b76d 95 int32_t signal = (read_buffer[0]<<16) | (read_buffer[1] <<8) | read_buffer[2];
laserdad 2:4784f0a3b76d 96
laserdad 2:4784f0a3b76d 97 if( signal & 0x00800000 ) //is the MSB set-->then negative
laserdad 2:4784f0a3b76d 98 {
laserdad 2:4784f0a3b76d 99 signal |= 0xFF000000; //fill in the other MSBs
laserdad 2:4784f0a3b76d 100 }
laserdad 2:4784f0a3b76d 101 return signal;
laserdad 0:b90ccc530cb1 102 }
laserdad 0:b90ccc530cb1 103
laserdad 0:b90ccc530cb1 104
laserdad 0:b90ccc530cb1 105 void MAX11410::calOffset()
laserdad 0:b90ccc530cb1 106 {
laserdad 0:b90ccc530cb1 107
laserdad 0:b90ccc530cb1 108 }
laserdad 0:b90ccc530cb1 109
laserdad 0:b90ccc530cb1 110
laserdad 0:b90ccc530cb1 111 void MAX11410::calGain()
laserdad 0:b90ccc530cb1 112 {
laserdad 0:b90ccc530cb1 113
laserdad 0:b90ccc530cb1 114 }
laserdad 0:b90ccc530cb1 115
laserdad 0:b90ccc530cb1 116
laserdad 0:b90ccc530cb1 117 uint32_t MAX11410::readStatus(bool *int_status)
laserdad 0:b90ccc530cb1 118 {
laserdad 0:b90ccc530cb1 119 return read24bits(REG_STATUS,int_status);
laserdad 0:b90ccc530cb1 120 }