STMicroelectronics LPS331 I2C Library.
Dependents: LPS331_HelloWorld mbed_vfd_thermometer lon-lof
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
Generated on Thu Jul 21 2022 18:52:16 by 1.7.2