OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11821|回复: 9

bmp280,请求大神指点

[复制链接]

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
发表于 2018-1-23 09:15:42 | 显示全部楼层 |阅读模式
10金钱
调了能有一周了,bmp280,用iic通讯,一直调出数据不对,地址什么的都是按照说明来的,0xec,大神指点一下是不是还差哪里没有配置对,附上程序

#define        BMP280_SlaveAddress   0xec          //定义器件在IIC总线中的从地址                              

#define OSS 0        // Oversampling Setting (note: code is not set up to use other OSS values)

unsigned short dig_T1;
short dig_T2;
short dig_T3;
unsigned short dig_P1;
short dig_P2;
short dig_P3;
short dig_P4;
short dig_P5;
short dig_P6;
short dig_P7;
short dig_P8;
short dig_P9;


void delay()    //略微延时  6us约>4.7us
{
_nop_();
  _nop_();
   _nop_();
    _nop_();
         _nop_();
          _nop_();
}
void iic_start()   //启动信号
{
  SDA=1;
  SCL=1;
  delay();
  SDA=0;
  delay();
  SCL=0;
}
void iic_stop()  //停止信号
{
        SDA=0;
        SCL=1;
        delay();
        SDA=1;
        delay();
        SCL=0;
}

void iic_ack()   //应答信号
{
        uchar i=0;
        SCL=1;
        delay();
        while((SDA==1)&&(i<255))
        i++;
        SCL=0;
        delay();
}

void iic_send_byte(uchar bat)  //发送数据
{
        uchar i,temp;
        temp=bat;
        for(i=0;i<=7;i++)
        {
          temp=temp<<1;
          SCL=0;
          SDA=CY;
          delay();
          SCL=1;
          delay();
        }
        SCL=0;
        delay();
        SDA=1;
        delay();
}

unsigned char iic_rev()  //接受数据
{
  uchar temp,i;
  SCL=0;
  delay();
  SDA=1;
  for(i=0;i<=7;i++)
  {
   SCL=1;
   delay();
   temp=(temp<<1)|SDA;
   SCL=0;
   delay();
  }
  delay();
  return temp;
}


uchar Single_Read(uchar ST_Address)
{
        uchar REG_data;
        //uchar bit;
       
        iic_start();         //起始信号
        iic_send_byte(BMP280_SlaveAddress);           //发送设备地址+写信号
        iic_ack();
        iic_send_byte(ST_Address);             //发送存储单元地址
        iic_ack();
        iic_start();                          //起始信号
        iic_send_byte(BMP280_SlaveAddress+1);         //发送设备地址+读信号
        iic_ack();
        REG_data = iic_rev();     
        iic_ack();    //最后一个数据需要回NOACK
        return REG_data;
}

void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
{
    iic_start();                       //起始信号
    iic_send_byte(SlaveAddress);   //发送设备地址+写信号
        iic_ack();
        iic_send_byte(REG_Address);    //内部寄存器地址
        iic_ack();
        iic_send_byte(REG_data);       //内部寄存器数据
        iic_ack();
        iic_stop();                   //发送停止信号
}

//*********************************************************
//读出BMP085内部数据,连续两个
//*********************************************************
short Multiple_read(uchar ST_Address)
{   
        uchar msb, lsb;
        short _data;
       
        lsb = Single_Read(ST_Address);
        msb = Single_Read(ST_Address+1);
       
        _data = msb << 8;
        _data |= lsb;       
        //rt_kprintf("data is %x %x\n",msb,lsb);
        return _data;
}
//*********************************************************
//读出BMP085内部数据,连续三个
//*********************************************************
long Multiple_three_read(uchar ST_Address)
{   
        uchar msb, lsb,xlsb;
        long _data = 0;
       
        msb = Single_Read(ST_Address);
        lsb = Single_Read(ST_Address+1);
        xlsb = Single_Read(ST_Address+2);
       
        //rt_kprintf("data is %x %x %x\n",msb,lsb,xlsb);
       
        _data = msb << 16;
        _data |= lsb << 8;       
        _data |= xlsb;
        _data = _data >> 4;
        return _data;
}

//**************************************************************

//初始化BMP280,根据需要请参考pdf进行修改**************
void Init_BMP280(void)
{
        unsigned short temp = 0;
        unsigned char write_byte;

        temp = Single_Read(0xd0);//

        dig_T1 = Multiple_read(0x88);
        dig_T2 = Multiple_read(0x8A);
        dig_T3 = Multiple_read(0x8C);
        dig_P1 = Multiple_read(0x8E);
        dig_P2 = Multiple_read(0x90);
        dig_P3 = Multiple_read(0x92);
        dig_P4 = Multiple_read(0x94);
        dig_P5 = Multiple_read(0x96);
        dig_P6 = Multiple_read(0x98);
        dig_P7 = Multiple_read(0x9A);
        dig_P8 = Multiple_read(0x9C);
        dig_P9 = Multiple_read(0x9E);



        write_byte = 0x91;
        Single_Write(BMP280_SlaveAddress,0xf4,write_byte);
        write_byte = 0x00;//配置
        Single_Write(BMP280_SlaveAddress,0xf5,write_byte);//5<<2
        //rt_thread_delay(RT_TICK_PER_SECOND);
        Delay_N1ms(200);       
}
//***********************************************************************

long bmp280Convert(void)
{
        long adc_T;
        long adc_P;
        long var1, var2,t_fine,T,p;

         //rt_kprintf("----------------------------\n");
       
        //adc_T = Multiple_three_read(0xFA);
        adc_T = Multiple_three_read(0xFA);    // 读取温度
        //adc_P = Multiple_three_read(0xF7);
        adc_P = Multiple_three_read(0xF7); // 读取压强

        if(adc_P == 0)
        {
                return 0;
        }
        //Temperature
        var1 = (((double)adc_T)/16384.0-((double)dig_T1)/1024.0)*((double)dig_T2);
        //rt_kprintf("var1 is %d\n",var1);
        var2 = ((((double)adc_T)/131072.0-((double)dig_T1)/8192.0)*(((double)adc_T)/131072.0-((double)dig_T1)/8192.0))*((double)dig_T3);
        //rt_kprintf("var2 is %d\n",var2);
       
        t_fine = (uint32)(var1+var2);
        //rt_kprintf("t_fine is %d\n",t_fine);
       
        T = (var1+var2)/5120.0;
        T = T;
        //rt_kprintf("temperature is %d\n",T);
       
        var1 = ((double)t_fine/2.0)-64000.0;
        //rt_kprintf("var1 is %d\n",var1);
       
        var2 = var1*var1*((double)dig_P6)/32768.0;
        //rt_kprintf("var2 is %d\n",var2);
       
        var2 = var2+var1*((double)dig_P5)*2.0;
        //rt_kprintf("var2 is %d\n",var2);
       
        var2 = (var2/4.0)+(((double)dig_P4)*65536.0);
        //rt_kprintf("var2 is %d\n",var2);
       
        var1 = (((double)dig_P3)*var1*var1/524288.0+((double)dig_P2)*var1)/524288.0;
        //rt_kprintf("var1 is %d\n",var1);
       
        var1 = (1.0+var1/32768.0)*((double)dig_P1);
        //rt_kprintf("var1 is %d\n",var1);
       
        p = 1048576.0-(double)adc_P;
        //rt_kprintf("p is %d\n",p);

        p = (p-(var2/4096.0))*6250.0/var1;
        //rt_kprintf("p is %d\n",p);
       
        var1 = ((double)dig_P9)*p*p/2147483648.0;
        //rt_kprintf("var1 is %d\n",var1);
       
        var2 = p*((double)dig_P8)/32768.0;
        //rt_kprintf("var2 is %d\n",var2);
       
        p = p+(var1+var2+((double)dig_P7))/16.0;
         
        //rt_kprintf("pressure is %d\n",p);
        return p;
}

int get_pressure(void)
{         int pressure = 0;
        int i = 0;
         SDA=1;
        SCL=1;
        Delay_N1ms(200);                           //上电延时               
        Init_BMP280();                //初始化BMP085
        while(i < 3)
        {
                pressure = bmp280Convert();
                i++;
        }

//        printf("pressure is %d\n",pressure);
        Single_Write(BMP280_SlaveAddress,0xf4,0x24);
        return pressure;
}


最佳答案

查看完整内容[请看2#楼]

问题已解决,iic通信没问题,可以读取出id,读取数据之后处理错误,在把char型转换成long型时移位错误,所以结果也不对了,看着移位的方法是没有错误,但是最好还是调试看一下,张教训了,下面发上我改后的程序,仅供参考,欢迎一起探讨
qq1950361006,互帮互助,共同进步。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
 楼主| 发表于 2018-1-23 09:15:43 | 显示全部楼层
问题已解决,iic通信没问题,可以读取出id,读取数据之后处理错误,在把char型转换成long型时移位错误,所以结果也不对了,看着移位的方法是没有错误,但是最好还是调试看一下,张教训了,下面发上我改后的程序,仅供参考,欢迎一起探讨

bmp280111.rar

2.85 KB, 下载次数: 422

qq1950361006,互帮互助,共同进步。
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
 楼主| 发表于 2018-1-24 10:49:52 | 显示全部楼层
扔个程序上来

opt101和温湿度.rar

6.91 MB, 下载次数: 305

qq1950361006,互帮互助,共同进步。
回复

使用道具 举报

62

主题

902

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3555
金钱
3555
注册时间
2016-1-8
在线时间
543 小时
发表于 2018-1-24 13:40:54 | 显示全部楼层
官方都写好了的
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-5-3
在线时间
2 小时
发表于 2020-5-3 18:08:03 | 显示全部楼层

不相关的程序就别扔了吧
回复

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-4-25
在线时间
5 小时
发表于 2020-5-4 12:54:47 | 显示全部楼层
没看明白!!!
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
 楼主| 发表于 2020-5-11 21:34:56 | 显示全部楼层
Lizh023 发表于 2020-5-3 18:08
不相关的程序就别扔了吧

要你管?
qq1950361006,互帮互助,共同进步。
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
 楼主| 发表于 2020-5-11 21:35:24 | 显示全部楼层

ctrl+c ctrl+v用看什么明白
qq1950361006,互帮互助,共同进步。
回复

使用道具 举报

15

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2020-10-9
在线时间
34 小时
发表于 2021-5-18 13:22:16 | 显示全部楼层
你这是用的51?
回复

使用道具 举报

1

主题

58

帖子

0

精华

高级会员

Rank: 4

积分
798
金钱
798
注册时间
2016-11-13
在线时间
63 小时
发表于 2021-6-15 19:38:50 | 显示全部楼层

没看明白!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 02:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表