文章目录

  • 前言

    • 通信接口:IIC
    • 一,MS5611的5种命令
      • RESET : 重启芯片

        • READ PROM:
        • D1,D2 CONVERSION
        • READ ADC RESULT:
    • 二,实现代码
      • 1 初始化 :
      • 2,读取数据
      • 3,补偿温度数据

前言

这篇博客将介绍使用stm32的IIC库函数开发MS5611气压计,获取气压数据和温度数据,并对数据进行补偿。过程将结合芯片手册与代码。
手册下载地址:https://wws.lanzous.com/iZDAvf6joyd
代码仓库地址:https://gitee.com/killerp/MS5611

通信接口:IIC

使用IIC接口进行数据读取。
当PS脚接高电平时,7和8引脚复用为IIC模式,否则为SPI模式;

由上图,CSB接地,则CSB非就是1了。所以MS5611的地址就是0xEE;

一、MS5611的5种命令

MS5611仅有5种基础命令:

1、RESET : 重启芯片

在读取PROM数据之前必须REST芯片,也就是在初始化的时候reset一下:
reset命令固定是0x1E;

/** 重启ms5611*/
void MS5611_Rest()
{I2C_WriteByte(I2C1,MS5611_SLAVE_ADDR,MS5611_CMD_REST);delay_ms(4);}

2、READ PROM:

读取PROM内存的数据,PROM存放8个16位数据,第一个16位数据包含工厂数据,第二到第七个数据用于补偿气压和温度。2-7的具体含义见图:

最后一个数据是CRC校验数据

3、D1,D2 CONVERSION

因为传感器获得的气压数据,温度数据是模拟量,需要进行模数转换。D1,D2分别对应气压和温度的模数转换精度。支持从256到4096的转换精度,精度越大,转换时间越长,具体对应关系见图:

4、READ ADC RESULT:

读取气压和温度模数转换后的数据,就是我们需要的数据。每次读取必须先进行模数转换后,延时一个转换时间后再发送此命令。

二、实现代码

1 、初始化 :

需要重启芯片,然后读取保存PROM内8个数据,等会补偿数据时会用到

/*
*  读取prom的内容
*/
int MS5611_init()
{ms5611_init();Ms5611_Rest();I2C_ReadBytes(I2C1,MS5611_SLAVE_ADDR,MS5611_PROM_READ_0,2,(unsigned char *)(ms5611_handle->reserve),MSB);I2C_ReadBytes(I2C1,MS5611_SLAVE_ADDR,MS5611_PROM_READ_1,2,(unsigned char *)(ms5611_handle->C),MSB);I2C_ReadBytes(I2C1,MS5611_SLAVE_ADDR,MS5611_PROM_READ_2,2,(unsigned char *)((ms5611_handle->C)+1),MSB);I2C_ReadBytes(I2C1,MS5611_SLAVE_ADDR,MS5611_PROM_READ_3,2,(unsigned char *)((ms5611_handle->C)+2),MSB);I2C_ReadBytes(I2C1,MS5611_SLAVE_ADDR,MS5611_PROM_READ_4,2,(unsigned char *)((ms5611_handle->C)+3),MSB);I2C_ReadBytes(I2C1,MS5611_SLAVE_ADDR,MS5611_PROM_READ_5,2,(unsigned char *)((ms5611_handle->C)+4),MSB);I2C_ReadBytes(I2C1,MS5611_SLAVE_ADDR,MS5611_PROM_READ_6,2,(unsigned char *)((ms5611_handle->C)+5),MSB);I2C_ReadBytes(I2C1,MS5611_SLAVE_ADDR,MS5611_PROM_READ_7,2,(unsigned char *)(ms5611_handle->CRC),MSB);
}

2、读取数据

以读取温度数据为例,先发送转换命令,等待转换时间,再去读取3个字节的温度数据

/** 读取温度 转换精度4096
*/
int MS5611_read_temp()
{I2C_WriteByte(I2C1,MS5611_SLAVE_ADDR,MS5611_CMD_CONVERT_D2_4096);//发送转换命令delay_ms(9);//等待转换完成I2C_ReadBytes(I2C1,MS5611_SLAVE_ADDR,MS6511_ADC_READ,3,(unsigned char *)((ms5611_handle->D)+1),MSB);//读取三个字节的温度
}

3、补偿温度数据

计算公式来自手册,主要是为了求出P(温度补偿压力):

当温度过低时,计算过程就多了T2,OFF2等步骤:

代码上基本跟着手册的公式来,这里不考虑温度低于-15°的情况

/** 修正气压和温度
*/
int MS5611_calculate()
{signed long long dT = 0,TEMP = 0,T2 = 0,OFF = 0,OFF2 = 0,SENS2 = 0,SENS = 0;dT = ms5611_handle->D[1] - ((signed long long) (ms5611_handle->C[4])<<8);TEMP = 2000 + ((signed long long) (dT*(ms5611_handle->C[5]))>>23);//低于20°时:if(TEMP < 2000 && TEMP > -1500){T2 = ( dT*dT )>>31;OFF2 = 5 * (TEMP - 2000) * (TEMP - 2000) / 2;SENS2 = 5 * (TEMP - 2000) * (TEMP - 2000) / 4;}OFF = (((int64_t)(ms5611_handle->C[1])) << 16) + (((ms5611_handle->C[3]) * dT) >> 7);SENS = (((int64_t)(ms5611_handle->C[0])) << 15) + (((ms5611_handle->C[2]) * dT) >> 8);ms5611_handle->dT = dT;ms5611_handle->OFF -= OFF2;ms5611_handle->TEMP -= T2;ms5611_handle->SENS -= SENS2;ms5611_handle->P = ((((ms5611_handle->D[0]) * (ms5611_handle->SENS))>>21) - (ms5611_handle->OFF))>>15;}

(11条消息) MS5611气压计 I2C驱动代码 STM32_杀手的博客-CSDN博客

MS5611气压计 I2C驱动代码 STM32相关推荐

  1. ​HC32L130/HC32L136华大单片机硬件I2C驱动代码(从机为存储芯片EEPROM(AT24C02,FM24CL64B))​

    由于同事嫌弃模拟I2C速度太慢了 所以想改成硬件I2C 我试过例程的驱动代码 不太行 存储地址也是8位的 所以参考了一些博文 修改了下例程的代码 亲测有效 希望能帮到大家 代码如下 这里用的是I2C0 ...

  2. MSP430F5529 DriverLib 库函数I2C驱动OLED屏幕

    目录 I2C驱动代码 MSP430F5529_I2C.c MSP430F5529_I2C.h OLED初始化及测试 OLED驱动代码 OLED.c OLED.h OLED_Font.h 显示效果 平台 ...

  3. MSP430G2553 Launchpad 硬件I2C驱动

    一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A ...

  4. linux下I2C驱动体系结构及在FL2440开发板上的具体实现

    最近一段时间,我在网上看了一些关于linux下i2c的文档,对i2c有了一些较浅层次了解.写这篇博客,主要是对现在已经掌握知识的巩固. Linux下I2C驱动体系结构 Linux下I2C驱动体系结构由 ...

  5. AMG8833的使用与stm32驱动代码

    一.介绍 1.内部框图 可以看到AMG8833的内部有红外点阵测温,并且还带有一个热敏电阻.使用同一个ADC进行采样,然后送给Control. 2.器件参数 测温点数:64(8x8的矩阵) 帧率:10 ...

  6. 【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结

    目录 SPI版 OLED SPI 端口定义 七针OLED引脚定义 六针OLED引脚定义 软件SPI 硬件SPI 启用DMA 帧率测试 I2C 版 软件I2C 硬件I2C DMA STM32F103VE ...

  7. GC9A01-TFT屏幕驱动(整理有stm32/51单片机/arduino等驱动代码)

    GC9A01-TFT屏幕驱动 & 整理有stm32/51单片机/arduino等驱动代码 前言 关于GC9A01 stm32驱动 引脚接线 代码移植 文件复制 端口修改 显示函数 中文汉字数组 ...

  8. STM32——stm32 I2C通信代码配置(2)(学习笔记)

    STM32--I2C通信配置 I2C的系统框架 1.通讯引脚 2.时钟控制逻辑 3.数据控制逻辑 4.整体控制逻辑 通信过程 写入过程 读取过程 I2C代码配置 I2C的初始化结构体 几个重要的函数 ...

  9. 传感器:土壤湿度传感器(XH-M214)介绍及stm32驱动代码

    土壤湿度传感器(XH-M214)及stm32驱动代码 XH-M214简介 stm32驱动 XH-M214 protues测试 本篇主要介绍:stm32f103 ADC读取电压 采集土壤湿度传感器(XH ...

最新文章

  1. BZOJ4563[Haoi2016]放棋子
  2. 电脑设置 win10 文件夹如何设置黑色描边?文件夹图片如何显示缩略图?
  3. SQLServer转义问题
  4. 修饰符const精妙之处
  5. C# 8 新特性 - 静态本地方法
  6. 组件:slot插槽、组件:组合slot
  7. Java制作屏幕截图软件(还可以保存到剪切板内)
  8. android 2.3 webView select控件 无法及时显示optionLabel的BUG
  9. 【模电】0010 正弦波产生电路(RC正弦波振荡电路)
  10. ElementUI表格序号翻页后重置的解决办法
  11. 如何分享带淘宝客的链接到新浪微博
  12. csapp lab环境搭建及lab1wp
  13. 取消 “是否把IE8设置为默认浏览器提示 提示
  14. 【websocket前后端交互】vue-springboot实现websocket前后端交互链接,websocket心跳重连,包含前后端代码,复制即可用【详细解释版本】
  15. 在本地实现远程登录阿里云服务器的前提条件
  16. VMware 14安装 CentOS 7
  17. UI 设计师的盛宴:Web UI 设计资源大系
  18. Android饼状图
  19. Do not use empty rulesetscss(emptyRules) html入门篇
  20. 三百左右蓝牙耳机选哪个?300左右无线蓝牙耳机推荐

热门文章

  1. 百科园c语言,百科园C语言题库教程.doc
  2. iFIX 6.1新功能之 - OPC UA Client Driver
  3. flink时间窗口无新的数据进来最后一个窗口不关闭
  4. 关于指令集AVX AVX2学习笔记
  5. 丁鹿学堂:前端进阶学习vue3最新教程之vue的单文件组件深入理解
  6. 内网渗透神器CobaltStrike之钓鱼攻击(六)
  7. IPFS技术系列之IPFS简单介绍
  8. 网络测试工具集 - netwox (可实现网络欺骗)
  9. 洛谷 P2067 Cytus-Holyknight
  10. C语言中宽字符和多字节字符