历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2018年04月22日 | STM32通过I2C与BMP280通信

2018-04-22 来源:eefocus

BMP280气压传感器(Digital Pressure sensor)


测试流程图:




项目中使用的是I2C通信,BMP280的作为slave的地址要确认好,它的地址根据硬件电路SDO接什么脚来决定:


1.BMP280的测试启动流程(注意它的datasheet中的status寄存器):
(1)读取BMP280的id,其值等于0x58。
(2)把补偿寄存器的值都读出来。
(3)对BMP280进行reset。
(4)对BMP280的数据采集精度,模式。。。等进行配置。
(5)给点延时,等待数据采集完毕放入寄存器中。
(6)读取寄存器中的采集数据。
注意:BMP280对温度和气压的测量是通过一堆补偿数据然后根据自己的算法算出来的,要注意这些数据是什么类型的,刚开始我就因为粗心没看清楚,算出来的数据总是不正确。


下面把代码贴出来:
1.bmp?imageView2/2/w/550280的驱动文件:


  1. #include   

  2. #include "stm32f4xx_hal.h"  

  3. #include "stm32f4xx_hal_i2c.h"  

  4. #include   

  5.   

  6. #define dig_T1 bmp280->T1  

  7. #define dig_T2 bmp280->T2  

  8. #define dig_T3 bmp280->T3  

  9. #define dig_P1 bmp280->P1  

  10. #define dig_P2 bmp280->P2  

  11. #define dig_P3 bmp280->P3  

  12. #define dig_P4 bmp280->P4  

  13. #define dig_P5 bmp280->P5  

  14. #define dig_P6 bmp280->P6  

  15. #define dig_P7 bmp280->P7  

  16. #define dig_P8 bmp280->P8  

  17. #define dig_P9 bmp280->P9  

  18.   

  19. static uint8_t bmp280_read_register(I2C_HandleTypeDef Bmp280_I2cHandle, uint8_t reg_addr)  

  20. {  

  21.     uint8_t reg_data;  

  22.   

  23.     while(HAL_I2C_Master_Transmit(&Bmp280_I2cHandle, BMP280_ADDRESS, ®_addr, 1, 10000) != HAL_OK) {  

  24.         if(HAL_I2C_GetError(&Bmp280_I2cHandle) != HAL_I2C_ERROR_AF) {  

  25.             printf("Transmit slave address error!!!\r\n");  

  26.             return -1;  

  27.         }  

  28.     }  

  29.   

  30.     while(HAL_I2C_Master_Receive(&Bmp280_I2cHandle, BMP280_ADDRESS, ®_data, 1, 10000) != HAL_OK) {  

  31.         if(HAL_I2C_GetError(&Bmp280_I2cHandle) != HAL_I2C_ERROR_AF) {  

  32.             printf("Receive slave data error!!!\r\n");  

  33.             return -1;  

  34.         }  

  35.     }  

  36.   

  37.     return reg_data;  

  38. }  

  39.   

  40. static void bmp280_write_register(I2C_HandleTypeDef Bmp280_I2cHandle, uint8_t reg_addr, uint8_t reg_data)  

  41. {  

  42.     uint8_t tx_data[2] = {reg_addr, reg_data};  

  43.   

  44.     while(HAL_I2C_Master_Transmit(&Bmp280_I2cHandle, BMP280_ADDRESS, tx_data, 2, 10000) != HAL_OK) {  

  45.         if(HAL_I2C_GetError(&Bmp280_I2cHandle) != HAL_I2C_ERROR_AF) {  

  46.             printf("Transmit slave address error!!!\r\n");  

  47.         }  

  48.     }  

  49. }  

  50.   

  51. /** 

  52.  * 在bmp280_init()函数里默认初始化t_standby为0.5ms, 

  53.  * 温度和气压的采样精度设为最低, 

  54.  * 滤波器系数设为最低, 

  55.  * 并且进入sleep mode。 

  56.  */  

  57. struct bmp280 *bmp280_init(I2C_HandleTypeDef I2cHandle)  

  58. {  

  59.     uint8_t bmp280_id;  

  60.     uint8_t lsb, msb;  

  61.     uint8_t ctrlmeas_reg, config_reg;  

  62.     struct bmp280 *bmp280;  

  63.   

  64.     bmp280_id = bmp280_read_register(I2cHandle, BMP280_CHIPID_REG);  

  65.     if(bmp280_id == 0x58) {  

  66.         bmp280 = malloc(sizeof(struct bmp280));  

  67.   

  68.         bmp280->I2cHandle = I2cHandle;  

  69.         bmp280->mode = BMP280_SLEEP_MODE;  

  70.         bmp280->t_sb = BMP280_T_SB1;  

  71.         bmp280->p_oversampling = BMP280_P_MODE_1;  

  72.         bmp280->t_oversampling = BMP280_T_MODE_1;  

  73.         bmp280->filter_coefficient = BMP280_FILTER_MODE_1;  

  74.     } else {  

  75.         printf("Read BMP280 id error!\r\n");  

  76.         return NULL;  

  77.     }  

  78.   

  79.     /* read the temperature calibration parameters */  

  80.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_T1_LSB_REG);  

  81.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_T1_MSB_REG);  

  82.     dig_T1 = msb << 8 | lsb;  

  83.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_T2_LSB_REG);  

  84.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_T2_MSB_REG);  

  85.     dig_T2 = msb << 8 | lsb;  

  86.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_T3_LSB_REG);  

  87.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_T3_MSB_REG);  

  88.     dig_T3 = msb << 8 | lsb;  

  89.   

  90.     /* read the pressure calibration parameters */  

  91.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_P1_LSB_REG);  

  92.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_P1_MSB_REG);  

  93.     dig_P1 = msb << 8 | lsb;  

  94.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_P2_LSB_REG);  

  95.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_P2_MSB_REG);  

  96.     dig_P2 = msb << 8 | lsb;  

  97.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_P3_LSB_REG);  

  98.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_P3_MSB_REG);  

  99.     dig_P3 = msb << 8 | lsb;  

  100.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_P4_LSB_REG);  

  101.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_P4_MSB_REG);  

  102.     dig_P4 = msb << 8 | lsb;  

  103.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_P5_LSB_REG);  

  104.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_P5_MSB_REG);  

  105.     dig_P5 = msb << 8 | lsb;  

  106.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_P6_LSB_REG);  

  107.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_P6_MSB_REG);  

  108.     dig_P6 = msb << 8 | lsb;  

  109.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_P7_LSB_REG);  

  110.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_P7_MSB_REG);  

  111.     dig_P7 = msb << 8 | lsb;  

  112.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_P8_LSB_REG);  

  113.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_P8_MSB_REG);  

  114.     dig_P8 = msb << 8 | lsb;  

  115.     lsb = bmp280_read_register(I2cHandle, BMP280_DIG_P9_LSB_REG);  

  116.     msb = bmp280_read_register(I2cHandle, BMP280_DIG_P9_MSB_REG);  

  117.     dig_P9 = msb << 8 | lsb;  

  118.   

  119.     bmp280_reset(bmp280);  

  120.   

  121.     ctrlmeas_reg = bmp280->t_oversampling << 5 | bmp280->p_oversampling << 2 | bmp280->mode;  

  122.     config_reg = bmp280->t_sb << 5 | bmp280->filter_coefficient << 2;  

  123.   

  124.     bmp280_write_register(I2cHandle, BMP280_CTRLMEAS_REG, ctrlmeas_reg);  

  125.     bmp280_write_register(I2cHandle, BMP280_CONFIG_REG, config_reg);  

  126.   

  127.     HAL_Delay(100);  

  128.   

  129.     return bmp280;  

  130. }  

  131.   

  132. void bmp280_reset(struct bmp280 *bmp280)  

  133. {  

  134.     bmp280_write_register(bmp280->I2cHandle, BMP280_RESET_REG, BMP280_RESET_VALUE);  

  135. }  

  136.   

  137. void bmp280_set_standby_time(struct bmp280 *bmp280, BMP280_T_SB t_standby)  

  138. {  

  139.     uint8_t config_reg;  

  140.   

  141.     bmp280->t_sb = t_standby;  

  142.     config_reg = bmp280->t_sb << 5 | bmp280->filter_coefficient << 2;  

  143.   

  144.     bmp280_write_register(bmp280->I2cHandle, BMP280_CONFIG_REG, config_reg);  

  145. }  

  146.   

  147. void bmp280_set_work_mode(struct bmp280 *bmp280, BMP280_WORK_MODE mode)  

  148. {  

  149.     uint8_t ctrlmeas_reg;  

  150.   

  151.     bmp280->mode = mode;  

  152.     ctrlmeas_reg = bmp280->t_oversampling << 5 | bmp280->p_oversampling << 2 | bmp280->mode;  

  153.   

  154.     bmp280_write_register(bmp280->I2cHandle, BMP280_CTRLMEAS_REG, ctrlmeas_reg);  

  155. }  

  156.   

  157. void bmp280_set_temperature_oversampling_mode(struct bmp280 *bmp280, BMP280_T_OVERSAMPLING t_osl)  

  158. {  

  159.     uint8_t ctrlmeas_reg;  

  160.   

  161.     bmp280->t_oversampling = t_osl;  

  162.     ctrlmeas_reg = bmp280->t_oversampling << 5 | bmp280->p_oversampling << 2 | bmp280->mode;  

  163.   

  164.     bmp280_write_register(bmp280->I2cHandle, BMP280_CTRLMEAS_REG, ctrlmeas_reg);  

  165. }  

  166.   

  167. void bmp280_set_pressure_oversampling_mode(struct bmp280 *bmp280, BMP280_P_OVERSAMPLING p_osl)  

  168. {  

  169.     uint8_t ctrlmeas_reg;  

  170.   

  171.     bmp280->t_oversampling = p_osl;  

  172.     ctrlmeas_reg = bmp280->t_oversampling << 5 | bmp280->p_oversampling << 2 | bmp280->mode;  

  173.   

  174.     bmp280_write_register(bmp280->I2cHandle, BMP280_CTRLMEAS_REG, ctrlmeas_reg);  

  175. }  

  176.   

  177. void bmp280_set_filter_mode(struct bmp280 *bmp280, BMP280_FILTER_COEFFICIENT f_coefficient)  

  178. {  

  179.     uint8_t config_reg;  

  180.   

  181.     bmp280->filter_coefficient = f_coefficient;  

  182.     config_reg = bmp280->t_sb << 5 | bmp280->filter_coefficient << 2;  

  183.   

  184.     bmp280_write_register(bmp280->I2cHandle, BMP280_CONFIG_REG, config_reg);  

  185. }  

  186.   

  187. /* Returns temperature in DegC, double precision. Output value of “51.23” equals 51.23 DegC. */  

  188. static double bmp280_compensate_temperature_double(struct bmp280 *bmp280, int32_t adc_T)  

  189. {  

  190.     double var1, var2, temperature;  

  191.   

  192.     var1 = (((double) adc_T) / 16384.0 - ((double) dig_T1) / 1024.0)  

  193.             * ((double) dig_T2);  

  194.     var2 = ((((double) adc_T) / 131072.0 - ((double) dig_T1) / 8192.0)  

  195.             * (((double) adc_T) / 131072.0 - ((double) dig_T1) / 8192.0))  

  196.             * ((double) dig_T3);  

  197.     bmp280->t_fine = (int32_t) (var1 + var2);  

  198.     temperature = (var1 + var2) / 5120.0;  

  199.   

  200.     return temperature;  

  201. }  

  202.   

  203.   

  204. /* Returns pressure in Pa as double. Output value of “96386.2” equals 96386.2 Pa = 963.862 hPa */  

  205. static double bmp280_compensate_pressure_double(struct bmp280 *bmp280, int32_t adc_P)  

  206. {  

  207.     double var1, var2, pressure;  

  208.   

  209.     var1 = ((double) bmp280->t_fine / 2.0) - 64000.0;  

  210.     var2 = var1 * var1 * ((double) dig_P6) / 32768.0;  

  211.     var2 = var2 + var1 * ((double) dig_P5) * 2.0;  

  212.     var2 = (var2 / 4.0) + (((double) dig_P4) * 65536.0);  

  213.     var1 = (((double) dig_P3) * var1 * var1 / 524288.0  

  214.             + ((double) dig_P2) * var1) / 524288.0;  

  215.     var1 = (1.0 + var1 / 32768.0) * ((double) dig_P1);  

  216.   

  217.     if (var1 == 0.0) {  

  218.         return 0; // avoid exception caused by division by zero  

  219.     }  

  220.   

  221.     pressure = 1048576.0 - (double) adc_P;  

  222.     pressure = (pressure - (var2 / 4096.0)) * 6250.0 / var1;  

  223.     var1 = ((double) dig_P9) * pressure * pressure / 2147483648.0;  

  224.     var2 = pressure * ((double) dig_P8) / 32768.0;  

  225.     pressure = pressure + (var1 + var2 + ((double) dig_P7)) / 16.0;  

  226.   

  227.     return pressure;  

  228. }  

  229.   

  230. #if 0  

  231. static int32_t bmp280_compensate_temperature_int32(struct bmp280 *bmp280, int32_t adc_T)  

  232. {  

  233.     int32_t var1, var2, temperature;  

  234.   

  235.     var1 = ((((adc_T>>3) - ((int32_t)dig_T1<<1))) * ((int32_t)dig_T2)) >> 11;  

  236.     var2 = (((((adc_T>>4) - ((int32_t)dig_T1)) * ((adc_T>>4) - ((int32_t)dig_T1))) >> 12) * ((int32_t)dig_T3)) >> 14;  

  237.     bmp280->t_fine = var1 + var2;  

  238.     temperature = (bmp280->t_fine * 5 + 128) >> 8;  

  239.   

  240.     return temperature;  

  241. }  

  242.   

  243. static uint32_t bmp280_compensate_pressure_int64(struct bmp280 *bmp280, int32_t adc_P)  

  244. {  

  245.     int64_t var1, var2, pressure;  

  246.   

  247.     var1 = ((int64_t)bmp280->t_fine) - 128000;  

  248.     var2 = var1 * var1 * (int64_t)dig_P6;  

  249.     var2 = var2 + ((var1*(int64_t)dig_P5)<<17);  

  250.     var2 = var2 + (((int64_t)dig_P4)<<35);  

  251.     var1 = ((var1 * var1 * (int64_t)dig_P3)>>8) + ((var1 * (int64_t)dig_P2)<<12);  

  252.     var1 = (((((int64_t)1)<<47)+var1))*((int64_t)dig_P1)>>33;  

  253.     if (var1 == 0)  

  254.     {  

  255.         return 0; // avoid exception caused by division by zero  

  256.     }  

  257.   

  258.     pressure = 1048576-adc_P;  

  259.     pressure = (((pressure<<31)-var2)*3125)/var1;  

  260.     var1 = (((int64_t)dig_P9) * (pressure>>13) * (pressure>>13)) >> 25;  

  261.     var2 = (((int64_t)dig_P8) * pressure) >> 19;  

  262.     pressure = ((pressure + var1 + var2) >> 8) + (((int64_t)dig_P7)<<4);  

  263.   

  264.     return (uint32_t)pressure;  

  265. }  

  266. #endif  

  267.   

  268. /* Returns temperature in DegC, double precision. Output value of “51.23” equals 51.23 DegC. */  

  269. double bmp280_get_temperature(struct bmp280 *bmp280)  

  270. {  

  271.     uint8_t lsb, msb, xlsb;  

  272.     int32_t adc_T;  

  273.     double temperature;  

  274.   

  275.     xlsb = bmp280_read_register(bmp280->I2cHandle, BMP280_TEMPERATURE_XLSB_REG);  

  276.     lsb = bmp280_read_register(bmp280->I2cHandle, BMP280_TEMPERATURE_LSB_REG);  

  277.     msb = bmp280_read_register(bmp280->I2cHandle, BMP280_TEMPERATURE_MSB_REG);  

  278.   

  279.     adc_T = (msb << 12) | (lsb << 4) | (xlsb >> 4);  

  280.     temperature = bmp280_compensate_temperature_double(bmp280, adc_T);  

  281.   

  282.     return temperature;  

  283. }  

  284.   

  285. /* Returns pressure in Pa as double. Output value of “96386.2” equals 96386.2 Pa = 963.862 hPa */  

  286. double bmp280_get_pressure(struct bmp280 *bmp280)  

  287. {  

  288.     uint8_t lsb, msb, xlsb;  

  289.     int32_t adc_P;  

  290.     double pressure;  

  291.   

  292.   

  293.     xlsb = bmp280_read_register(bmp280->I2cHandle, BMP280_PRESSURE_XLSB_REG);  

  294.     lsb = bmp280_read_register(bmp280->I2cHandle, BMP280_PRESSURE_LSB_REG);  

  295.     msb = bmp280_read_register(bmp280->I2cHandle, BMP280_PRESSURE_MSB_REG);  

  296.   

  297.     adc_P = (msb << 12) | (lsb << 4) | (xlsb >> 4);  

  298.     pressure = bmp280_compensate_pressure_double(bmp280, adc_P);  

  299.   

  300.     return pressure;  

  301. }  

  302.   

  303. /** 

  304.  * 仅在BMP280被设置为normal mode后, 

  305.  * 可使用该接口直接读取温度和气压。 

  306.  */  

  307. void bmp280_get_temperature_and_pressure(struct bmp280 *bmp280, doubledouble *temperature, doubledouble *pressure)  

  308. {  

  309.     *temperature = bmp280_get_temperature(bmp280);  

  310.     *pressure = bmp280_get_pressure(bmp280);  

  311. }  

  312.   

  313. /** 

  314.  * 当BMP280被设置为forced mode后, 

  315.  * 可使用该接口直接读取温度和气压。 

  316.  */  

  317. void bmp280_forced_mode_get_temperature_and_pressure(struct bmp280 *bmp280, doubledouble *temperature, doubledouble *pressure)  

  318. {  

  319.     bmp280_set_work_mode(bmp280, BMP280_FORCED_MODE);  

  320.   

  321.     HAL_Delay(100);  

  322.   

  323.     bmp280_get_temperature_and_pressure(bmp280, temperature, pressure);  

  324. }  

  325.   

  326. /** 

  327.  * 此demo使用forced mode以1s为周期, 

  328.  * 对温度和气压进行数据采集并打印。 

  329.  */  

  330. void bmp280_demo(I2C_HandleTypeDef I2cHandle, doubledouble *temperature, doubledouble *pressure)  

  331. {  

  332.     struct bmp280 *bmp280;  

  333.     bmp280 = bmp280_init(I2cHandle);  

  334.   

  335.     if(bmp280 != NULL) {  

  336.         while(1) {  

  337.             bmp280_forced_mode_get_temperature_and_pressure(bmp280, temperature, pressure);  

  338.             printf("temperature=%ld   pressure=%ld\r\n", (int32_t)*temperature, (uint32_t)*pressure);  

  339.   

  340.             HAL_Delay(1000);  

  341.         }  

  342.     } else  

  343.         printf("create bmp280 error!\r\n");  

  344. }  


2.头文件:


  1. #ifndef __BMP280_H__  

  2. #define __BMP280_H__  

  3.   

  4. #define BMP280_ADDRESS 0xEC  

  5.   

  6. #define BMP280_RESET_VALUE 0xB6  

  7.   

  8. /*calibration parameters */  

  9. #define BMP280_DIG_T1_LSB_REG                0x88  

  10. #define BMP280_DIG_T1_MSB_REG                0x89  

  11. #define BMP280_DIG_T2_LSB_REG                0x8A  

  12. #define BMP280_DIG_T2_MSB_REG                0x8B  

  13. #define BMP280_DIG_T3_LSB_REG                0x8C  

  14. #define BMP280_DIG_T3_MSB_REG                0x8D  

  15. #define BMP280_DIG_P1_LSB_REG                0x8E  

  16. #define BMP280_DIG_P1_MSB_REG                0x8F  

  17. #define BMP280_DIG_P2_LSB_REG                0x90  

  18. #define BMP280_DIG_P2_MSB_REG                0x91  

  19. #define BMP280_DIG_P3_LSB_REG                0x92  

  20. #define BMP280_DIG_P3_MSB_REG                0x93  

  21. #define BMP280_DIG_P4_LSB_REG                0x94  

  22. #define BMP280_DIG_P4_MSB_REG                0x95  

  23. #define BMP280_DIG_P5_LSB_REG                0x96  

  24. #define BMP280_DIG_P5_MSB_REG                0x97  

  25. #define BMP280_DIG_P6_LSB_REG                0x98  

  26. #define BMP280_DIG_P6_MSB_REG                0x99  

  27. #define BMP280_DIG_P7_LSB_REG                0x9A  

  28. #define BMP280_DIG_P7_MSB_REG                0x9B  

  29. #define BMP280_DIG_P8_LSB_REG                0x9C  

  30. #define BMP280_DIG_P8_MSB_REG                0x9D  

  31. #define BMP280_DIG_P9_LSB_REG                0x9E  

  32. #define BMP280_DIG_P9_MSB_REG                0x9F  

  33.   

  34. #define BMP280_CHIPID_REG                    0xD0  /*Chip ID Register */  

  35. #define BMP280_RESET_REG                     0xE0  /*Softreset Register */  

  36. #define BMP280_STATUS_REG                    0xF3  /*Status Register */  

  37. #define BMP280_CTRLMEAS_REG                  0xF4  /*Ctrl Measure Register */  

  38. #define BMP280_CONFIG_REG                    0xF5  /*Configuration Register */  

  39. #define BMP280_PRESSURE_MSB_REG              0xF7  /*Pressure MSB Register */  

  40. #define BMP280_PRESSURE_LSB_REG              0xF8  /*Pressure LSB Register */  

  41. #define BMP280_PRESSURE_XLSB_REG             0xF9  /*Pressure XLSB Register */  

  42. #define BMP280_TEMPERATURE_MSB_REG           0xFA  /*Temperature MSB Reg */  

  43. #define BMP280_TEMPERATURE_LSB_REG           0xFB  /*Temperature LSB Reg */  

  44. #define BMP280_TEMPERATURE_XLSB_REG          0xFC  /*Temperature XLSB Reg */  

  45.   

  46. /* 在foreced mode下,1s的采样周期,温度和气压使用最低的精度采集并且使用最小的滤波器系数, 

  47.  * 数据的采集时间大概在6ms,平均功率为3.27uA。 

  48.  * */  

  49.   

  50. /* 在foreced mode下,1s的采样周期, 温度和气压使用最高的精度采集并且使用最大的滤波器系数, 

  51.  * 数据的采集时间大概在70ms,平均功率为30uA。 

  52.  * */  

  53.   

  54. typedef enum {  

  55.     BMP280_T_MODE_SKIP = 0x0,   /*skipped*/  

  56.     BMP280_T_MODE_1,            /*x1*/  

  57.     BMP280_T_MODE_2,            /*x2*/  

  58.     BMP280_T_MODE_3,            /*x4*/  

  59.     BMP280_T_MODE_4,            /*x8*/  

  60.     BMP280_T_MODE_5             /*x16*/  

  61. } BMP280_T_OVERSAMPLING;  

  62.   

  63. typedef enum {  

  64.     BMP280_SLEEP_MODE = 0x0,  

  65.     BMP280_FORCED_MODE,  

  66.     BMP280_NORMAL_MODE  

  67. } BMP280_WORK_MODE;  

  68.   

  69. typedef enum {  

  70.     BMP280_P_MODE_SKIP = 0x0,   /*skipped*/  

  71.     BMP280_P_MODE_1,            /*x1*/  

  72.     BMP280_P_MODE_2,            /*x2*/  

  73.     BMP280_P_MODE_3,            /*x4*/  

  74.     BMP280_P_MODE_4,            /*x8*/  

  75.     BMP280_P_MODE_5             /*x16*/  

  76. } BMP280_P_OVERSAMPLING;  

  77.   

  78. typedef enum {  

  79.     BMP280_FILTER_OFF = 0x0,    /*filter off*/  

  80.     BMP280_FILTER_MODE_1,       /*0.223*ODR*/  

  81.     BMP280_FILTER_MODE_2,       /*0.092*ODR*/  

  82.     BMP280_FILTER_MODE_3,       /*0.042*ODR*/  

  83.     BMP280_FILTER_MODE_4        /*0.021*ODR*/  

  84. } BMP280_FILTER_COEFFICIENT;  

  85.   

  86. typedef enum {  

  87.     BMP280_T_SB1 = 0x0,     /*0.5ms*/  

  88.     BMP280_T_SB2,           /*62.5ms*/  

  89.     BMP280_T_SB3,           /*125ms*/  

  90.     BMP280_T_SB4,           /*250ms*/  

  91.     BMP280_T_SB5,           /*500ms*/  

  92.     BMP280_T_SB6,           /*1000ms*/  

  93.     BMP280_T_SB7,           /*2000ms*/  

  94.     BMP280_T_SB8,           /*4000ms*/  

  95. } BMP280_T_SB;  

  96.   

  97. struct bmp280 {  

  98.     I2C_HandleTypeDef I2cHandle;  

  99.     /* T1~P9 为补偿系数 */  

  100.     uint16_t T1;  

  101.     int16_t T2;  

  102.     int16_t T3;  

  103.     uint16_t P1;  

  104.     int16_t P2;  

  105.     int16_t P3;  

  106.     int16_t P4;  

  107.     int16_t P5;  

  108.     int16_t P6;  

  109.     int16_t P7;  

  110.     int16_t P8;  

  111.     int16_t P9;  

  112.     int32_t t_fine;  

  113.     uint8_t t_sb;  

  114.     uint8_t mode;  

  115.     uint8_t t_oversampling;  

  116.     uint8_t p_oversampling;  

  117.     uint8_t filter_coefficient;  

  118. };  

  119.   

  120. extern struct bmp280 *bmp280_init(I2C_HandleTypeDef I2cHandle);  

  121.   

  122. extern void bmp280_reset(struct bmp280 *bmp280);  

  123.   

  124. extern void bmp280_set_standby_time(struct bmp280 *bmp280, BMP280_T_SB t_standby);  

  125.   

  126. extern void bmp280_set_work_mode(struct bmp280 *bmp280, BMP280_WORK_MODE mode);  

  127.   

  128. extern void bmp280_set_temperature_oversampling_mode(struct bmp280 *bmp280, BMP280_T_OVERSAMPLING t_osl);  

  129.   

  130. extern void bmp280_set_pressure_oversampling_mode(struct bmp280 *bmp280, BMP280_P_OVERSAMPLING p_osl);  

  131.   

  132. extern void bmp280_set_filter_mode(struct bmp280 *bmp280, BMP280_FILTER_COEFFICIENT f_coefficient);  

  133.   

  134. extern double bmp280_get_temperature(struct bmp280 *bmp280);  

  135.   

  136. extern double bmp280_get_pressure(struct bmp280 *bmp280);  

  137.   

  138. extern void bmp280_get_temperature_and_pressure(struct bmp280 *bmp280, doubledouble *temperature, doubledouble *pressure);  

  139.   

  140. extern void bmp280_forced_mode_get_temperature_and_pressure(struct bmp280 *bmp280, doubledouble *temperature, doubledouble *pressure);  

  141.   

  142. extern void bmp280_demo(I2C_HandleTypeDef I2cHandle, doubledouble *temperature, doubledouble *pressure);  

  143.   

  144. #endif  




3.主函数相关代码:

[objc] view plain copy

  1.     uint8_t bmp280_id = 0;  

  2.     uint8_t ctr_reg = 0;  

  3.     uint8_t status_reg = 0;  

  4.   

  5.     int32_t tem = 0;  

  6.     uint32_t pressure = 0;  

  7.   

  8.     bmp280_id = bmp280_init(&I2cHandle);  

  9.     if(bmp280_id == 0x58) {  

  10.         bmp280_reset(&I2cHandle);  

  11.   

  12.         ctr_reg = bmp280_read_register(&I2cHandle, 0xF4);  

  13.   

  14.         printf("ctr_reg1111===0x%x\r\n", ctr_reg);  

  15.   

  16.         bmp280_write_register(&I2cHandle, 0xF4, 0xFF);  

  17.   

  18.         bmp280_write_register(&I2cHandle, 0xF5, 0x14);  

  19.   

  20.         HAL_Delay(100);  

  21.   

  22.         while(1) {  

  23.             ctr_reg = bmp280_read_register(&I2cHandle, 0xF4);  

  24.   

  25.             printf("ctr_reg2222===0x%x\r\n", ctr_reg);  

  26.   

  27.             status_reg = bmp280_read_register(&I2cHandle, 0xF3);  

  28.             printf("status == 0x%x\r\n", status_reg);  

  29.   

  30.   

  31.             tem = bmp280_get_temperature(&I2cHandle);  

  32.             pressure = bmp280_get_pressure(&I2cHandle);  

  33.   

  34.             printf("bmp280_id = 0x%x  tem=%ld    pressure=%ld   \r\n", bmp280_id, tem, pressure/256);  

  35.   

  36.             HAL_Delay(2000);  

  37.         }  

  38.     }  


推荐阅读

史海拾趣

Crosspoint Solutions公司的发展小趣事

在电子行业的激烈竞争中,Crosspoint Solutions公司凭借一项革命性的技术创新脱颖而出。公司研发出一款高度集成的交叉点开关芯片,该芯片在数据传输速度和稳定性上均达到了行业领先水平。这一创新迅速吸引了各大电子设备制造商的注意,公司因此获得了大量订单,市场份额迅速扩大。

BULGIN公司的发展小趣事

随着技术的不断进步和市场的扩大,BULGIN公司在20世纪60年代成为了当时世界上最大的、产品线最为齐全的电子零件制造商之一。公司保持着快速的创新与发展,BULGIN品牌开始覆盖多国市场,为全球各地的客户提供优质的产品和服务。

川晶科技公司的发展小趣事

随着环保意识的不断提高,绿色制造成为电子行业的重要发展趋势。川晶科技积极响应国家绿色发展的号召,通过引进先进的环保设备和技术,实现了生产过程的绿色化、低碳化。公司不断优化生产工艺,减少能源消耗和废弃物排放,推动产品向绿色、环保方向发展。川晶科技的绿色制造实践得到了业界的广泛赞誉,成为行业内的绿色标杆。

EVERLIGHT公司的发展小趣事

面对未来,EVERLIGHT有着明确的发展规划。公司将继续加大研发投入,不断推出创新型的LED产品和技术解决方案。同时,公司还将加强与国际知名品牌的合作,拓展更广阔的市场空间。此外,EVERLIGHT还将积极应对市场变化和竞争挑战,不断提升自身的核心竞争力和市场影响力。在未来的发展中,EVERLIGHT将继续秉持创新、品质、环保的理念,为电子行业的发展做出更大的贡献。

Crystalfontz America Inc公司的发展小趣事

Crystalfontz America Inc公司自成立以来,一直致力于LCD、OLED等显示模块的研发和生产。在早期的发展阶段,公司面临着技术上的诸多挑战。然而,通过持续的技术投入和研发团队的不懈努力,公司成功突破了多项关键技术,推出了一系列具有竞争力的显示模块产品。这些产品在市场上获得了广泛认可,为公司的快速发展奠定了坚实基础。

Chiplus Semiconductor Corp公司的发展小趣事

Chiplus深知企业管理对于公司发展的重要性。因此,公司建立了一套完善的管理体系,注重人才培养和团队建设。公司定期举办内部培训和技术交流活动,提升员工的专业技能和综合素质。同时,Chiplus还积极引进外部优秀人才,为公司的持续发展注入新的活力。

问答坊 | AI 解惑

新人(自我介绍)

大家好啊,很高兴担任嵌入式系统的斑竹之一,我的qq号是43842855,以后有问题大家一起讨论吧,我也会积极努力把自己对嵌入式的理解与大家分享.人人为人,我为人人,以后有什么不足的地方大家多多指出,我的目标就是努力把这个版块建成一个新人学习 ...…

查看全部问答>

华为硬件工程师手册目前最全版本

说明:目前网上包括本论坛的华为硬件工程师手册通常是不全版本(73页),希望大家下载是千万要注意。也希望大家如果没有更全的版本就不要在重复上传了…

查看全部问答>

逆变

求电鱼机的高压输出要求怎么样才能…

查看全部问答>

dsp2812学习体会

哈哈,抽时间写了一个博客,说说自己学习dsp2812的体会,欢迎大家共同探讨哦~~~ https://home.eeworld.com.cn/my/space.php?uid=117818&do=blog&id=22384&cid=1945…

查看全部问答>

USB 接口器件PDIUSBD12 的接口应用设计

USB作为一种新型的接口技术以其简单易用速度快等特点而备受青睐本文简单介绍USB 接口的特点和PHILIPS 公司的USB 接口芯片PDIUSBD12 并详细说明USB 软硬件开发过程中 应注意的问题…

查看全部问答>

尚为科技-机房环境监控专家

尚为科技-机房环境监控专家,机房环境监控产品专业厂商,产品具有稳定、易用、低功耗的特点,产品经过了权威部门的测试,已形成较完整的产品系列和行业解决方案,获得良好的用户口碑。 欢迎来电垂询,电话:0592-5204071 6300605 6300607   ...…

查看全部问答>

scsi miniport driver问题

谁能介绍一下scsi miniport driver的基本结构…

查看全部问答>

pc机跟wince同步问题

我用台式机跟研华6552的工控板 wince系统 通过双机互联线连接 台式机ip是192.168.0.12 工控机是192.168.0.192 从台式机上ping 工控机没有问题 但是ActiveSync一直连接不上 ActiveSync图标一直是灰色的 …

查看全部问答>

有关TCC7901_bsp2.2中的串口问题

现在在调TELECHIPS中的TCC7901芯片板子,TCC7901有6个PORT,但只有4个通道,我老板要我把2。2的BSP中的4个通道都用上,但2。2的BSP默认是把CH0和CH2分别用在了调试和IRda中,所以只有两个串口可用,我的任务就是改CH0和CH2为可用,请问一下有没有调 ...…

查看全部问答>

关于STM32F102/103的USB模块和USB库函数

今天有空,开贴讲讲,怎样配合ST提供的库函数理解STM32F102/103的USB模块,以及怎么调用这些库函数来实现基本的USB通信。 题目很大,先只讲讲最简单的应用。…

查看全部问答>