31 float tempSensitivity,
32 float pressSensitivity
36 baro->tempSensitivity = tempSensitivity;
37 baro->pressSensitivity = pressSensitivity;
47 BMP581_readRegister(baro, 0x01);
50 BMP581_writeRegister(baro, BMP581_CMD, 0xB6);
52 while (BMP581_readRegister(baro, BMP581_CHIP_ID) == 0x00);
53 while (BMP581_readRegister(baro, BMP581_INT_STATUS) != 0x10);
54 while (!(BMP581_readRegister(baro, BMP581_STATUS) & BMP581_STATUS_NVM_RDY));
55 while ((BMP581_readRegister(baro, BMP581_STATUS) & BMP581_STATUS_NVM_ERR));
57 BMP581_writeRegister(baro, BMP581_ODR_CFG, BMP581_ODR_CFG_DEEP_DIS);
58 for (uint32_t i = 0; i < 0x1FFFF; i++);
59 BMP581_writeRegister(baro, BMP581_ODR_CFG, BMP581_ODR_CFG_DEEP_DIS | BMP581_ODR_CFG_PWR_CONTINUOUS);
62 uint8_t OSRCFG = BMP581_readRegister(baro, BMP581_OSR_CFG);
63 BMP581_writeRegister(baro, BMP581_OSR_CFG, (BMP581_OSR_CFG_RESERVED & OSRCFG) | BMP581_OSR_CFG_PRESS_EN | BMP581_OSR_CFG_OSR_P_16);
66 for (uint32_t i = 0; i < 0x1FFFF; i++);
67 baro->readPress(baro, &baro->groundPress);
82 baro->readRawTemp(baro, baro->rawTemp);
83 baro->processRawTemp(baro, baro->rawTemp, &baro->temp);
85 baro->readRawPress(baro, baro->rawPress);
86 baro->processRawPress(baro, baro->rawPress, &baro->press);
98 uint8_t bytes[BMP581_DATA_TOTAL];
99 baro->readRawTemp(baro, bytes);
100 baro->processRawTemp(baro, bytes, out);
113 *out = baro->tempSensitivity * (int32_t)(((uint32_t)bytes[0] << 16) | ((uint32_t)bytes[1] << 8) | bytes[0]);
125 out[0] = BMP581_readRegister(baro, BMP581_TEMPERATURE_MSB);
126 out[1] = BMP581_readRegister(baro, BMP581_TEMPERATURE_LSB);
127 out[2] = BMP581_readRegister(baro, BMP581_TEMPERATURE_XLSB);
139 uint8_t bytes[BMP581_DATA_TOTAL];
140 baro->readRawPress(baro, bytes);
141 baro->processRawPress(baro, bytes, out);
153 *out = baro->pressSensitivity * (int32_t)(((uint32_t)bytes[0] << 16) | ((uint32_t)bytes[1] << 8) | bytes[0]);
165 uint8_t tmp[BMP581_DATA_SIZE];
166 BMP581_readRegisters(baro, BMP581_PRESSURE_XLSB, BMP581_DATA_SIZE, tmp);
174void BMP581_writeRegister(
BMP581_t *baro, uint8_t address, uint8_t data) {
175 SPI_t *spi = baro->base;
181 uint8_t payload = address & 0x7F;
188uint8_t BMP581_readRegister(
BMP581_t *baro, uint8_t address) {
189 uint8_t response = 0;
190 SPI_t *spi = baro->base;
196 uint8_t payload = address | 0x80;
197 response = spi->
transmit(spi, payload);
198 response = spi->
transmit(spi, 0xFF);
205void BMP581_readRegisters(
BMP581_t *baro, uint8_t address, uint8_t count, uint8_t *out) {
206 SPI_t *spi = baro->base;
212 uint8_t payload = address | 0x80;
216 for (uint8_t i = 0; i < count; i++) {
void BMP581_readRawPress(BMP581_t *, uint8_t *)
void BMP581_readTemp(BMP581_t *, float *)
Read the temperature from the BMP581 sensor.
void BMP581_update(BMP581_t *)
Updates the BMP581 barometer readings.
void BMP581_readPress(BMP581_t *, float *)
BMP581_t BMP581_init(BMP581_t *baro, SPI_t *spi, GPIOpin_t cs, float tempSensitivity, float pressSensitivity)
Initialiser for a BMP581 barometer.
void BMP581_readRawTemp(BMP581_t *, uint8_t *)
void BMP581_processRawTemp(BMP581_t *, uint8_t *, float *)
Processes raw temperature data from BMP581 sensor.
void BMP581_processRawPress(BMP581_t *, uint8_t *, float *)
void(* set)(struct GPIOpin *)
void(* reset)(struct GPIOpin *)
Struct definition for a GPIO pin.
uint16_t(* transmit)(struct SPI *, uint16_t)
SPI transmit method.
Struct definition for SPI interface. Provides the interface for API consumers to interact with the SP...