请教:写MS4525DO驱动时遇到的问题
发表于 : 2021年 1月 6日 16:28
昨天分享了MS4525DO气压传感器的驱动 ,由于这是我第一次写驱动且之前没有任何C语言的背景,因此对于理解硬件的底层操作还是有些困难,此处有两个问题请教大家。
1. 首先是数据的位操作,就MS4525DO的驱动代码为例,气压和温度的位操作不同,气压的高位左移8位我能理解,但为何温度的部分是高位左移3位低位右移5位呢?实际上写驱动时我是参考了别人写的C++版本才知道需要这样操作才能获得正确的读数,但我本身并不理解为何这样做,求教。
MS4525DO的datasheet
2. 另外在我参考的C++驱动里有这样的代码:dp_raw = 0x3FFF & dp_raw; dT_raw = (0xFFE0 & dT_raw) >> 5;。这里的0x3FFF &和0xFFE0 &的作用是什么?
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;