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,    //¿ÉÒÔ˵0x2
    BMP280_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->P9

uint8_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

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值