29 char name[DEVICE_NAME_LENGTH],
32 float tempSensitivity,
33 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 volatile uint8_t counter = 0;
59 BMP581_writeRegister(baro, BMP581_ODR_CFG, BMP581_ODR_CFG_DEEP_DIS);
60 for (uint32_t i = 0; i < 0x1FFFF; i++) {
63 BMP581_writeRegister(baro, BMP581_ODR_CFG, BMP581_ODR_CFG_DEEP_DIS | BMP581_ODR_CFG_PWR_CONTINUOUS);
65 uint8_t OSRCFG = BMP581_readRegister(baro, BMP581_OSR_CFG);
66 BMP581_writeRegister(baro, BMP581_OSR_CFG, (BMP581_OSR_CFG_RESERVED & OSRCFG) | BMP581_OSR_CFG_PRESS_EN | BMP581_OSR_CFG_OSR_P_16);
69 for (uint32_t i = 0; i < 0x1FFFF; i++) {
72 baro->readPress(baro, &baro->groundPress);
75 strcpy(handle.name, name);
90 baro->readRawTemp(baro, baro->rawTemp);
91 baro->processRawTemp(baro, baro->rawTemp, &baro->temp);
93 baro->readRawPress(baro, baro->rawPress);
94 baro->processRawPress(baro, baro->rawPress, &baro->press);
106 uint8_t bytes[BMP581_DATA_TOTAL];
107 baro->readRawTemp(baro, bytes);
108 baro->processRawTemp(baro, bytes, out);
121 *out = baro->tempSensitivity * (int32_t)(((uint32_t)bytes[0] << 16) | ((uint32_t)bytes[1] << 8) | bytes[0]);
133 out[0] = BMP581_readRegister(baro, BMP581_TEMPERATURE_MSB);
134 out[1] = BMP581_readRegister(baro, BMP581_TEMPERATURE_LSB);
135 out[2] = BMP581_readRegister(baro, BMP581_TEMPERATURE_XLSB);
147 uint8_t bytes[BMP581_DATA_TOTAL];
148 baro->readRawPress(baro, bytes);
149 baro->processRawPress(baro, bytes, out);
161 *out = baro->pressSensitivity * (int32_t)(((uint32_t)bytes[0] << 16) | ((uint32_t)bytes[1] << 8) | bytes[0]);
173 uint8_t tmp[BMP581_DATA_SIZE];
174 BMP581_readRegisters(baro, BMP581_PRESSURE_XLSB, BMP581_DATA_SIZE, tmp);
182void BMP581_writeRegister(
BMP581 *baro, uint8_t address, uint8_t data) {
183 SPI spi = baro->base;
185 spi.
port->ODR &= ~spi.cs;
188 uint8_t payload = address & 0x7F;
195uint8_t BMP581_readRegister(
BMP581 *baro, uint8_t address) {
196 uint8_t response = 0;
197 SPI spi = baro->base;
199 spi.
port->ODR &= ~spi.cs;
202 uint8_t payload = address | 0x80;
203 response = spi.
transmit(&spi, payload);
204 response = spi.
transmit(&spi, 0xFF);
211void BMP581_readRegisters(
BMP581 *baro, uint8_t address, uint8_t count, uint8_t *out) {
212 SPI spi = baro->base;
214 spi.
port->ODR &= ~spi.cs;
217 uint8_t payload = address | 0x80;
221 for (uint8_t i = 0; i < count; i++) {
void BMP581_readRawPress(BMP581 *, uint8_t *)
void BMP581_readTemp(BMP581 *, float *)
Read the temperature from the BMP581 sensor.
void BMP581_processRawTemp(BMP581 *, uint8_t *, float *)
Processes raw temperature data from BMP581 sensor.
void BMP581_readRawTemp(BMP581 *, uint8_t *)
void BMP581_processRawPress(BMP581 *, uint8_t *, float *)
void BMP581_update(BMP581 *)
Updates the BMP581 barometer readings.
void BMP581_readPress(BMP581 *, float *)
DeviceHandle_t BMP581_init(BMP581 *baro, char name[DEVICE_NAME_LENGTH], GPIO_TypeDef *port, unsigned long cs, float tempSensitivity, float pressSensitivity)
Initialiser for a BMP581 barometer.
void SPI_init(SPI *, DeviceType, SPI_TypeDef *, DataFormat, GPIO_TypeDef *, unsigned long)
Initialiser for an SPI device interface.
Struct definition for SPI interface. Provides the interface for API consumers to interact with the SP...
uint16_t(* transmit)(struct SPI *, uint16_t)
SPI transmit method.
GPIO_TypeDef * port
Pointer to GPIO port struct.
unsigned long cs
Device chip select address.