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)
Diff: LPS331.cpp
- Revision:
- 2:77cb7992a1a3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LPS331.cpp Thu Jul 24 14:53:59 2014 +0000 @@ -0,0 +1,135 @@ + +#include <mbed.h> +#include "LPS331.h" + +#define STATUS_REG 0x27 +#define MULTI_BYTE 0x40 +#define REF_P_XL 0x08 +#define REF_P_L 0x09 +#define REF_P_H 0x0A +#define WHO_AM_I 0x0F +#define RES_CONF 0x10 +#define CTRL_REG1 0x20 +#define PRESS_POUT_XL_REH 0x28 +#define PRESS_OUT_L 0x29 +#define PRESS_OUT_H 0x2A +#define TEMP_OUT_L 0x2B +#define TEMP_OUT_H 0x2C + +#define WRITE 0x00 +#define READ 0x80 + +#define pSensor 0x02 +#define tSensor 0x01 +#define bothSensors 0x03 + +lps331::lps331(SPI& _spi, PinName _ncs) : spi(_spi), ncs(_ncs) { +} + +uint16_t lps331::read_temperature() { + // check if updated value is available + if ( ready(tSensor) ) + { + select(); + // do multi byte read + spi.write(READ | MULTI_BYTE | TEMP_OUT_L); + uint8_t tempL = spi.write(READ); + uint8_t tempH = spi.write(READ); + deselect(); + + uint16_t temperature = (tempH<<8) | tempL; + // t[C] = 42.5 + temperature /480.0 + //float temp = (float)(42.5 + ((short)temperature*1.0/480.0)); + return temperature; + } + return 0; +} + +uint32_t lps331::read_pressure() { + // check if updated value is available + if ( ready(pSensor) ) + { + select(); + // do multi byte read + spi.write(READ | MULTI_BYTE | PRESS_POUT_XL_REH); + uint8_t pressureLX = spi.write(READ); + uint8_t pressureL = spi.write(READ); + uint8_t pressureH = spi.write(READ); + deselect(); + + uint32_t pressure = (pressureH<<16) | (pressureL<<8) | pressureLX; + // P[mBar] = pressure/4096 + // float P = pressure*1.0/4096.0; + return pressure; + } + return 0; +} + +float lps331::get_Pressure_mbar() +{ + uint32_t airP = read_pressure(); + float pressure = airP*1.0/4096.0; + return pressure; +} + +float lps331::get_Temp_C() +{ + short airT = read_temperature(); + float temp = (float)(42.5 + (airT*1.0/480.0)); + return temp; +} + +float lps331::get_Temp_F() +{ + short airT = read_temperature(); + float temp = (float)(108.5 + (airT*1.8/480.0)); + return temp; +} + +void lps331::select() { + //Set CS low to start transmission (interrupts conversion) + ncs = 0; +} + +void lps331::deselect() { + //Set CS high to stop transmission (restarts conversion) + ncs = 1; +} + +bool lps331::initialize(int setType) { + deselect(); + spi.format(8,0); + spi.frequency(400000); + + // set chip to update pressure and temp at 25Hz + writeRegister(CTRL_REG1, 0xE0); + wait_ms(1); + + // check board is responding + int whoami = readRegister(WHO_AM_I); + if (whoami == 0xBB) // addresss of chip + return true; + return false; +} + +int lps331::ready(uint8_t sensor) { + uint8_t status = readRegister(STATUS_REG); + if( (status & sensor)) + return 1; + return 0; +} + +uint8_t lps331::readRegister(uint8_t address){ + select(); + spi.write(READ | address); + uint8_t val = spi.write(READ); + deselect(); + return val; + } + +void lps331::writeRegister(uint8_t address, uint8_t value){ + select(); + spi.write(WRITE | address); + spi.write(value); + deselect(); +} \ No newline at end of file