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
MAX11410.cpp@5:c38d406f8d02, 2018-03-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |