我正试图从MPL3115读取压力值。 在第14.3章,ds说:
压力数据存储为带有小数部分的20位无符号整数。该 OUT_P_MSB(01h),OUT_P_CSB(02h)和OUT_P_LSB(03h)的第7位到第6位 寄存器包含Pascals中的整数部分。 OUT_P_LSB的第5到4位包含 分数分量。该值代表Q18.2定点格式,其中 有18个整数位和2个小数位。
这是我的(测试)Microchip XMEGA(GCC)代码:
#define MPL3115_ADDRESS 0x60
#define MPL3115_REG_PRESSURE_DATA 0x01
bool _ReadRegister(uint8_t address, uint8_t *readBuf, uint8_t readCount)
{
TWI_MasterWriteRead(&twiMaster, MPL3115_ADDRESS, &address, 1, readCount);
while (twiMaster.status != TWIM_STATUS_READY);
memcpy(readBuf, (void *) twiMaster.readData, readCount);
return true;
}
bool MPL3115_ReadPressure(float *value) {
uint8_t raw[3];
_ReadRegister(MPL3115_REG_PRESSURE_DATA, raw, 3);
uint32_t data = (((uint32_t) raw[0]) << 16) | (((uint32_t) raw[1]) << 8) | raw[2];
uint32_t q18n2 = data >> 4;
*value = (double) q18n2 / 4;
return true;
}
我很确定i2c系列正在工作,因为我可以成功读取同一芯片的温度。 我将其配置为气压计模式和128次过采样(CTRL_REG1 = 0x38)。 在调试模式下,我读取了以下值:
获得Pascal的压力我必须右移4位数据:
现在将Q18.2转换为浮点数我应该乘以2 ^ -n或除以4:
这应该是Pascal,所以除以100得到mBar = 247.27 mBar ...我不太可能在这里有这样的压力!顺便说一句,现在应该在1008 mBar左右。
我的想法是否有任何错误?
答案 0 :(得分:2)
您必须右移6位数据,然后添加小数部分(2位* 0.25)。
*value = (raw0 << 10) | (raw1 << 2) | (raw2 >> 6);
*value += 0.25 * ((raw2 >> 4) & 0x03);