OpenEdv-开源电子网

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

BMP180校正系数读取问题

[复制链接]

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
发表于 2017-5-16 09:53:34 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 辉常可乐 于 2017-5-16 10:22 编辑

在BMP180读数,矫正系数读出全为0x0098,这种情况,有人知道怎么回事吗?

QQ截图20170516101739.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-16 21:26:01 | 显示全部楼层
回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-5-16 21:52:47 | 显示全部楼层
正点原子 发表于 2017-5-16 21:26
代码驱动 有bug吧?

额。。。这是设置的BMP180代码,SCL接的是PB6,SDA接的是PB7。
[mw_shl_code=c,true]#include "bmp180.h"
#include "delay.h"
#include "math.h"
//BMP180????
short AC1;
short AC2;
short AC3;
unsigned short AC4;
unsigned short AC5;
unsigned short AC6;
short B1;
short B2;
short MB;
short MC;
short MD;


float True_Temp=0;       //????,??:?
float True_Press=0;      //????,??a
float True_Altitude=0;   //????,??:m
u8 BMP180_ID=0;          //BMP180?ID

void IIC_PortInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;  //????GPIO_InitTypeDef??????
          RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );       
    GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_6|GPIO_Pin_7);    //PB6,PB7
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
          SCL_H();    //??
          SDA_H();
}


void IIC_Init(void)
{
    SCL_H();  //SCL = 1;
    delay_us(5);
    SDA_H();  //SDA = 1;
    delay_us(5);   
}


void IIC_Start(void)
{
    SDA_H();  //SDA = 1;
    delay_us(5);
    SCL_H();  //SCL = 1;
    delay_us(5);
    SDA_L();  //SDA = 0;
    delay_us(5);   
}


void IIC_Stop(void)
{
    SDA_L();  //SDA = 0;
    delay_us(5);
    SCL_H();   //SCL = 1;
    delay_us(5);
    SDA_H();   //SDA = 1;
    delay_us(5);
}


unsigned char IIC_ReceiveACK(void)
{
    unsigned char ACK;

    SDA_H();     //SDA=1;//???????????,??????????,???!
    SCL_H();     //SCL=1;
    delay_us(5);
    if (SDA==1)  //SDA??
    {
        ACK=1;   
    }
    else ACK=0;  //SDA??
    SCL_L();    //SCL = 0;//SCL?????SDA?????????,???????????
    delay_us(5);   
    return ACK;                 
}



void IIC_SendACK(unsigned char ack)
{
    if (ack==1)SDA_H();
    else if (ack==0)
      SDA_L();//SDA = ack;
    SCL_H();   //SCL = 1;
    delay_us(5);
    SCL_L();   //SCL = 0;
    delay_us(5);
}

unsigned char IIC_SendByte(unsigned char dat)
{
    unsigned char i;
    unsigned char bResult=1;   
    SCL_L();     //SCL = 0;//?????
    delay_us(5);         
    for( i=0;i<8;i++ ) //??SCK,?dat????????SDA?
    {
        if( (dat<<i)&0x80 )
                                        SDA_H();   //SDA = 1;//????
        else SDA_L();  //SDA = 0;
        delay_us(5);
        SCL_H();  //SCL = 1;
        delay_us(5);
        SCL_L();  //SCL = 0;
        delay_us(5);
    }
    bResult=IIC_ReceiveACK(); //??????????,????????
    return bResult;  //??????
}



unsigned char IIC_ReadByte(void)
{
    unsigned char dat;
    unsigned char i;
     
    SCL_H();     //SCL = 1;//????????????
    delay_us(5);
    for( i=0;i<8;i++ )
    {
        dat<<=1;
        dat=dat | (SDA);
        delay_us(5);        
        SCL_L();   //SCL = 0;
        delay_us(5);   
        SCL_H();   //SCL = 1;
        delay_us(5);   
    }
    return dat;
}

/*?BMP180??1??????*/
u8 BMP180_ReadOneByte(u8 ReadAddr)
{
    u8 temp=0;
    u8 IIC_ComFlag=1;   //IIC????,?0????,1??????     
    IIC_Start();     //IIC start
    IIC_ComFlag=IIC_SendByte(BMP180_SlaveAddr);   //slave address+W:0
    //printf(\"IIC_ComFlag=%u \r\n\",IIC_ComFlag);
    if (IIC_ComFlag==0)                           //????0??????,?????????????
    {
        IIC_SendByte(ReadAddr);                      //??????
        IIC_Start();
        IIC_SendByte(BMP180_SlaveAddr|0x01);         //slave address+R:1
        temp=IIC_ReadByte();                       //???
        IIC_SendACK(1);                 
        IIC_Stop();
    }
    return (temp);      
}

/*?BMP180??2??????*/
short BMP180_ReadTwoByte(u8 ReadAddr)
{
    u8 IIC_ComFlag=1;   //IIC????,?0????,1??????
    u8 MSB,LSB;
    short temp;   
    IIC_Start();
    IIC_ComFlag=IIC_SendByte(BMP180_SlaveAddr);
    if (IIC_ComFlag==0)
    {
        IIC_SendByte(ReadAddr);
        IIC_Start();
        IIC_SendByte(BMP180_SlaveAddr|0x01);
        MSB=IIC_ReadByte();       //????
        IIC_SendACK(0);         //ACK
        LSB=IIC_ReadByte();      //????
        IIC_SendACK(1);        //NACK
        IIC_Stop();
    }
    temp=MSB*256+LSB;
    return temp;                                                   
}


/*?BMP180????????????*/
void Write_OneByteToBMP180(u8 RegAdd, u8 Data)
{
    IIC_Start();                       //IIC start
    IIC_SendByte(BMP180_SlaveAddr);   //slave address+W:0
    IIC_SendByte(RegAdd);
    IIC_SendByte(Data);
    IIC_Stop();
}


/*??BMP180?????*/
void Read_CalibrationData(void)
{
    AC1=BMP180_ReadTwoByte(0xaa);
    AC2=BMP180_ReadTwoByte(0xac);
    AC3=BMP180_ReadTwoByte(0xae);
    AC4=BMP180_ReadTwoByte(0xb0);
    AC5=BMP180_ReadTwoByte(0xb2);
    AC6=BMP180_ReadTwoByte(0xb4);
    B1=BMP180_ReadTwoByte(0xb6);
    B2=BMP180_ReadTwoByte(0xb8);
    MB=BMP180_ReadTwoByte(0xba);
    MC=BMP180_ReadTwoByte(0xbc);
    MD=BMP180_ReadTwoByte(0xbe);
/*  printf(\"AC1:%d \r\n\",AC1);
    printf(\"AC2:%d \r\n\",AC2);
    printf(\"AC3:%d \r\n\",AC3);
    printf(\"AC4:%d \r\n\",AC4);
    printf(\"AC5:%d \r\n\",AC5);
    printf(\"AC6:%d \r\n\",AC6);
    printf(\"B1:%d \r\n\",B1);
    printf(\"B2:%d \r\n\",B2);
    printf(\"MB:%d \r\n\",MB);
    printf(\"MC:%d \r\n\",MC);
    printf(\"MD:%d \r\n\",MD);  */
}

/*?BMP180??????????*/
long Get_BMP180UT(void)
{
    long UT;
    Write_OneByteToBMP180(0xf4,0x2e);       //write 0x2E into reg 0xf4
    delay_ms(10);                                   //wait 4.5ms
    UT=BMP180_ReadTwoByte(0xf6);          //read reg 0xF6(MSB),0xF7(LSB)
//   printf(\"UT:%ld \r\n\",UT);
    return UT;
}


/*?BMP180??????????*/
long Get_BMP180UP(void)
{
    long UP=0;
    Write_OneByteToBMP180(0xf4,0x34);       //write 0x34 into reg 0xf4
    delay_ms(10);                                    //wait 4.5ms
    UP=BMP180_ReadTwoByte(0xf6);
    UP&=0x0000FFFF;//   printf(\"UP:%ld \r\n\",UP);   
    return UP;      
}

/*?????????????????????????
*True_Temp:?????,??:?
*True_Press:?????,??a
*True_Altitude:??????,??:m
*/
void Convert_UncompensatedToTrue(long UT,long UP)
{
    long X1,X2,X3,B3,B5,B6,B7,T,P;       
    unsigned long B4;     
    X1=((UT-AC6)*AC5)>>15;      //printf(\"X1:%ld \r\n\",X1);
    X2=((long)MC<<11)/(X1+MD);  //printf(\"X2:%ld \r\n\",X2);
    B5=X1+X2;                        //printf(\"B5:%ld \r\n\",B5);
    T=(B5+8)>>4;                      //printf(\"T:%ld \r\n\",T);
    True_Temp=T/10.0;           // printf(\"Temperature:%.1f \r\n\",True_Temp);
    B6=B5-4000;                       //printf(\"B6:%ld \r\n\",B6);
    X1=(B2*B6*B6)>>23;              //printf(\"X1:%ld \r\n\",X1);
    X2=(AC2*B6)>>11;                //printf(\"X2:%ld \r\n\",X2);
    X3=X1+X2;                         //printf(\"X3:%ld \r\n\",X3);
    B3=(((long)AC1*4+X3)+2)/4;    //printf(\"B3:%ld \r\n\",B3);
    X1=(AC3*B6)>>13;                //printf(\"X1:%ld \r\n\",X1);
    X2=(B1*(B6*B6>>12))>>16;      //printf(\"X2:%ld \r\n\",X2);
    X3=((X1+X2)+2)>>2;              //printf(\"X3:%ld \r\n\",X3);
    B4=AC4*(unsigned long)(X3+32768)>>15;   //printf(\"B4:%lu \r\n\",B4);
    B7=((unsigned long)UP-B3)*50000;        //printf(\"B7:%lu \r\n\",B7);
    if (B7 < 0x80000000)
    {
        P=(B7*2)/B4;  
    }
    else P=(B7/B4)*2;                   //printf(\":%ld \r\n\",P);         
    X1=(P/256.0)*(P/256.0);       //printf(\"X1:%ld \r\n\",X1);
    X1=(X1*3038)>>16;               //printf(\"X1:%ld \r\n\",X1);
    X2=(-7357*P)>>16;               //printf(\"X2:%ld \r\n\",X2);
    P=P+((X1+X2+3791)>>4);      //printf(\":%ld \r\n\",P);
    True_Press=P;                // printf(\"ress:%.1fPa \r\n\",True_Press);
               
                True_Altitude=44330*(1.0-pow((P/101325.0),(1.0/5.255)));

}
[/mw_shl_code]
回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-5-17 10:28:55 | 显示全部楼层
顶贴一次
回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-5-18 09:45:00 | 显示全部楼层
没有人遇到过这种情况吗?再顶一次
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 02:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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