STMicroelectronics LPS331AP, LPS25H SPI Library. This library is base on https://developer.mbed.org/users/nyamfg/code/LPS331_I2C/
Dependents: LPS331_SPI_Test main_SPC
Fork of LPS331_I2C by
Diff: LPS331_SPI.cpp
- Revision:
- 2:c2aa9cfc45c2
- Parent:
- 1:b7d3d6e82049
- Child:
- 3:5a56dd5131bb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LPS331_SPI.cpp Thu Jul 28 08:23:18 2016 +0000 @@ -0,0 +1,136 @@ +/* + * I2C/SPI digital pressure sensor "LPS331AP" library for I2C mode. + * + * Copyright(c) -2013 unos@NYAMFG, + * Released under the MIT License: http://mbed.org/license/mit + * + * revision: see LPS331_I2C.h. + */ + +#include "LPS331_I2C.h" + +LPS331_I2C::LPS331_I2C(PinName sda, PinName scl, bool sa0) : _i2c(sda, scl) +{ + if(sa0 == LPS331_I2C_SA0_HIGH) { + _address = LPS331_I2C_ADDRESS_SA0_HIGH; + } else { + _address = LPS331_I2C_ADDRESS_SA0_LOW; + } + _i2c.frequency(400 * 1000); + _ctrlreg1 = 0x20; +} + +LPS331_I2C::~LPS331_I2C() +{ +} + +char LPS331_I2C::whoami() +{ + return _read(0x0f); +} + +bool LPS331_I2C::isAvailable() +{ + if(whoami() == 0xbb) { return true; } + + return false; +} + +void LPS331_I2C::setResolution(char pressure_avg, char temp_avg) +{ + _write(0x10, ((temp_avg & 0x07) << 4) | (pressure_avg & 0x0f)); +} + +void LPS331_I2C::setActive(bool is_active) +{ + if(is_active) { + _ctrlreg1 |= 0x80; + } else { + _ctrlreg1 &= ~0x80; + } + + _write(0x20, _ctrlreg1); +} + +void LPS331_I2C::setDataRate(char datarate) +{ + datarate &= 0x07; + + _ctrlreg1 &= ~(0x07 << 4); + _ctrlreg1 |= datarate << 4; + + _write(0x20, _ctrlreg1); +} + + +float LPS331_I2C::getPressure() +{ + char data[3]; + float pressure = 0; + + _read_multibyte(0x28, data, 3); + + pressure = data[0]; + pressure += data[1] << 8; + pressure += data[2] << 16; + pressure /= 4096.0; + + return pressure; +} + +float LPS331_I2C::getTemperature() +{ + char data[2]; + short temp = 0; + + _read_multibyte(0x2b, data, 2); + + temp = data[0]; + temp |= data[1] << 8; + + return (float)(42.5 + temp / 480.0); +} + + +void LPS331_I2C::_write(char subaddress, char data) +{ + _i2c.start(); + _i2c.write(_address); + _i2c.write(subaddress); + _i2c.write(data); + _i2c.stop(); +} + +char LPS331_I2C::_read(char subaddress) +{ + char result = 0; + + _i2c.start(); + _i2c.write(_address); + _i2c.write(subaddress); + + _i2c.start(); + _i2c.write(_address | 1); + result = _i2c.read(0); + + _i2c.stop(); + + return result; +} + +void LPS331_I2C::_read_multibyte(char startsubaddress, char* data, char count) +{ + _i2c.start(); + _i2c.write(_address); + _i2c.write(startsubaddress | 0x80); + + _i2c.start(); + _i2c.write(_address | 1); + + for(int i = 0; i < count; i++) { + data[i] = _i2c.read((i == count - 1) ? 0 : 1); + } + + _i2c.stop(); +} +