MS5611气压计 I2C驱动代码 STM32
文章目录
- 前言
- 通信接口:IIC
- 一,MS5611的5种命令
- RESET : 重启芯片
- READ PROM:
- D1,D2 CONVERSION
- READ ADC RESULT:
- RESET : 重启芯片
- 二,实现代码
- 1 初始化 :
- 2,读取数据
- 3,补偿温度数据
前言
通信接口:IIC
使用IIC接口进行数据读取。
当PS脚接高电平时,7和8引脚复用为IIC模式,否则为SPI模式;
由上图,CSB接地,则CSB非就是1了。所以MS5611的地址就是0xEE;
一、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相关推荐
- HC32L130/HC32L136华大单片机硬件I2C驱动代码(从机为存储芯片EEPROM(AT24C02,FM24CL64B))
由于同事嫌弃模拟I2C速度太慢了 所以想改成硬件I2C 我试过例程的驱动代码 不太行 存储地址也是8位的 所以参考了一些博文 修改了下例程的代码 亲测有效 希望能帮到大家 代码如下 这里用的是I2C0 ...
- MSP430F5529 DriverLib 库函数I2C驱动OLED屏幕
目录 I2C驱动代码 MSP430F5529_I2C.c MSP430F5529_I2C.h OLED初始化及测试 OLED驱动代码 OLED.c OLED.h OLED_Font.h 显示效果 平台 ...
- MSP430G2553 Launchpad 硬件I2C驱动
一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A ...
- linux下I2C驱动体系结构及在FL2440开发板上的具体实现
最近一段时间,我在网上看了一些关于linux下i2c的文档,对i2c有了一些较浅层次了解.写这篇博客,主要是对现在已经掌握知识的巩固. Linux下I2C驱动体系结构 Linux下I2C驱动体系结构由 ...
- AMG8833的使用与stm32驱动代码
一.介绍 1.内部框图 可以看到AMG8833的内部有红外点阵测温,并且还带有一个热敏电阻.使用同一个ADC进行采样,然后送给Control. 2.器件参数 测温点数:64(8x8的矩阵) 帧率:10 ...
- 【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结
目录 SPI版 OLED SPI 端口定义 七针OLED引脚定义 六针OLED引脚定义 软件SPI 硬件SPI 启用DMA 帧率测试 I2C 版 软件I2C 硬件I2C DMA STM32F103VE ...
- GC9A01-TFT屏幕驱动(整理有stm32/51单片机/arduino等驱动代码)
GC9A01-TFT屏幕驱动 & 整理有stm32/51单片机/arduino等驱动代码 前言 关于GC9A01 stm32驱动 引脚接线 代码移植 文件复制 端口修改 显示函数 中文汉字数组 ...
- STM32——stm32 I2C通信代码配置(2)(学习笔记)
STM32--I2C通信配置 I2C的系统框架 1.通讯引脚 2.时钟控制逻辑 3.数据控制逻辑 4.整体控制逻辑 通信过程 写入过程 读取过程 I2C代码配置 I2C的初始化结构体 几个重要的函数 ...
- 传感器:土壤湿度传感器(XH-M214)介绍及stm32驱动代码
土壤湿度传感器(XH-M214)及stm32驱动代码 XH-M214简介 stm32驱动 XH-M214 protues测试 本篇主要介绍:stm32f103 ADC读取电压 采集土壤湿度传感器(XH ...
最新文章
- BZOJ4563[Haoi2016]放棋子
- 电脑设置 win10 文件夹如何设置黑色描边?文件夹图片如何显示缩略图?
- SQLServer转义问题
- 修饰符const精妙之处
- C# 8 新特性 - 静态本地方法
- 组件:slot插槽、组件:组合slot
- Java制作屏幕截图软件(还可以保存到剪切板内)
- android 2.3 webView select控件 无法及时显示optionLabel的BUG
- 【模电】0010 正弦波产生电路(RC正弦波振荡电路)
- ElementUI表格序号翻页后重置的解决办法
- 如何分享带淘宝客的链接到新浪微博
- csapp lab环境搭建及lab1wp
- 取消 “是否把IE8设置为默认浏览器提示 提示
- 【websocket前后端交互】vue-springboot实现websocket前后端交互链接,websocket心跳重连,包含前后端代码,复制即可用【详细解释版本】
- 在本地实现远程登录阿里云服务器的前提条件
- VMware 14安装 CentOS 7
- UI 设计师的盛宴:Web UI 设计资源大系
- Android饼状图
- Do not use empty rulesetscss(emptyRules) html入门篇
- 三百左右蓝牙耳机选哪个?300左右无线蓝牙耳机推荐