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@2:4784f0a3b76d, 2018-01-05 (annotated)
- 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?
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 | 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 | } |