msp430 iic读写气压传感器bmp85的问题

2019-07-26 16:32发布

我现在用iic调试气压传感器bmp85   
  但是初始化不行,
硬件仿真时查到的ac1  ac2.....全部都是0   
我觉得是Multiple_read(uchar ST_Address)这个函数我写的有问题  但是我不知道该怎么改
各位大神帮忙看下吧
void Init(void)
{
  SDA_0;
SCL_0;
  SCL_1;
  Delay_us(5);
  SDA_1;
  Delay_us(5);
}
void Start(void)
{
  SDA_1;
  Delay_us(5);
  SCL_1;
  Delay_us(5);
  SDA_0;
  Delay_us(5);
  SCL_0;
  Delay_us(5);
}
void Stop(void)
{
  SDA_0;
  Delay_us(5);
  SCL_1;
  Delay_us(5);
  SDA_1;
  Delay_us(5);
}
void WriteByte(unsigned char WriteData)
{
  unsigned char i;
  for (i=0; i<8; i++)
  {
    SCL_0;
    Delay_us(5);
    if (((WriteData >> 7) & 0x01) == 0x01)
    {
      SDA_1;
    }
    else
    {
      SDA_0;
    }
    Delay_us(5);
    SCL_1;
    WriteData = WriteData << 1;
    Delay_us(5);
  }
  SCL_0;
  SDA_1;
  Delay_us(5);
  Delay_us(5);
}
unsigned char ReadByte(void)
{
  unsigned char i;
  unsigned char TempBit  = 0;
  unsigned char TempData = 0;
  SCL_0;
  Delay_us(5);
  SDA_1;
  for (i=0; i<8; i++)
  {
    Delay_us(5);
    SCL_1;
    Delay_us(5);
    DIR_IN;
    if (SDA_IN == 0x01 /*sda==1*/)
    {
      TempBit = 1;
    }
    else
    {
      TempBit = 0;
    }
    DIR_OUT;
    TempData = (TempData << 1) | TempBit;
    SCL_0;
  }
  Delay_us(5);
  return(TempData);
}
void ReceiveAck(void)
{
  unsigned char i = 0;
  SCL_1;
  Delay_us(5);
  DIR_IN;
  while ((SDA_IN == 0x01 /*sda==1*/) && (i < 255)/*调试方便,可以不要*/)
  {
    i++;
  }
  DIR_OUT;
  SCL_0;
  Delay_us(5);
}
void Acknowledge(void)
{
  SCL_0;
Delay_us(5);
  DIR_OUT;
  SDA_0;
  SCL_1;
  Delay_us(5);
  SCL_0;
}
void Nack(void)
{
  SCL_0;
  Delay_us(5);
  DIR_OUT;
  SDA_1;
  SCL_1;
  Delay_us(5);
  SCL_0;
}
//*********************************************************
//读出BMP085内部数据,连续两个
//*********************************************************
short Multiple_read(uchar ST_Address)
{   

short _data;
    Start();                          //起始信号
    WriteByte(BMP085_SlaveAddress); //发送设备地址+写信号
   ReceiveAck();
    WriteByte(ST_Address);             //发送存储单元地址
   ReceiveAck();
    Start();                           //起始信号
    WriteByte(BMP085_SlaveAddress+1);         //发送设备地址+读信号
   ReceiveAck();
   
        BUF[0] = ReadByte();         //BUF[0]存储0x32地址中的数据
      
           Acknowledge();          //回应ACK     
      BUF[1] = ReadByte();
          Nack();                 //最后一个数据需要回NOACK
   

    Stop();                          //停止信号
    Delay_ms(5);
    _data = BUF[0]<< 8;
_data |= BUF[1];
return _data;
}
//初始化BMP085,根据需要请参考pdf进行修改**************
void Init_BMP085()
{
ac1 = Multiple_read(0xAA);
ac2 = Multiple_read(0xAC);
ac3 = Multiple_read(0xAE);
ac4 = Multiple_read(0xB0);
ac5 = Multiple_read(0xB2);
ac6 = Multiple_read(0xB4);
b1 =  Multiple_read(0xB6);
b2 =  Multiple_read(0xB8);
mb =  Multiple_read(0xBA);
mc =  Multiple_read(0xBC);
md =  Multiple_read(0xBE);
}






下面是51的源码

/**************************************
起始信号
**************************************/
void BMP085_Start()
{
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 0;                    //产生下降沿
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
}
/**************************************
停止信号
**************************************/
void BMP085_Stop()
{
    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BMP085_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
}
/**************************************
接收应答信号
**************************************/
bit BMP085_RecvACK()
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
    return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BMP085_SendByte(BYTE dat)
{
    BYTE i;
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    BMP085_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BMP085_RecvByte()
{
    BYTE i;
    BYTE dat = 0;
    SDA = 1;                    //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        dat |= SDA;             //读数据               
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    return dat;
}
/*
//单字节写入BMP085内部数据*******************************
void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
{
    BMP085_Start();                  //起始信号
    BMP085_SendByte(SlaveAddress);   //发送设备地址+写信号
    BMP085_SendByte(REG_Address);    //内部寄存器地址
    BMP085_SendByte(REG_data);       //内部寄存器数据
    BMP085_Stop();                   //发送停止信号
}
*/
/*
//单字节读取BMP085内部数据********************************
uchar Single_Read(uchar REG_Address)
{  uchar REG_data;
    BMP085_Start();                          //起始信号
    BMP085_SendByte(BMP085_SlaveAddress);           //发送设备地址+写信号
    BMP085_SendByte(REG_Address);            //发送存储单元地址
    BMP085_Start();                          //起始信号
    BMP085_SendByte(BMP085_SlaveAddress+1);         //发送设备地址+读信号
    REG_data=BMP085_RecvByte();              //读出寄存器数据
BMP085_SendACK(1);   
BMP085_Stop();                           //停止信号
    return REG_data;
}
*/
//*********************************************************
//读出BMP085内部数据,连续两个
//*********************************************************
short Multiple_read(uchar ST_Address)
{   
uchar msb, lsb;
short _data;
    BMP085_Start();                          //起始信号
    BMP085_SendByte(BMP085_SlaveAddress);    //发送设备地址+写信号
    BMP085_SendByte(ST_Address);             //发送存储单元地址
    BMP085_Start();                          //起始信号
    BMP085_SendByte(BMP085_SlaveAddress+1);         //发送设备地址+读信号
    msb = BMP085_RecvByte();                 //BUF[0]存储
    BMP085_SendACK(0);                       //回应ACK
    lsb = BMP085_RecvByte();     
BMP085_SendACK(1);                       //最后一个数据需要回NOACK
    BMP085_Stop();                           //停止信号
    Delay5ms();
    _data = msb << 8;
_data |= lsb;
return _data;
}
//**************************************************************
//初始化BMP085,根据需要请参考pdf进行修改**************
void Init_BMP085()
{
ac1 = Multiple_read(0xAA);
ac2 = Multiple_read(0xAC);
ac3 = Multiple_read(0xAE);
ac4 = Multiple_read(0xB0);
ac5 = Multiple_read(0xB2);
ac6 = Multiple_read(0xB4);
b1 =  Multiple_read(0xB6);
b2 =  Multiple_read(0xB8);
mb =  Multiple_read(0xBA);
mc =  Multiple_read(0xBC);
md =  Multiple_read(0xBE);
}

延时我直接调用的库函数  所以应该不是延时的问题
所以帮我看看改的程序吧
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
中国无芯
1楼-- · 2019-07-26 16:40
好长的代码啊,看不懂
hhq1392010
2楼-- · 2019-07-26 18:17
问题解决了么?
yiqifei
3楼-- · 2019-07-26 23:00
楼主您好 我遇到了和你一样的问题。想问一下你解决了吗?能不能分享一下。。:(

一周热门 更多>