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