STMicroelectronics LPS331 I2C Library.

Dependents:   LPS331_HelloWorld mbed_vfd_thermometer lon-lof

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LPS331_I2C.cpp Source File

LPS331_I2C.cpp

00001 /*
00002  *  I2C/SPI digital pressure sensor "LPS331AP" library for I2C mode.
00003  *
00004  *  Copyright(c) -2013 unos@NYAMFG, 
00005  *  Released under the MIT License: http://mbed.org/license/mit
00006  *
00007  *  revision: see LPS331_I2C.h.
00008  */
00009 
00010 #include "LPS331_I2C.h"
00011 
00012 LPS331_I2C::LPS331_I2C(PinName sda, PinName scl, bool sa0) : _i2c(sda, scl)
00013 {
00014     if(sa0 == LPS331_I2C_SA0_HIGH) {
00015         _address = LPS331_I2C_ADDRESS_SA0_HIGH;
00016     } else {
00017         _address = LPS331_I2C_ADDRESS_SA0_LOW;
00018     }
00019     _i2c.frequency(400 * 1000);
00020     _ctrlreg1 = 0x20;
00021 }
00022 
00023 LPS331_I2C::~LPS331_I2C()
00024 {
00025 }
00026 
00027 char LPS331_I2C::whoami()
00028 {
00029     return _read(0x0f);
00030 }
00031 
00032 bool LPS331_I2C::isAvailable()
00033 {
00034     if(whoami() == 0xbb) { return true; }
00035     
00036     return false;
00037 }
00038 
00039 void LPS331_I2C::setResolution(char pressure_avg, char temp_avg)
00040 {
00041     _write(0x10, ((temp_avg & 0x07) << 4) | (pressure_avg & 0x0f));
00042 }
00043 
00044 void LPS331_I2C::setActive(bool is_active)
00045 {
00046     if(is_active) {
00047         _ctrlreg1 |= 0x80;
00048     } else {
00049         _ctrlreg1 &= ~0x80;
00050     }
00051 
00052     _write(0x20, _ctrlreg1);
00053 }
00054 
00055 void LPS331_I2C::setDataRate(char datarate)
00056 {
00057     datarate &= 0x07;
00058     
00059     _ctrlreg1 &= ~(0x07 << 4);
00060     _ctrlreg1 |= datarate << 4;
00061     
00062     _write(0x20, _ctrlreg1);
00063 }
00064 
00065     
00066 float LPS331_I2C::getPressure()
00067 {
00068     char data[3];
00069     float pressure = 0;
00070 
00071     _read_multibyte(0x28, data, 3);
00072     
00073     pressure  = data[0];
00074     pressure += data[1] << 8;
00075     pressure += data[2] << 16;
00076     pressure /= 4096.0;
00077     
00078     return pressure;
00079 }
00080 
00081 float LPS331_I2C::getTemperature()
00082 {
00083     char data[2];
00084     short temp = 0;
00085     
00086     _read_multibyte(0x2b, data, 2);    
00087     
00088     temp  = data[0];
00089     temp |= data[1] << 8;
00090     
00091     return (float)(42.5 + temp / 480.0);
00092 }
00093 
00094 
00095 void LPS331_I2C::_write(char subaddress, char data)
00096 {
00097     _i2c.start();
00098     _i2c.write(_address);
00099     _i2c.write(subaddress);
00100     _i2c.write(data);
00101     _i2c.stop();
00102 }
00103 
00104 char LPS331_I2C::_read(char subaddress)
00105 {
00106     char result = 0;
00107     
00108     _i2c.start();
00109     _i2c.write(_address);
00110     _i2c.write(subaddress);
00111     
00112     _i2c.start();
00113     _i2c.write(_address | 1);
00114     result = _i2c.read(0);
00115     
00116     _i2c.stop();
00117     
00118     return result;
00119 }
00120 
00121 void LPS331_I2C::_read_multibyte(char startsubaddress, char* data, char count)
00122 {
00123     _i2c.start();
00124     _i2c.write(_address);
00125     _i2c.write(startsubaddress | 0x80);
00126     
00127     _i2c.start();
00128     _i2c.write(_address | 1);
00129 
00130     for(int i = 0; i < count; i++) {
00131         data[i] = _i2c.read((i == count - 1) ? 0 : 1);
00132     }
00133     
00134     _i2c.stop();
00135 }
00136