请教:写MS4525DO驱动时遇到的问题

MicroPython相关代码、库、软件、工具
回复
dukeduck
帖子: 29
注册时间: 2020年 4月 25日 16:19

请教:写MS4525DO驱动时遇到的问题

#1

帖子 dukeduck »

昨天分享了MS4525DO气压传感器的驱动 ,由于这是我第一次写驱动且之前没有任何C语言的背景,因此对于理解硬件的底层操作还是有些困难,此处有两个问题请教大家。

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
2. 另外在我参考的C++驱动里有这样的代码:dp_raw = 0x3FFF & dp_raw;  dT_raw = (0xFFE0 & dT_raw) >> 5;。这里的0x3FFF &和0xFFE0 &的作用是什么?

代码: 全选

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;

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: 请教:写MS4525DO驱动时遇到的问题

#2

帖子 shaoziyang »

1.高位左移3位低位右移5位相当于2字节的整数除以32.

2. dp_raw = 0x3FFF & dp_raw 相当于对 dp_raw 取 0x4000的余数,也就是保证数值不超过0x4000。

dukeduck
帖子: 29
注册时间: 2020年 4月 25日 16:19

Re: 请教:写MS4525DO驱动时遇到的问题

#3

帖子 dukeduck »

dp_raw = 0x3FFF & dp_raw 这部分我理解了,因为datasheet上气压的16进制输出值最大是0x3FFF,所以这个0x3FFF &就是确保气压值小于等于0x3FFF

但dT_raw = (0xFFE0 & dT_raw) >> 5;这部分我还是不明白。datasheet上温度输出值是从0x0000到0x07FF,那0xFFE0是哪里来的,为何又要除以32呢?datasheet上并没有看到相关的说明

admin
Site Admin
帖子: 3
注册时间: 2019年 10月 21日 13:43

Re: 请教:写MS4525DO驱动时遇到的问题

#4

帖子 admin »

 (0xFFE0 & dT_raw) 就是 b1111111111100000 & dT_raw,也就是取高11位,然后右移5位。计算方式的确没有看到手册说明,应该还有其他参考文档。

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章