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)

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?

UserRevisionLine numberNew 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 }