- #include "mbed.h"
- Serial pc(PA_9, PA_10);//定义串口
- I2C i2c(PB_7, PB_6);//定义i2c通信
- unsigned short int dig_P1, dig_T1;//定义引脚,变量
- short int dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9, dig_T2, dig_T3;
- double wendu, qiya, t_fine;//温度,气压,补偿
- const int addw = 0xEC;//写入地址 Pin6:SDO(传感器地址控制位,接GND的时候I2C中器件地址为0xEC,接高电平为0xEc+1
- const int addr = 0xED;//读取地址
- //测量控制寄存器(ctrl_meas)(0xF4):
- //Bit7~Bit5:osrs_t[2:0] 控制温度采样模式,主要是采样数据的位数(位数越大,精度越高),具体配置如下(本次三位都配置为1,最大采样位数20Bit):
- //Bit4~Bit2:osrs_p[2:0] 控制大气压强采样模式,主要是采样数据的位数(位数越大,精度越高),具体配置如下(本次三位都配置为1,最大采样位数20Bit):
- //Bit1~Bit0:mode[1:0] 传感器工作模式控制,00为Sleep Mode,01/10为Forced Mode,11为 Normal Mode(本次配置为11)。
- //配置寄存器(config)(0xF5):
- //Bit7~Bit5:t_sb[2:0] 设置Normal Mode下的转换间隔时间,具体配置如下(本次配置为000,0.5ms转换一次)
- //Bit4~Bit2:filter[2:0] 设置传感器接收外界信号时的,前端滤波电路的滤波系数的,可以有效减少外界环境的干扰: 本次000,不使用
- //Bit0:spi3w_en 与SPI模式有关,本次没用到,没设置。
- //身份编号寄存器(id)(0xD0):
- //寄存器内固定值为0x58,读取0xD0数据的时候,传感器返回0x58,代表身份辨认完毕。
- //复位寄存器(reset)(0xE0):
- //写入0xB6时,所有寄存器(除身份编号寄存器)数据全部清零。
- /*
- 函数功能:读取制定地址的数据
- 参数:寄存器地址
- 返回值:读出的数据
- */
- uint8_t i2cread(char shuju)
- {
- char cmd[2];
- cmd[0] = shuju;
- i2c.write(addw, cmd, 1);
- i2c.read(addr, cmd, 1);
- return cmd[0];
- }
- /*
- 函数功能:计算温度
- 参数:无
- 返回值:温度
- */
- float bmp280_wendu()
- {
- long adc_P;
- uint32_t var1, var2;
- float T, p;
- var1 = (((double)wendu) / 16384.0 - ((double)dig_T1) / 1024.0) * ((double)dig_T2);
- var2 = ((((double)wendu) / 131072.0 - ((double)dig_T1) / 8192.0) * (((double)wendu) / 131072.0 - ((double)dig_T1) / 8192.0)) * ((double)dig_T2);
- t_fine = (uint32_t)(var1 + var2);
- T = (var1 + var2) / 5120.0;
- //bmp280自带的补偿算法
- return T;
- }
- /*
- 函数功能:计算气压
- 参数:无
- 返回值:无
- */
- float bmp280_qiya()
- {
- uint32_t var1, var2;
- float T, p;
- var1 = ((double)t_fine / 2.0) - 64000.0;
- var2 = var1 * var1 * ((double)dig_P6) / 32768.0;
- var2 = var2 + var1 * ((double)dig_P5) * 2.0;
- var2 = (var2 / 4.0) + (((double)dig_P4) * 65536.0);
- var1 = (((double)dig_P3) * var1 * var1 / 524288.0 + ((double)dig_P2) * var1) / 524288.0;
- var1 = (1.0 + var1 / 32768.0) * ((double)dig_P1);
- p = 1048576.0 - (double)qiya;
- p = (p - (var2 / 4096.0)) * 6250.0 / var1;
- var1 = ((double)dig_P9) * p * p / 2147483648.0;
- var2 = p * ((double)dig_P8) / 32768.0;
- p = p + (var1 + var2 + ((double)dig_P7)) / 16.0;
- return p;//bmp280自带补偿算法
- }
- /*
- 函数功能:读取温度,气压数据,存入定义的变量中
- 参数:无
- 返回值:无
- */
- void bmp280_shujucaiji(void)
- {
- uint8_t lsb, msb, xlsb;
- msb = i2cread(0xfa);//高8位
- lsb = i2cread(0xfb);//低8位
- xlsb = i2cread(0xfc);
- wendu = (msb << 12) | (lsb << 4) | (xlsb >> 4);//高位放最左边,低位中间,xlsb后四位不要,注意datesheet中给的低位高位地址,是反的
- msb = i2cread(0xf7);
- lsb = i2cread(0xf8);
- xlsb = i2cread(0xf9);
- qiya = (msb << 12) | (lsb << 4) | (xlsb >> 4);
- }
- /*
- 函数功能:读取实时补偿
- 参数:无
- 返回值:无
- */
- void bmp280_buchang(void)
- {
- uint8_t lsb, msb;
- lsb = i2cread(0x88);
- msb = i2cread(0x89);
- dig_T1 = (msb << 8) | lsb;
- lsb = i2cread(0x8A);
- msb = i2cread(0x8B);
- dig_T2 = (msb << 8) | lsb;
- lsb = i2cread(0x8c);
- msb = i2cread(0x8d);
- dig_T3 = (msb << 8) | lsb;
- lsb = i2cread(0x8e);
- msb = i2cread(0x8f);
- dig_P1 = msb << 8 | lsb;
- lsb = i2cread(0x90);
- msb = i2cread(0x91);
- dig_P2 = msb << 8 | lsb;
- lsb = i2cread(0x92);
- msb = i2cread(0x93);
- dig_P3 = msb << 8 | lsb;
- lsb = i2cread(0x94);
- msb = i2cread(0x95);
- dig_P4 = msb << 8 | lsb;
- lsb = i2cread(0x96);
- msb = i2cread(0x97);
- dig_P5 = msb << 8 | lsb;
- lsb = i2cread(0x98);
- msb = i2cread(0x99);
- dig_P6 = msb << 8 | lsb;
- lsb = i2cread(0x9a);
- msb = i2cread(0x9b);
- dig_P7 = msb << 8 | lsb;
- lsb = i2cread(0x9c);
- msb = i2cread(0x9d);
- dig_P8 = msb << 8 | lsb;
- lsb = i2cread(0x9e);
- msb = i2cread(0x9f);
- dig_P9 = msb << 8 | lsb;
- }
- /*
- 函数功能:配置bmp280寄存器参数
- 参数:无
- 返回值:无
- */
- void bmp280_init(void)
- {
- char cmd[2], str[2];
- cmd[0] = 0xf4;
- cmd[1] = 0xff;
- str[0] = 0xf5;
- str[1] = 0x00;
- i2c.write(addw, cmd, 2);
- i2c.write(addw, str, 2);
- }
- int main()
- {
- bmp280_init();
- pc.baud(9600);//波特率配置
- wait(1);
- pc.printf("%d\n", i2cread(0xD0));
- while (1)
- {
- bmp280_buchang();
- bmp280_shujucaiji();
- pc.printf("%.6f\n", bmp280_wendu());
- pc.printf("%.6f\n", bmp280_qiya());
- wait(1);
- }
- }
复制代码 |