53 bsp::SPIA::write<u8>(
enumValue(Register::WHO_AM_I) | RequestResponse);
54 id = bsp::SPIA::read<u8>();
56 if(
id == DeviceID)
return true;
58 if(retries > 10)
return false;
71 return getSensorData().pressure;
80 return getSensorData().sensorTemperature;
114 struct ControlRegister2 {
124 static_assert (
sizeof(ControlRegister2) ==
sizeof(
u8),
"Control register 2 definition wrong");
131 float sensorTemperature;
134 constexpr
static inline u8 RequestResponse = 0x80;
135 constexpr
static inline u8 DeviceID = 0xb1;
136 constexpr
static inline u8 ConversionDone = 0x01;
144 static u8 readRegister(Register reg) {
146 bsp::SPIA::write<u8>(
enumValue(reg) | RequestResponse);
147 auto value = bsp::SPIA::read<u8>();
158 static SensorData getSensorData() {
159 SensorData senorData = {0};
160 ControlRegister2 ctrlReg2 = { .ONE_SHOT = 1, .I2C_DIS = 0, .IF_ADD_INC = 0 };
163 bsp::SPIA::write<std::array<u8,2>>({
enumValue(Register::CTRL_REG2), bit_cast<u8>(ctrlReg2)});
170 bsp::SPIA::write<u8>(
enumValue(Register::CTRL_REG2) | RequestResponse);
171 }
while((bsp::SPIA::read<u8>() & ConversionDone) == 0);
174 auto xl = readRegister(Register::PRESS_OUT_XL);
175 auto l = readRegister(Register::PRESS_OUT_L);
176 auto h = readRegister(Register::PRESS_OUT_H);
178 senorData.pressure =
static_cast<float>(xl | (l << 8) | (h << 16)) / 4096.0;
182 auto l = readRegister(Register::TEMP_OUT_L);
183 auto h = readRegister(Register::TEMP_OUT_H);
185 senorData.sensorTemperature =
static_cast<float>(l | (h << 8)) / 100;