在Atmega中的I2C接口中未获得正确的值

在Atmega中的I2C接口中未获得正确的值,c,embedded,avr,i2c,atmega,C,Embedded,Avr,I2c,Atmega,我对I2C的概念非常陌生,我在两个Atmega32之间连接I2C时遇到了一些问题 我有一个Atmega32作为主设备,液晶显示屏连接到主设备,另一个I2C作为从设备,LM35连接到主设备,这两个Atmega都与SDA和SCL线路连接 因此,尽管我在连接到主机的LCD屏幕上获取数据,但我没有得到正确的值。就像这里的温度是28摄氏度,但由于某种原因,连接到主机的LCD不断重复65280次。有人能告诉我哪里出了问题吗?主设备和从设备的代码已发布在下面 主代码: int main(void) {

我对I2C的概念非常陌生,我在两个Atmega32之间连接I2C时遇到了一些问题

我有一个Atmega32作为主设备,液晶显示屏连接到主设备,另一个I2C作为从设备,LM35连接到主设备,这两个Atmega都与SDA和SCL线路连接

因此,尽管我在连接到主机的LCD屏幕上获取数据,但我没有得到正确的值。就像这里的温度是28摄氏度,但由于某种原因,连接到主机的LCD不断重复65280次。有人能告诉我哪里出了问题吗?主设备和从设备的代码已发布在下面

主代码:

int main(void)
{
    unsigned int xx=0x00;
    unsigned char yy;
    DDRA=0xff;
    I2C_init(); //I2C initialization
    lcd_init(); //LCD initialization
    while(1)
    {
        for (int i=0;i<3;i++) //Getting unsigned int data from slave, so
        {                     //broke data into 4 parts and receiving 
            if (i==0)         //one byte at a time. 
            {
                I2C_start(0x01);  //I2C start along with the address of the slave
                yy=I2C_read_ack(); //Read slave data along with an acknowledgment 
                xx |= (yy << 8);    
                I2C_stop(); //I2C stop function.
            }
            else if (i>0)
            {
                I2C_start(0x01+1); //don't know any particular reason
                yy=I2C_read_ack(); //behind this, but if i don't do 0x01+1
                xx |= (yy << 8);   //then the master ends up reading the
                I2C_stop();        //address as a data packet.
            }
        }
     lcd_num(xx);   //lcd function to display unsigned int data.
    }
}

在主代码中,
xx
从未被设置,除非在声明时,它仅被修改。因此,我建议您在其中一个循环中初始化
xx
,但不确定是哪个循环,因为
lcdnum()
for
循环中

编辑:接收器环路有几个问题

  • 蓄能器未初始化
  • 错误的回路控制(3而不是4)
  • 错误换档
  • 字节顺序不正确(首先发送的是l.s.字节)
我建议将代码块重写为

for (int i=0; i<4; i++)
{
    if (i==0)                   // if first byte
    {
        I2C_start(0x01);
        xx = I2C_read_ack();    // initialise accumulator with first byte
        I2C_stop();
    }
    else                        // no need to test i again
    {
        I2C_start(0x01+1);
        yy = I2C_read_ack();
        xx |= (yy << (i*8));    // update accumulator
        I2C_stop();
    }
}

for(int i=0;i在主代码中,
xx
从未设置,除非声明,它只是被修改。因此我建议您在其中一个循环中初始化
xx
,不确定是哪个循环,因为
lcdnum()
for
循环中

编辑:接收器环路有几个问题

  • 蓄能器未初始化
  • 错误的回路控制(3而不是4)
  • 错误换档
  • 字节顺序不正确(首先发送的是l.s.字节)
我建议将代码块重写为

for (int i=0; i<4; i++)
{
    if (i==0)                   // if first byte
    {
        I2C_start(0x01);
        xx = I2C_read_ack();    // initialise accumulator with first byte
        I2C_stop();
    }
    else                        // no need to test i again
    {
        I2C_start(0x01+1);
        yy = I2C_read_ack();
        xx |= (yy << (i*8));    // update accumulator
        I2C_stop();
    }
}

for(int i=0;i“…Atmega已与SDA和SCL线连接。”。我认为您确实添加了适当的上拉(具有适当的电压水平),并且没有忘记接地连接。是的,这已正确完成。“…Atmega已与SDA和SCL线连接。”。我认为您确实添加了适当的上拉(具有适当的电压水平)并且没有忘记接地连接。是的,这已经正确完成。这是错误的,lcd_num应该在for循环之外,我在编辑问题代码时犯了一个小错误。我将尝试在循环内初始化xx并检查一次。编辑:我已将lcd_num的代码编辑为for循环之外。这是给正确的值,但我得到了很多中间的垃圾数据。就像温度是28,但在接收器中它打印28,然后54,然后28,依此类推。你从代码的
main
是不完整的。它没有声明任何变量,没有任何循环,你只在最后初始化
mask
byte
,这应该是正确的在开始时完成。你是否按照我的建议将接收器的循环计数器更改为4?我在开始时声明了这些变量。我只是没有发布它。让我编辑问题中的代码,我将接收器的循环计数器更改为4。这是错误的,lcd_num应该在for循环之外,我在编辑c时犯了一个小错误问题的ode。我将尝试在循环内初始化xx并检查一次。编辑:我已将lcd_num的代码编辑为在for循环外。这给出了正确的值,但在这两者之间我得到了很多垃圾数据。例如温度为28,但在接收器中它会打印28,然后54,然后28,依此类推。你从代码的
main
不完整。它没有声明任何变量,没有任何循环,并且您只在末尾初始化
掩码
字节
——这应该在开始时完成。您是否按照我的建议将接收器的循环计数器更改为4?我在开始时声明了这些变量。我只是没有发布它。让我在问题,我已将接收器的循环计数器更改为4。