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:
Fri Jan 05 22:36:05 2018 +0000
Revision:
2:4784f0a3b76d
Parent:
1:266f681fea17
Child:
3:5864c56ac8c5
working version: verified

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