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

Committer:
jbeatch
Date:
2014-07-24
Revision:
2:77cb7992a1a3

File content as of revision 2:77cb7992a1a3:


#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();
}