BMP280氣壓傳感器(Digital Pressure sensor)
測試流程圖:
項目中使用的是I2C通信,BMP280的作為slave的地址要確認(rèn)好,它的地址根據(jù)硬件電路SDO接什么腳來決定:
1.BMP280的測試啟動流程(注意它的datasheet中的status寄存器):
(1)讀取BMP280的id,其值等于0x58。
(2)把補償寄存器的值都讀出來。
(3)對BMP280進(jìn)行reset。
(4)對BMP280的數(shù)據(jù)采集精度,模式。。。等進(jìn)行配置。
(5)給點延時,等待數(shù)據(jù)采集完畢放入寄存器中。
(6)讀取寄存器中的采集數(shù)據(jù)。
注意:BMP280對溫度和氣壓的測量是通過一堆補償數(shù)據(jù)然后根據(jù)自己的算法算出來的,要注意這些數(shù)據(jù)是什么類型的,剛開始我就因為粗心沒看清楚,算出來的數(shù)據(jù)總是不正確。
下面把代碼貼出來:
1.bmp280的驅(qū)動文件:
#include
#include"stm32f4xx_hal.h"
#include"stm32f4xx_hal_i2c.h"
#include
#definedig_T1bmp280->T1
#definedig_T2bmp280->T2
#definedig_T3bmp280->T3
#definedig_P1bmp280->P1
#definedig_P2bmp280->P2
#definedig_P3bmp280->P3
#definedig_P4bmp280->P4
#definedig_P5bmp280->P5
#definedig_P6bmp280->P6
#definedig_P7bmp280->P7
#definedig_P8bmp280->P8
#definedig_P9bmp280->P9
staticuint8_tbmp280_read_register(I2C_HandleTypeDefBmp280_I2cHandle,uint8_treg_addr)
{
uint8_treg_data;
while(HAL_I2C_Master_Transmit(&Bmp280_I2cHandle,BMP280_ADDRESS,®_addr,1,10000)!=HAL_OK){
if(HAL_I2C_GetError(&Bmp280_I2cHandle)!=HAL_I2C_ERROR_AF){
printf("Transmitslaveaddresserror!!!rn");
return-1;
}
}
while(HAL_I2C_Master_Receive(&Bmp280_I2cHandle,BMP280_ADDRESS,®_data,1,10000)!=HAL_OK){
if(HAL_I2C_GetError(&Bmp280_I2cHandle)!=HAL_I2C_ERROR_AF){
printf("Receiveslavedataerror!!!rn");
return-1;
}
}
returnreg_data;
}
staticvoidbmp280_write_register(I2C_HandleTypeDefBmp280_I2cHandle,uint8_treg_addr,uint8_treg_data)
{
uint8_ttx_data[2]={reg_addr,reg_data};
while(HAL_I2C_Master_Transmit(&Bmp280_I2cHandle,BMP280_ADDRESS,tx_data,2,10000)!=HAL_OK){
if(HAL_I2C_GetError(&Bmp280_I2cHandle)!=HAL_I2C_ERROR_AF){
printf("Transmitslaveaddresserror!!!rn");
}
}
}
/**
*在bmp280_init()函數(shù)里默認(rèn)初始化t_standby為0.5ms,
*溫度和氣壓的采樣精度設(shè)為最低,
*濾波器系數(shù)設(shè)為最低,
*并且進(jìn)入sleepmode。
*/
structbmp280*bmp280_init(I2C_HandleTypeDefI2cHandle)
{
uint8_tbmp280_id;
uint8_tlsb,msb;
uint8_tctrlmeas_reg,config_reg;
structbmp280*bmp280;
bmp280_id=bmp280_read_register(I2cHandle,BMP280_CHIPID_REG);
if(bmp280_id==0x58){
bmp280=malloc(sizeof(structbmp280));
bmp280->I2cHandle=I2cHandle;
bmp280->mode=BMP280_SLEEP_MODE;
bmp280->t_sb=BMP280_T_SB1;
bmp280->p_oversampling=BMP280_P_MODE_1;
bmp280->t_oversampling=BMP280_T_MODE_1;
bmp280->filter_coefficient=BMP280_FILTER_MODE_1;
}else{
printf("ReadBMP280iderror!rn");
returnNULL;
}
/*readthetemperaturecalibrationparameters*/
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_T1_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_T1_MSB_REG);
dig_T1=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_T2_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_T2_MSB_REG);
dig_T2=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_T3_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_T3_MSB_REG);
dig_T3=msb<<8|lsb;
/*readthepressurecalibrationparameters*/
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_P1_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_P1_MSB_REG);
dig_P1=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_P2_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_P2_MSB_REG);
dig_P2=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_P3_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_P3_MSB_REG);
dig_P3=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_P4_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_P4_MSB_REG);
dig_P4=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_P5_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_P5_MSB_REG);
dig_P5=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_P6_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_P6_MSB_REG);
dig_P6=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_P7_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_P7_MSB_REG);
dig_P7=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_P8_LSB_REG);
msb=bmp280_read_register(I2cHandle,BMP280_DIG_P8_MSB_REG);
dig_P8=msb<<8|lsb;
lsb=bmp280_read_register(I2cHandle,BMP280_DIG_P9_LSB_REG);