可以有偿
刚学stm32,用的是HAL库
第一次调试bmp280模块(准确的说是gy91模块上的bmp280模块)
代码有些啰嗦,大大们别介意
id读出来是对的,但是温度和压强两个寄存器的读数总是不变(不是0就是128)
卡了两个周了
下面是代码(没贴main.c)
#include "BMP280.h"
#include <stdio.h>
#include <main.h>
#include "i2c.h"
//定义寄存器地址
#define BMP280_ADDR_READ 0xED
#define BMP280_ADDR_WRITE 0xEC
#define BMP280_ADDR_TEMP 0xfa
#define BMP280_ADDR_PRE 0xF7
#define BMP280_ADDR_CRTL 0xF4
#define BMP280_ADDR_CONFIG 0xF5
#define BMP280_ADDR_ID 0xD0
#define BMP280_ADDR_RE 0xE0
//变量声明
long t_fine;
uint8_t test=0;
uint8_t buffer[6]={0};
uint8_t buffer2[24]={0};
uint8_t t1=0xFF,t2=0x1C,t3=0xB6;
uint16_t dig_T1;
int16_t dig_T2;
int16_t dig_T3;
uint16_t dig_P1;
int16_t dig_P2;
int16_t dig_P3;
int16_t dig_P4;
int16_t dig_P5;
int16_t dig_P6;
int16_t dig_P7;
int16_t dig_P8;
int16_t dig_P9;
//bmp280初始化
void BMP280_Init()
{
HAL_I2C_Mem_Write(&hi2c1,BMP280_ADDR_WRITE,BMP280_ADDR_CRTL,I2C_MEMADD_SIZE_8BIT,&t1,sizeof(uint8_t),1000);
HAL_I2C_Mem_Write(&hi2c1,BMP280_ADDR_WRITE,BMP280_ADDR_CONFIG,I2C_MEMADD_SIZE_8BIT,&t2,sizeof(uint8_t),1000);
}
//读取bmp280ID
void BMP280_TEST()
{
HAL_I2C_Mem_Read(&hi2c1,BMP280_ADDR_WRITE,BMP280_ADDR_ID,I2C_MEMADD_SIZE_8BIT,&test,sizeof(uint8_t),5);
}
//读取补偿值
void BMP280_Data_Get()
{
uint8_t i;
uint8_t h=0x88;
for(i=0;i<24;i++)
{
HAL_I2C_Mem_Read(&hi2c1,BMP280_ADDR_WRITE,h,I2C_MEMADD_SIZE_8BIT,&buffer2[i],sizeof(uint8_t),1000);
h++;
}
short d0=buffer2[0];
short d1=buffer2[1];
short d2=buffer2[2];
short d3=buffer2[3];
short d4=buffer2[4];
short d5=buffer2[5];
short d6=buffer2[6];
short d7=buffer2[7];
short d8=buffer2[8];
short d9=buffer2[9];
short d10=buffer2[10];
short d11=buffer2[11];
short d12=buffer2[12];
short d13=buffer2[13];
short d14=buffer2[14];
short d15=buffer2[15];
short d16=buffer2[16];
short d17=buffer2[17];
short d18=buffer2[18];
short d19=buffer2[19];
short d20=buffer2[20];
short d21=buffer2[21];
short d22=buffer2[22];
short d23=buffer2[23];
dig_T1=((short)buffer2[1]<<8)+d0;
dig_T2=((d3<<8)+d2);
dig_T3=((d5<<8)+d4);
dig_P1=((d7<<8)+d6);
dig_P2=((d9<<8)+d8);
dig_P3=((d11<<8)+d10);
dig_P4=((d13<<8)+d12);
dig_P5=((d15<<8)+d14);
dig_P6=((d17<<8)+d16);
dig_P7=((d19<<8)+d18);
dig_P8=((d21<<8)+d20);
dig_P9=((d23<<8)+d22);
}
//读取温度准确值
long BMP280_GetValue_TEMP()
{
unsigned char t_msb, t_lsb, t_xlsb;
long adc_T;
HAL_I2C_Mem_Read(&hi2c1,BMP280_ADDR_WRITE,BMP280_ADDR_PRE+3,I2C_MEMADD_SIZE_8BIT,&buffer[3],sizeof(uint8_t),1000);
HAL_I2C_Mem_Read(&hi2c1,BMP280_ADDR_WRITE,BMP280_ADDR_PRE+4,I2C_MEMADD_SIZE_8BIT,&buffer[4],sizeof(uint8_t),1000);
HAL_I2C_Mem_Read(&hi2c1,BMP280_ADDR_WRITE,BMP280_ADDR_PRE+5,I2C_MEMADD_SIZE_8BIT,&buffer[5],sizeof(uint8_t),1000);
t_msb=buffer[3],t_lsb=buffer[4],t_xlsb=buffer[5];//关于倒着存储的问题,没搞懂
adc_T=(long)(((unsigned long)t_msb << 12)|((unsigned long)t_lsb << 4)|((unsigned long)t_xlsb >> 4));
//**********************************************************************************************************************************//
long var1, var2, T;
var1 = ((((adc_T>>3) - ((long)dig_T1<<1))) * ((long)dig_T2)) >> 11;
var2 = (((((adc_T>>4) - ((long)dig_T1)) * ((adc_T>>4) - ((long)dig_T1))) >> 12) * ((long)dig_T3)) >> 14;
t_fine=var1+var2;
T = (t_fine * 5 + 128) >> 8;
return T;
}
//读取气压准确值
long BMP280_GetValue_PRE()
{
unsigned char p_msb,p_lsb,p_xlsb;
long adc_P;
HAL_I2C_Mem_Read(&hi2c1,BMP280_ADDR_READ,BMP280_ADDR_PRE,I2C_MEMADD_SIZE_8BIT,&buffer[0],sizeof(uint8_t),0xfff);
HAL_I2C_Mem_Read(&hi2c1,BMP280_ADDR_READ,BMP280_ADDR_PRE+1,I2C_MEMADD_SIZE_8BIT,&buffer[1],sizeof(uint8_t),0xfff);
HAL_I2C_Mem_Read(&hi2c1,BMP280_ADDR_READ,BMP280_ADDR_PRE+2,I2C_MEMADD_SIZE_8BIT,&buffer[2],sizeof(uint8_t),0xfff);
p_msb=buffer[0],p_lsb=buffer[1] ,p_xlsb=buffer[2];//关于倒着存储的问题,没搞懂
adc_P=(long)(((unsigned long)p_msb << 12)|((unsigned long)p_lsb << 4)|((unsigned long)p_xlsb >> 4));
int64_t var1, var2, p;
var1 = ((int64_t)t_fine) - 128000;
var2 = var1 * var1 * (int64_t)dig_P6;
var2 = var2 + ((var1*(int64_t)dig_P5)<<17);
var2 = var2 + (((int64_t)dig_P4)<<35);
var1 = ((var1 * var1 * (int64_t)dig_P3)>>8) + ((var1 * (int64_t)dig_P2)<<12);
var1 = (((((int64_t)1)<<47)+var1))*((int64_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 = (((int64_t)dig_P9) * (p>>13) * (p>>13)) >> 25;
var2 = (((int64_t)dig_P8) * p) >> 19;
p = ((p + var1 + var2) >> 8) + (((int64_t)dig_P7)<<4);
return (uint32_t)p;
}
//重置寄存器
void BMP280_RESET()
{
HAL_I2C_Mem_Write(&hi2c1,BMP280_ADDR_WRITE,BMP280_ADDR_RE,I2C_MEMADD_SIZE_8BIT,&t3,sizeof(uint8_t),0xfff);
}
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。