Add MPL3115 driver; It's a bit slow (takes ~1s for DataReady to be set), should take a look

This commit is contained in:
Pim van Pelt
2018-04-21 23:18:43 +02:00
parent f4aa4f7844
commit 38fca7c650
4 changed files with 114 additions and 22 deletions

View File

@ -1,21 +1,97 @@
#include "mgos_barometer_mpl115.h"
#include "mgos_barometer_mpl3115.h"
#include "mgos_i2c.h"
// Datasheet:
// https://cdn-shop.adafruit.com/datasheets/1893_datasheet.pdf
bool mgos_barometer_mpl3115_detect(struct mgos_barometer *dev) {
return false;
int val;
if (!dev) {
return false;
}
if ((val = mgos_i2c_read_reg_b(dev->i2c, dev->i2caddr, MPL3115_REG_WHOAMI)) < 0) {
return false;
}
if (val != 0xC4) {
return false;
}
return true;
}
bool mgos_barometer_mpl3115_create(struct mgos_barometer *dev) {
return false;
}
if (!dev) {
return false;
}
bool mgos_barometer_mpl3115_destroy(struct mgos_barometer *dev){
return false;
// Reset
if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, MPL3115_REG_CTRL1, 0x04)) {
return false;
}
mgos_usleep(20000);
// Set sample period to 1sec ST[3:0], period 2^ST seconds
if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, MPL3115_REG_CTRL2, 0x00)) {
return false;
}
// Set Barometer Mode, OS[2:0], oversampling 2^OS times, continuous sampling
if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, MPL3115_REG_CTRL1, 0x39)) {
return false;
}
// Set event flags for temp+pressure
if (!mgos_i2c_write_reg_b(dev->i2c, dev->i2caddr, MPL3115_REG_PT_DATA, 0x07)) {
return false;
}
dev->has_barometer = true;
dev->has_thermometer = true;
return true;
}
bool mgos_barometer_mpl3115_read(struct mgos_barometer *dev) {
return false;
if (!dev) {
return false;
}
uint8_t val = 0;
while (!(val & 0x80)) { // Data Ready
if ((val = mgos_i2c_read_reg_b(dev->i2c, dev->i2caddr, MPL3115_REG_STATUS)) < 0) {
return false;
}
mgos_usleep(10000);
}
uint32_t pressure;
int16_t temperature;
uint8_t data[5];
if (!mgos_i2c_read_reg_n(dev->i2c, dev->i2caddr, MPL3115_REG_PRESSURE_MSB, 5, data)) {
return false;
}
pressure = data[0];
pressure <<= 8;
pressure |= data[1];
pressure <<= 8;
pressure |= data[2];
pressure >>= 4;
temperature = data[3];
temperature <<= 8;
temperature |= data[4];
temperature >>= 4;
if (temperature & 0x800) {
temperature |= 0xF000;
}
dev->pressure = pressure / 4.0;
dev->temperature = temperature / 16.0;
return true;
}