1. 首先是数据的位操作,就MS4525DO的驱动代码为例,气压和温度的位操作不同,气压的高位左移8位我能理解,但为何温度的部分是高位左移3位低位右移5位呢?实际上写驱动时我是参考了别人写的C++版本才知道需要这样操作才能获得正确的读数,但我本身并不理解为何这样做,求教。
MS4525DO的datasheet
代码: 全选
data_buf = bytearray(4)
i2c.readfrom_into(addr, data_buf)
psi_h = data_buf[0]
psi_l = data_buf[1]
temp_h = data_buf[2]
temp_l = data_buf[3]
raw_psi_output_decimal = psi_h << 8 | psi_l
raw_temp_output_decimal = temp_h << 3 | temp_l >> 5
代码: 全选
int16_t dp_raw = 0, dT_raw = 0;
dp_raw = (val[0] << 8) + val[1];
dp_raw = 0x3FFF & dp_raw;
dT_raw = (val[2] << 8) + val[3];
dT_raw = (0xFFE0 & dT_raw) >> 5;