Mbed Pololu LPS331 SPI library ouputs for Air Pessure & Temperature in unsigned values calculation to be done by user (though notes on calculations can be found within)
LPS331.cpp@2:77cb7992a1a3, 2014-07-24 (annotated)
- Committer:
- jbeatch
- Date:
- Thu Jul 24 14:53:59 2014 +0000
- Revision:
- 2:77cb7992a1a3
added functions to output Temp [C], Temp [F], and Pressure [mbar]
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jbeatch | 2:77cb7992a1a3 | 1 | |
jbeatch | 2:77cb7992a1a3 | 2 | #include <mbed.h> |
jbeatch | 2:77cb7992a1a3 | 3 | #include "LPS331.h" |
jbeatch | 2:77cb7992a1a3 | 4 | |
jbeatch | 2:77cb7992a1a3 | 5 | #define STATUS_REG 0x27 |
jbeatch | 2:77cb7992a1a3 | 6 | #define MULTI_BYTE 0x40 |
jbeatch | 2:77cb7992a1a3 | 7 | #define REF_P_XL 0x08 |
jbeatch | 2:77cb7992a1a3 | 8 | #define REF_P_L 0x09 |
jbeatch | 2:77cb7992a1a3 | 9 | #define REF_P_H 0x0A |
jbeatch | 2:77cb7992a1a3 | 10 | #define WHO_AM_I 0x0F |
jbeatch | 2:77cb7992a1a3 | 11 | #define RES_CONF 0x10 |
jbeatch | 2:77cb7992a1a3 | 12 | #define CTRL_REG1 0x20 |
jbeatch | 2:77cb7992a1a3 | 13 | #define PRESS_POUT_XL_REH 0x28 |
jbeatch | 2:77cb7992a1a3 | 14 | #define PRESS_OUT_L 0x29 |
jbeatch | 2:77cb7992a1a3 | 15 | #define PRESS_OUT_H 0x2A |
jbeatch | 2:77cb7992a1a3 | 16 | #define TEMP_OUT_L 0x2B |
jbeatch | 2:77cb7992a1a3 | 17 | #define TEMP_OUT_H 0x2C |
jbeatch | 2:77cb7992a1a3 | 18 | |
jbeatch | 2:77cb7992a1a3 | 19 | #define WRITE 0x00 |
jbeatch | 2:77cb7992a1a3 | 20 | #define READ 0x80 |
jbeatch | 2:77cb7992a1a3 | 21 | |
jbeatch | 2:77cb7992a1a3 | 22 | #define pSensor 0x02 |
jbeatch | 2:77cb7992a1a3 | 23 | #define tSensor 0x01 |
jbeatch | 2:77cb7992a1a3 | 24 | #define bothSensors 0x03 |
jbeatch | 2:77cb7992a1a3 | 25 | |
jbeatch | 2:77cb7992a1a3 | 26 | lps331::lps331(SPI& _spi, PinName _ncs) : spi(_spi), ncs(_ncs) { |
jbeatch | 2:77cb7992a1a3 | 27 | } |
jbeatch | 2:77cb7992a1a3 | 28 | |
jbeatch | 2:77cb7992a1a3 | 29 | uint16_t lps331::read_temperature() { |
jbeatch | 2:77cb7992a1a3 | 30 | // check if updated value is available |
jbeatch | 2:77cb7992a1a3 | 31 | if ( ready(tSensor) ) |
jbeatch | 2:77cb7992a1a3 | 32 | { |
jbeatch | 2:77cb7992a1a3 | 33 | select(); |
jbeatch | 2:77cb7992a1a3 | 34 | // do multi byte read |
jbeatch | 2:77cb7992a1a3 | 35 | spi.write(READ | MULTI_BYTE | TEMP_OUT_L); |
jbeatch | 2:77cb7992a1a3 | 36 | uint8_t tempL = spi.write(READ); |
jbeatch | 2:77cb7992a1a3 | 37 | uint8_t tempH = spi.write(READ); |
jbeatch | 2:77cb7992a1a3 | 38 | deselect(); |
jbeatch | 2:77cb7992a1a3 | 39 | |
jbeatch | 2:77cb7992a1a3 | 40 | uint16_t temperature = (tempH<<8) | tempL; |
jbeatch | 2:77cb7992a1a3 | 41 | // t[C] = 42.5 + temperature /480.0 |
jbeatch | 2:77cb7992a1a3 | 42 | //float temp = (float)(42.5 + ((short)temperature*1.0/480.0)); |
jbeatch | 2:77cb7992a1a3 | 43 | return temperature; |
jbeatch | 2:77cb7992a1a3 | 44 | } |
jbeatch | 2:77cb7992a1a3 | 45 | return 0; |
jbeatch | 2:77cb7992a1a3 | 46 | } |
jbeatch | 2:77cb7992a1a3 | 47 | |
jbeatch | 2:77cb7992a1a3 | 48 | uint32_t lps331::read_pressure() { |
jbeatch | 2:77cb7992a1a3 | 49 | // check if updated value is available |
jbeatch | 2:77cb7992a1a3 | 50 | if ( ready(pSensor) ) |
jbeatch | 2:77cb7992a1a3 | 51 | { |
jbeatch | 2:77cb7992a1a3 | 52 | select(); |
jbeatch | 2:77cb7992a1a3 | 53 | // do multi byte read |
jbeatch | 2:77cb7992a1a3 | 54 | spi.write(READ | MULTI_BYTE | PRESS_POUT_XL_REH); |
jbeatch | 2:77cb7992a1a3 | 55 | uint8_t pressureLX = spi.write(READ); |
jbeatch | 2:77cb7992a1a3 | 56 | uint8_t pressureL = spi.write(READ); |
jbeatch | 2:77cb7992a1a3 | 57 | uint8_t pressureH = spi.write(READ); |
jbeatch | 2:77cb7992a1a3 | 58 | deselect(); |
jbeatch | 2:77cb7992a1a3 | 59 | |
jbeatch | 2:77cb7992a1a3 | 60 | uint32_t pressure = (pressureH<<16) | (pressureL<<8) | pressureLX; |
jbeatch | 2:77cb7992a1a3 | 61 | // P[mBar] = pressure/4096 |
jbeatch | 2:77cb7992a1a3 | 62 | // float P = pressure*1.0/4096.0; |
jbeatch | 2:77cb7992a1a3 | 63 | return pressure; |
jbeatch | 2:77cb7992a1a3 | 64 | } |
jbeatch | 2:77cb7992a1a3 | 65 | return 0; |
jbeatch | 2:77cb7992a1a3 | 66 | } |
jbeatch | 2:77cb7992a1a3 | 67 | |
jbeatch | 2:77cb7992a1a3 | 68 | float lps331::get_Pressure_mbar() |
jbeatch | 2:77cb7992a1a3 | 69 | { |
jbeatch | 2:77cb7992a1a3 | 70 | uint32_t airP = read_pressure(); |
jbeatch | 2:77cb7992a1a3 | 71 | float pressure = airP*1.0/4096.0; |
jbeatch | 2:77cb7992a1a3 | 72 | return pressure; |
jbeatch | 2:77cb7992a1a3 | 73 | } |
jbeatch | 2:77cb7992a1a3 | 74 | |
jbeatch | 2:77cb7992a1a3 | 75 | float lps331::get_Temp_C() |
jbeatch | 2:77cb7992a1a3 | 76 | { |
jbeatch | 2:77cb7992a1a3 | 77 | short airT = read_temperature(); |
jbeatch | 2:77cb7992a1a3 | 78 | float temp = (float)(42.5 + (airT*1.0/480.0)); |
jbeatch | 2:77cb7992a1a3 | 79 | return temp; |
jbeatch | 2:77cb7992a1a3 | 80 | } |
jbeatch | 2:77cb7992a1a3 | 81 | |
jbeatch | 2:77cb7992a1a3 | 82 | float lps331::get_Temp_F() |
jbeatch | 2:77cb7992a1a3 | 83 | { |
jbeatch | 2:77cb7992a1a3 | 84 | short airT = read_temperature(); |
jbeatch | 2:77cb7992a1a3 | 85 | float temp = (float)(108.5 + (airT*1.8/480.0)); |
jbeatch | 2:77cb7992a1a3 | 86 | return temp; |
jbeatch | 2:77cb7992a1a3 | 87 | } |
jbeatch | 2:77cb7992a1a3 | 88 | |
jbeatch | 2:77cb7992a1a3 | 89 | void lps331::select() { |
jbeatch | 2:77cb7992a1a3 | 90 | //Set CS low to start transmission (interrupts conversion) |
jbeatch | 2:77cb7992a1a3 | 91 | ncs = 0; |
jbeatch | 2:77cb7992a1a3 | 92 | } |
jbeatch | 2:77cb7992a1a3 | 93 | |
jbeatch | 2:77cb7992a1a3 | 94 | void lps331::deselect() { |
jbeatch | 2:77cb7992a1a3 | 95 | //Set CS high to stop transmission (restarts conversion) |
jbeatch | 2:77cb7992a1a3 | 96 | ncs = 1; |
jbeatch | 2:77cb7992a1a3 | 97 | } |
jbeatch | 2:77cb7992a1a3 | 98 | |
jbeatch | 2:77cb7992a1a3 | 99 | bool lps331::initialize(int setType) { |
jbeatch | 2:77cb7992a1a3 | 100 | deselect(); |
jbeatch | 2:77cb7992a1a3 | 101 | spi.format(8,0); |
jbeatch | 2:77cb7992a1a3 | 102 | spi.frequency(400000); |
jbeatch | 2:77cb7992a1a3 | 103 | |
jbeatch | 2:77cb7992a1a3 | 104 | // set chip to update pressure and temp at 25Hz |
jbeatch | 2:77cb7992a1a3 | 105 | writeRegister(CTRL_REG1, 0xE0); |
jbeatch | 2:77cb7992a1a3 | 106 | wait_ms(1); |
jbeatch | 2:77cb7992a1a3 | 107 | |
jbeatch | 2:77cb7992a1a3 | 108 | // check board is responding |
jbeatch | 2:77cb7992a1a3 | 109 | int whoami = readRegister(WHO_AM_I); |
jbeatch | 2:77cb7992a1a3 | 110 | if (whoami == 0xBB) // addresss of chip |
jbeatch | 2:77cb7992a1a3 | 111 | return true; |
jbeatch | 2:77cb7992a1a3 | 112 | return false; |
jbeatch | 2:77cb7992a1a3 | 113 | } |
jbeatch | 2:77cb7992a1a3 | 114 | |
jbeatch | 2:77cb7992a1a3 | 115 | int lps331::ready(uint8_t sensor) { |
jbeatch | 2:77cb7992a1a3 | 116 | uint8_t status = readRegister(STATUS_REG); |
jbeatch | 2:77cb7992a1a3 | 117 | if( (status & sensor)) |
jbeatch | 2:77cb7992a1a3 | 118 | return 1; |
jbeatch | 2:77cb7992a1a3 | 119 | return 0; |
jbeatch | 2:77cb7992a1a3 | 120 | } |
jbeatch | 2:77cb7992a1a3 | 121 | |
jbeatch | 2:77cb7992a1a3 | 122 | uint8_t lps331::readRegister(uint8_t address){ |
jbeatch | 2:77cb7992a1a3 | 123 | select(); |
jbeatch | 2:77cb7992a1a3 | 124 | spi.write(READ | address); |
jbeatch | 2:77cb7992a1a3 | 125 | uint8_t val = spi.write(READ); |
jbeatch | 2:77cb7992a1a3 | 126 | deselect(); |
jbeatch | 2:77cb7992a1a3 | 127 | return val; |
jbeatch | 2:77cb7992a1a3 | 128 | } |
jbeatch | 2:77cb7992a1a3 | 129 | |
jbeatch | 2:77cb7992a1a3 | 130 | void lps331::writeRegister(uint8_t address, uint8_t value){ |
jbeatch | 2:77cb7992a1a3 | 131 | select(); |
jbeatch | 2:77cb7992a1a3 | 132 | spi.write(WRITE | address); |
jbeatch | 2:77cb7992a1a3 | 133 | spi.write(value); |
jbeatch | 2:77cb7992a1a3 | 134 | deselect(); |
jbeatch | 2:77cb7992a1a3 | 135 | } |