gpt4 book ai didi

c - 在 Atmega 的 I2C 接口(interface)中没有得到正确的值

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:02 26 4
gpt4 key购买 nike

我对 I2C 的概念还很陌生,我在 2 个 Atmega32(s) 之间连接 I2C 时遇到了一些问题。

我有一个 Atmega32 作为主机,连接了 LCD 屏幕,另一个 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.
}
}

从站代码:

从属代码只是一次又一次地重复一个函数,所以我不会发布整个代码,只发布中间的片段。

int main(void)
{
unsigned int byte = 1;
unsigned int toTransfer;
unsigned int mask = 0xFF;
unsigned int xx;
unsigned char toSend = 0;
TWI_init_slave(0x01); //initializing slave i2c with address
adc_init(); //initialize adc
while(1)
{
xx=adc_read(0); //reading from ADC0 of the Atmega.
toTransfer = (5.0 * xx * 100.0) / 1024; //calibrating the temperature

if (byte == 1) //send packet 1
{
toSend = toTransfer & mask; //sending the first 8 bits of data.
toTransfer = toTransfer >> 8;//right shift so that the next function will take the 8-16 bits of data.
TWI_match_write_slave(); //I2C function to verify address
TWI_write_slave(toSend); //I2C function to write data on to master
byte = 2;
}

/*Repeating this till byte 4*/

else if (byte == 4) //send packet 4
{
toSend = toTransfer & mask;
toTransfer = toTransfer >> 8;
TWI_match_write_slave();
TWI_write_slave(toSend);
byte = 1;
//initialization for next turn
mask = 0xFF;
toSend = 0;
}
}

最佳答案

在主代码中,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();
}
}

关于c - 在 Atmega 的 I2C 接口(interface)中没有得到正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com