BMP280读不出数据(附驱动),数据一直不变解决方法,硬件I2C
1.首先如果你无法确定你与BMP280的通信是否正常,可以调用这两句检查
如果程序卡在这里,说明并没有与BMP280建立链接。
2.可以读取BMP280的ID
3.如果建立链接后,发现程序读数一直为一个数
可以去.h里面修改bmp280的设备地址,0XEC或者0X76,这是在SD0接低电平时的地址
如果接高电平,+1即可
第三条是关键,我用标准库就是0X76 ,HAL库就得是0XEC,不晓得什么原因
#include "BMP280.h"BMP280 _bmp280;
BMP280* bmp280=&_bmp280;uint8_t BMP280_ReadID(void)
{uint8_t data;HAL_I2C_Mem_Read(&hi2c2,BMP280_ADDRESS,BMP280_CHIPID_REG,I2C_MEMADD_SIZE_8BIT,&data,1,0xffff);return data;
}uint8_t BMP280_Read_Byte(uint8_t reg)
{uint8_t data;HAL_I2C_Mem_Read(&hi2c2,BMP280_ADDRESS,reg,I2C_MEMADD_SIZE_8BIT,&data,1,0xffff);return data;
}void BMP280_Write_Byte(uint8_t reg,uint8_t value)
{HAL_I2C_Mem_Write(&hi2c2,BMP280_ADDRESS,reg,I2C_MEMADD_SIZE_8BIT,&value,1,0xffff);
}void Bmp_Init(void)
{uint8_t Lsb,Msb;/********************接下来读出矫正参数*********************///温度传感器的矫正值Lsb = BMP280_Read_Byte(BMP280_DIG_T1_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_T1_MSB_REG);bmp280->T1 = (((uint16_t)Msb)<<8) + Lsb; //高位加低位Lsb = BMP280_Read_Byte(BMP280_DIG_T2_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_T2_MSB_REG);bmp280->T2 = (((uint16_t)Msb)<<8) + Lsb; Lsb = BMP280_Read_Byte(BMP280_DIG_T3_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_T3_MSB_REG);bmp280->T3 = (((uint16_t)Msb)<<8) + Lsb; //大气压传感器的矫正值Lsb = BMP280_Read_Byte(BMP280_DIG_P1_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_P1_MSB_REG);bmp280->P1 = (((uint16_t)Msb)<<8) + Lsb; Lsb = BMP280_Read_Byte(BMP280_DIG_P2_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_P2_MSB_REG);bmp280->P2 = (((uint16_t)Msb)<<8) + Lsb; Lsb = BMP280_Read_Byte(BMP280_DIG_P3_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_P3_MSB_REG);bmp280->P3 = (((uint16_t)Msb)<<8) + Lsb; Lsb = BMP280_Read_Byte(BMP280_DIG_P4_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_P4_MSB_REG);bmp280->P4 = (((uint16_t)Msb)<<8) + Lsb; Lsb = BMP280_Read_Byte(BMP280_DIG_P5_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_P5_MSB_REG);bmp280->P5 = (((uint16_t)Msb)<<8) + Lsb; Lsb = BMP280_Read_Byte(BMP280_DIG_P6_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_P6_MSB_REG);bmp280->P6 = (((uint16_t)Msb)<<8) + Lsb; Lsb = BMP280_Read_Byte(BMP280_DIG_P7_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_P7_MSB_REG);bmp280->P7 = (((uint16_t)Msb)<<8) + Lsb; Lsb = BMP280_Read_Byte(BMP280_DIG_P8_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_P8_MSB_REG);bmp280->P8 = (((uint16_t)Msb)<<8) + Lsb; Lsb = BMP280_Read_Byte(BMP280_DIG_P9_LSB_REG);Msb = BMP280_Read_Byte(BMP280_DIG_P9_MSB_REG);bmp280->P9 = (((uint16_t)Msb)<<8) + Lsb;/******************************************************/BMP280_Write_Byte(BMP280_RESET_REG,BMP280_RESET_VALUE); //往复位寄存器写入给定值BMP_OVERSAMPLE_MODE BMP_OVERSAMPLE_MODEStructure;BMP_OVERSAMPLE_MODEStructure.P_Osample = BMP280_P_MODE_4;BMP_OVERSAMPLE_MODEStructure.T_Osample = BMP280_T_MODE_4;BMP_OVERSAMPLE_MODEStructure.WORKMODE = BMP280_NORMAL_MODE;BMP280_Set_TemOversamp(&BMP_OVERSAMPLE_MODEStructure);BMP_CONFIG BMP_CONFIGStructure;BMP_CONFIGStructure.T_SB = BMP280_T_SB1;BMP_CONFIGStructure.FILTER_COEFFICIENT = BMP280_FILTER_MODE_4;BMP_CONFIGStructure.SPI_EN = DISABLE;BMP280_Set_Standby_FILTER(&BMP_CONFIGStructure);
}//设置BMP过采样因子 MODE
//BMP280_SLEEP_MODE||BMP280_FORCED_MODE||BMP280_NORMAL_MODE
void BMP280_Set_TemOversamp(BMP_OVERSAMPLE_MODE * Oversample_Mode)
{uint8_t Regtmp;Regtmp = ((Oversample_Mode->T_Osample)<<5)|((Oversample_Mode->P_Osample)<<2)|((Oversample_Mode)->WORKMODE);BMP280_Write_Byte(BMP280_CTRLMEAS_REG,Regtmp);
}//设置保持时间和滤波器分频因子
void BMP280_Set_Standby_FILTER(BMP_CONFIG * BMP_Config)
{uint8_t Regtmp;Regtmp = ((BMP_Config->T_SB)<<5)|((BMP_Config->FILTER_COEFFICIENT)<<2)|((BMP_Config->SPI_EN));BMP280_Write_Byte(BMP280_CONFIG_REG,Regtmp);
}//获取BMP当前状态
//status_flag = BMP280_MEASURING ||
// BMP280_IM_UPDATE
uint8_t BMP280_GetStatus(uint8_t status_flag)
{uint8_t flag;flag = BMP280_Read_Byte(BMP280_STATUS_REG);if(flag&status_flag) return SET;else return RESET;
}//大气压值-Pa
uint32_t BMP280_Get_Pressure(void)
{uint8_t temp[3];long signed Bit32;//double pressure;HAL_I2C_Mem_Read(&hi2c2,BMP280_ADDRESS,BMP280_PRESSURE_MSB_REG,I2C_MEMADD_SIZE_8BIT,temp,3,0xffff);Bit32 = ((long)(temp[0] << 12))|((long)(temp[1] << 4))|(temp[2]>>4); //寄存器的值组合起来return Bit32 ;
}/*******************主要部分*********************/
/****************获取传感器精确值****************/
//大气压值-Pa
double BMP280_Get_Pressure_f(void)
{return bmp280_compensate_P_int64(BMP280_Get_Pressure())/256.0;
}//温度值-℃
double BMP280_Get_Temperature(void)
{uint8_t temp[3];long signed Bit32;double temperature;HAL_I2C_Mem_Read(&hi2c2,BMP280_ADDRESS,BMP280_TEMPERATURE_MSB_REG,I2C_MEMADD_SIZE_8BIT,temp,3,0xffff);Bit32 = ((long)(temp[0] << 12))|((long)(temp[1] << 4))|(temp[2]>>4); //寄存器的值组合起来temperature = bmp280_compensate_T_int32(Bit32);return temperature;
}/**************************传感器值转定点值*************************************/BMP280_S32_t t_fine; //用于计算补偿
// Returns temperature in DegC, resolution is 0.01 DegC. Output value of “5123” equals 51.23 DegC.
// t_fine carries fine temperature as global value
BMP280_S32_t bmp280_compensate_T_int32(BMP280_S32_t adc_T)
{BMP280_S32_t var1, var2, T;var1 = ((((adc_T>>3) - ((BMP280_S32_t)dig_T1<<1))) * ((BMP280_S32_t)dig_T2)) >> 11;var2 = (((((adc_T>>4) - ((BMP280_S32_t)dig_T1)) * ((adc_T>>4) - ((BMP280_S32_t)dig_T1))) >> 12) * ((BMP280_S32_t)dig_T3)) >> 14;t_fine = var1 + var2;T = (t_fine * 5 + 128) >> 8;return T;
}// Returns pressure in Pa as unsigned 32 bit integer in Q24.8 format (24 integer bits and 8 fractional bits).
// Output value of “24674867” represents 24674867/256 = 96386.2 Pa = 963.862 hPa
BMP280_U32_t bmp280_compensate_P_int64(BMP280_S32_t adc_P)
{BMP280_S64_t var1, var2, p;var1 = ((BMP280_S64_t)t_fine) - 128000;var2 = var1 * var1 * (BMP280_S64_t)dig_P6;var2 = var2 + ((var1*(BMP280_S64_t)dig_P5)<<17);var2 = var2 + (((BMP280_S64_t)dig_P4)<<35);var1 = ((var1 * var1 * (BMP280_S64_t)dig_P3)>>8) + ((var1 * (BMP280_S64_t)dig_P2)<<12);var1 = (((((BMP280_S64_t)1)<<47)+var1))*((BMP280_S64_t)dig_P1)>>33;if (var1 == 0){return 0; // avoid exception caused by division by zero}p = 1048576-adc_P;p = (((p<<31)-var2)*3125)/var1;var1 = (((BMP280_S64_t)dig_P9) * (p>>13) * (p>>13)) >> 25;var2 = (((BMP280_S64_t)dig_P8) * p) >> 19;p = ((p + var1 + var2) >> 8) + (((BMP280_S64_t)dig_P7)<<4);return (BMP280_U32_t)p;
}
#ifndef __BMP280_H__
#define __BMP280_H__#include "main.h"
#include "i2c.h"#define BMP280_ADDRESS 0xEC //´ÓÉ豸µØÖ·76
#define BMP280_RESET_VALUE 0xB6 //¸´Î»¼Ä´æÆ÷дÈëÖµ#define BMP280_CHIPID_REG 0xD0 /*Chip ID Register */
#define BMP280_RESET_REG 0xE0 /*Softreset Register */
#define BMP280_STATUS_REG 0xF3 /*Status Register */
#define BMP280_CTRLMEAS_REG 0xF4 /*Ctrl Measure Register */
#define BMP280_CONFIG_REG 0xF5 /*Configuration Register */
#define BMP280_PRESSURE_MSB_REG 0xF7 /*Pressure MSB Register */
#define BMP280_PRESSURE_LSB_REG 0xF8 /*Pressure LSB Register */
#define BMP280_PRESSURE_XLSB_REG 0xF9 /*Pressure XLSB Register */
#define BMP280_TEMPERATURE_MSB_REG 0xFA /*Temperature MSB Reg */
#define BMP280_TEMPERATURE_LSB_REG 0xFB /*Temperature LSB Reg */
#define BMP280_TEMPERATURE_XLSB_REG 0xFC /*Temperature XLSB Reg */
//״̬¼Ä´æÆ÷ת»»±êÖ¾
#define BMP280_MEASURING 0x01
#define BMP280_IM_UPDATE 0x08//BMP¹¤×÷ģʽ
typedef enum {BMP280_SLEEP_MODE = 0x0,BMP280_FORCED_MODE = 0x1, //¿ÉÒÔ˵0x2BMP280_NORMAL_MODE = 0x3
} BMP280_WORK_MODE;//BMPѹÁ¦¹ý²ÉÑùÒò×Ó
typedef enum
{BMP280_P_MODE_SKIP = 0x0, /*skipped*/BMP280_P_MODE_1, /*x1*/BMP280_P_MODE_2, /*x2*/BMP280_P_MODE_3, /*x4*/BMP280_P_MODE_4, /*x8*/BMP280_P_MODE_5 /*x16*/
} BMP280_P_OVERSAMPLING; //BMPζȹý²ÉÑùÒò×Ó
typedef enum {BMP280_T_MODE_SKIP = 0x0, /*skipped*/BMP280_T_MODE_1, /*x1*/BMP280_T_MODE_2, /*x2*/BMP280_T_MODE_3, /*x4*/BMP280_T_MODE_4, /*x8*/BMP280_T_MODE_5 /*x16*/
} BMP280_T_OVERSAMPLING;//IIRÂ˲¨Æ÷ʱ¼ä³£Êý
typedef enum {BMP280_FILTER_OFF = 0x0, /*filter off*/BMP280_FILTER_MODE_1, /*0.223*ODR*/ /*x2*/BMP280_FILTER_MODE_2, /*0.092*ODR*/ /*x4*/BMP280_FILTER_MODE_3, /*0.042*ODR*/ /*x8*/BMP280_FILTER_MODE_4 /*0.021*ODR*/ /*x16*/
} BMP280_FILTER_COEFFICIENT;//±£³Öʱ¼ä
typedef enum {BMP280_T_SB1 = 0x0, /*0.5ms*/BMP280_T_SB2, /*62.5ms*/BMP280_T_SB3, /*125ms*/BMP280_T_SB4, /*250ms*/BMP280_T_SB5, /*500ms*/BMP280_T_SB6, /*1000ms*/BMP280_T_SB7, /*2000ms*/BMP280_T_SB8, /*4000ms*/
} BMP280_T_SB;typedef struct
{/* T1~P9 Ϊ²¹³¥ÏµÊý */uint16_t T1;int16_t T2;int16_t T3;uint16_t P1;int16_t P2;int16_t P3;int16_t P4;int16_t P5;int16_t P6;int16_t P7;int16_t P8;int16_t P9;
} BMP280;typedef struct
{BMP280_P_OVERSAMPLING P_Osample;BMP280_T_OVERSAMPLING T_Osample;BMP280_WORK_MODE WORKMODE;
} BMP_OVERSAMPLE_MODE;typedef struct
{BMP280_T_SB T_SB;BMP280_FILTER_COEFFICIENT FILTER_COEFFICIENT;FunctionalState SPI_EN;
} BMP_CONFIG;/*calibration parameters */
#define BMP280_DIG_T1_LSB_REG 0x88
#define BMP280_DIG_T1_MSB_REG 0x89
#define BMP280_DIG_T2_LSB_REG 0x8A
#define BMP280_DIG_T2_MSB_REG 0x8B
#define BMP280_DIG_T3_LSB_REG 0x8C
#define BMP280_DIG_T3_MSB_REG 0x8D
#define BMP280_DIG_P1_LSB_REG 0x8E
#define BMP280_DIG_P1_MSB_REG 0x8F
#define BMP280_DIG_P2_LSB_REG 0x90
#define BMP280_DIG_P2_MSB_REG 0x91
#define BMP280_DIG_P3_LSB_REG 0x92
#define BMP280_DIG_P3_MSB_REG 0x93
#define BMP280_DIG_P4_LSB_REG 0x94
#define BMP280_DIG_P4_MSB_REG 0x95
#define BMP280_DIG_P5_LSB_REG 0x96
#define BMP280_DIG_P5_MSB_REG 0x97
#define BMP280_DIG_P6_LSB_REG 0x98
#define BMP280_DIG_P6_MSB_REG 0x99
#define BMP280_DIG_P7_LSB_REG 0x9A
#define BMP280_DIG_P7_MSB_REG 0x9B
#define BMP280_DIG_P8_LSB_REG 0x9C
#define BMP280_DIG_P8_MSB_REG 0x9D
#define BMP280_DIG_P9_LSB_REG 0x9E
#define BMP280_DIG_P9_MSB_REG 0x9F/*******************************ÏÂÃæÊÇÓÃÀ´¼ÆËã²¹³¥ÖµÏà¹Ø**********************************/
typedef int32_t BMP280_S32_t; //ÓзûºÅ 64λ£¡
typedef uint32_t BMP280_U32_t; //ÎÞ·ûºÅ 32λ£¡
typedef int64_t BMP280_S64_t;#define dig_T1 bmp280->T1
#define dig_T2 bmp280->T2
#define dig_T3 bmp280->T3 #define dig_P1 bmp280->P1
#define dig_P2 bmp280->P2
#define dig_P3 bmp280->P3
#define dig_P4 bmp280->P4
#define dig_P5 bmp280->P5
#define dig_P6 bmp280->P6
#define dig_P7 bmp280->P7
#define dig_P8 bmp280->P8
#define dig_P9 bmp280->P9uint8_t BMP280_ReadID(void);
uint8_t BMP280_Read_Byte(uint8_t reg);
void BMP280_Write_Byte(uint8_t reg,uint8_t value);
void Bmp_Init(void);
void BMP280_Set_TemOversamp(BMP_OVERSAMPLE_MODE * Oversample_Mode);
void BMP280_Set_Standby_FILTER(BMP_CONFIG * BMP_Config);
uint8_t BMP280_GetStatus(uint8_t status_flag);
uint32_t BMP280_Get_Pressure(void);
double BMP280_Get_Pressure_f(void);
double BMP280_Get_Temperature(void);
BMP280_S32_t bmp280_compensate_T_int32(BMP280_S32_t adc_T);
BMP280_U32_t bmp280_compensate_P_int64(BMP280_S32_t adc_P);#endif
BMP280读不出数据(附驱动),数据一直不变解决方法,硬件I2C相关推荐
- EOP驱动安装教程附驱动安装失败详细解决方法
1. 插上EOP,然后打开设备管理器显示有两个设备驱动没有安装好,这就是EOP 2. 下载EOP驱动程序并复制驱动路径 3. 右键驱动更新驱动程序,浏览我的计算机以查找驱动程序软件 4. 将刚 ...
- mysql+concat函数问题_Mysql5.7中使用group concat函数数据被截断的问题完美解决方法...
前天在生产环境中遇到一个问题:使用 GROUP_CONCAT函数select出来的数据被截断了,最长长度不超过1024字节,开始还以为是navicat客户端自身对字段长度做了限制的问题.后面故意重新I ...
- Java中double类型精度丢失的问题_double类型数据加减操作精度丢失解决方法_BigDecimal取整
BigDecimal在用double做入参的时候,二进制无法精确地表示十进制小数,编译器读到字符串"0.0000002"和"1.0000002"之后,必须把它转 ...
- opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类
opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类 参考文章: (1)opengl中的Floatbuffer和 ...
- hive导出数据到本地文件报错解决方法
hive导出数据到本地文件报错解决方法 参考文章: (1)hive导出数据到本地文件报错解决方法 (2)https://www.cnblogs.com/yaopeiyun/p/12232251.htm ...
- $.ajax返回的JSON格式的数据后无法执行success的解决方法
$.ajax返回的JSON格式的数据后无法执行success的解决方法 参考文章: (1)$.ajax返回的JSON格式的数据后无法执行success的解决方法 (2)https://www.cnbl ...
- c# mysql timeout expired_C#百万数据查询出现超时问题的解决方法
本文较为详细的讲解了C#百万数据查询出现超时问题的解决方法,分享给大家供大家参考之用.具体方法如下: 很多时候我们用C#从百万数据中筛选一些信息时,经常会出现程序连接超时的错误,常见的错误有很多,例如 ...
- Excel合并数据查找函数VLOOKUP()一直显示最后一行数据或者一直报错的解决方法
Excel合并数据查找函数VLOOKUP()一直显示最后一行数据或者一直报错的解决方法 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地 ...
- Python:爬取数据出现response.status_code为403解决方法
目录 前言 1. 原理 2. 代码 前言 出现403的返回结果 主要是有些服务器为了防止访问量过大,承受服务器的压力,或者是拒绝你的访问.服务器接收到这个信息,理应返回了这个403的信息 在前一块的代 ...
最新文章
- 无参数实例化Configuration对象以及addResource无法加载core-site.xml中的内容
- 北京20-35万Sharepoint Senior Consultant
- Linux MySQL Connector/C++ 编程实例
- PyCharm 安装详细图片(linux)版
- c 最大子序列和_最大子序列和暴力法、分治+递归法、妙法
- oracle10g数据库复制,oracle -10g 中Duplicate 复制数据库
- matlab自带同步电机数学模型,永磁同步电机的数学模型及方程
- 计算机科学中抽象的作用,抽象释义
- 读书笔记_打开量化投资的黑箱04
- AngularJS自定义指令教程第2部分
- 论文笔记:NAOMI: Non-Autoregressive MultiresolutionSequence Imputation
- 办理营业执照注册要什么费用
- PCB设计走线细节讲解(图文结合|强力推荐)
- virtualbox 虚拟机 win7 激活后开机黑屏,只有横杠
- 中国联通MEC边缘云架构与部署实践
- EM2040D和SES2000采集图像判读(一)
- Linux中防火墙firewalld
- 【20210827】【系统设计】“秒杀系统”架构设计分析
- Linux压缩备份相关命令
- 架设虚拟环境下的传真服务器