This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

430G2553 模拟i2c访问BH1750编译出错,求助



  • #include <msp430.h>
    #include "OLED.h"

    #define CPU_F ((double)1000000)
    #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //延时x微秒
    #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))


    #define SDA_H P2DIR&=~BIT5 //设为输入,上拉电阻把总线拉高,即电阻上拉
    #define SDA_L P2DIR|=BIT5
    #define SDA_0 P2OUT&=~BIT5 //设为输入,输出低电平,把总线拉低,即总线主器件拉低

    #define SCL_H P2DIR&=~BIT4 //设为输入,上拉电阻把总线拉高,即电阻上拉
    #define SCL_L P2DIR|=BIT4
    #define SCL_0 P2OUT&=~BIT4 //设为输入,输出低电平,把总线拉低,即总线主器件拉低


    #define uchar unsigned char
    #define uint unsigned int
    #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
    //ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
    typedef unsigned char BYTE;
    typedef unsigned short WORD;
    BYTE BUF[8]; //接收数据缓存区
    //uchar ge,shi,bai,qian,wan; //显示变量
    int dis_data; //变量
    void Init_BH1750(void);


    void Single_Write_BH1750(uchar REG_Address); //单个写入数据
    uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
    void Multiple_Read_BH1750(); //连续的读取内部寄存器数据
    //------------------------------------

    void BH1750_Start(); //起始信号
    void BH1750_Stop(); //停止信号
    void BH1750_SendACK(uchar ack); //应答ACK
    uchar BH1750_RecvACK(); //读ack
    void BH1750_SendByte(BYTE dat); //IIC单个字节写
    BYTE BH1750_RecvByte(); //IIC单个字节读

    //-----------------------------------
    /**************************************
    起始信号
    **************************************/
    void BH1750_Start()
    {
    SDA_H;
    //SDA = 1; //拉高数据线
    SCL_H; //拉高时钟线
    delay_us(5); //延时
    SDA_L;
    SDA_0; //产生下降沿
    delay_us(5); //延时
    SCL_L;
    SCL_0; //拉低时钟线
    }

    /**************************************
    停止信号
    **************************************/
    void BH1750_Stop()
    {
    SDA_L;
    SDA_0; //拉低数据线
    SCL_H; //拉高时钟线
    delay_us(5); //延时
    SDA_H; //产生上升沿
    delay_us(5); //延时
    }

    /**************************************
    发送应答信号
    入口参数:ack (0:ACK 1:NAK)
    **************************************/
    void BH1750_SendACK(uchar ack)
    {
    if(!ack)
    {
    SDA_L;
    SDA_0;
    }else
    SDA_H;
    //SDA = ack; //写应答信号
    SCL_H; //拉高时钟线
    delay_us(5); //延时
    SCL_L;
    SCL_0; //拉低时钟线
    delay_us(5); //延时
    }

    /**************************************
    接收应答信号
    **************************************/
    uchar BH1750_RecvACK()
    {
    SCL_H; //拉高时钟线
    delay_us(5); //延时
    if(P2IN&BIT5)
    {
    SCL_L;
    SCL_0;
    BH1750_Stop();
    return 1;
    }else
    {
    SCL_L;
    SCL_0;
    return 0;
    }
    //CY = SDA; //读应答信号
    SCL_L;
    SCL_0; //拉低时钟线
    delay_us(5); //延时

    return 1;
    }

    /**************************************
    向IIC总线发送一个字节数据
    **************************************/
    void BH1750_SendByte(BYTE dat)
    {
    BYTE i;

    for (i=0; i<8; i++) //8位计数器
    {
    dat <<= 1; //移出数据的最高位
    if(dat & 0x80)
    SDA_H;
    else
    {
    SDA_L;
    SCL_0;
    //SDA = CY; //送数据口
    }
    SCL_H; //拉高时钟线
    delay_us(5); //延时
    SCL_L;
    SCL_0; //拉低时钟线
    delay_us(5); //延时
    }
    BH1750_RecvACK();
    }

    /**************************************
    从IIC总线接收一个字节数据
    **************************************/
    BYTE BH1750_RecvByte()
    {
    BYTE i;
    BYTE dat = 0;

    SDA_H; //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++) //8位计数器
    {
    dat <<= 1;
    SCL_H; //拉高时钟线
    delay_us(5); //延时
    if(P2IN&BIT5)
    dat = dat|0x01;
    //dat |= SDA; //读数据
    SCL_L;
    SCL_0; //拉低时钟线
    delay_us(5); //延时
    }
    return dat;
    }

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

    void Single_Write_BH1750(uchar REG_Address)
    {
    BH1750_Start(); //起始信号
    BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
    BH1750_SendByte(REG_Address); //内部寄存器地址,
    // BH1750_SendByte(REG_data); //内部寄存器数据,
    BH1750_Stop(); //发送停止信号
    }

    //*********************************************************
    //
    //连续读出BH1750内部数据
    //
    //*********************************************************


    void Multiple_read(void)
    { uchar i;
    BH1750_Start(); //起始信号
    BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号

    for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF
    {
    BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
    if (i == 3)
    {

    BH1750_SendACK(1); //最后一个数据需要回NOACK
    }
    else
    {
    BH1750_SendACK(0); //回应ACK
    }
    }

    BH1750_Stop(); //停止信号
    delay_ms(5);
    }


    //初始化BH1750,根据需要请参考pdf进行修改****
    void Init_BH1750()
    {
    Single_Write_BH1750(0x01);

    }

    void main(void)
    {
    WDTCTL=WDTPW+WDTHOLD;
    float temp;
    delay_ms(100); //延时100ms
    LED_Init();
    Init_BH1750(); //初始化BH1750

    while(1) //循环
    {

    Single_Write_BH1750(0x01); // power on
    Single_Write_BH1750(0x10); // H- resolution mode

    delay_ms(180); //延时180ms

    Multiple_Read_BH1750(); //连续读出数据,存储在BUF中

    dis_data=BUF[0];
    dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据

    temp=(float)dis_data/1.2;
    LED_PrintValueF(3,3,temp,2);
    LED_P6x8Str(4,4,"BH1750");
    }

    }

  • 你的程序里面有没定义的变量或是函数名。建议你仔细查看一下编译的信息。

    谢谢