使用 AVR TWI 接口的问题
Posted
技术标签:
【中文标题】使用 AVR TWI 接口的问题【英文标题】:Issue with using AVR TWI interface 【发布时间】:2013-02-13 12:43:51 【问题描述】:我正在尝试使用 atmega2560 访问 HMC5883L 模块。我编写了一个类 (I2C),其中包含 I2C 通信所必需的基本方法。
首先,我将解释问题。这就是我所做的。
int main()
I2C i2c; //an object with basic I2C communication methods
i2c.init();
i2c.start();
i2c.sendSLAW();
...
i2c.write(...);
... //configure registers, CRA, CRB, MR ...
i2c.stop();
while (1)
i2c.start();
i2c.sendSLAR();
.... //read x,y,z register values
i2c.stop();
.... //say, display x,y,z readings
_delay_ms(500);
(考虑术语有它们的普通含义。SLAW = SLA+W(从地址+写入)...)
一切都很顺利,直到进入 while 循环。在循环中,它似乎被困在i2c.stop()
i2c.stop()
是这样实现的;
void I2C::I2C_stop()
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
while (TWCR & (1<<TWSTO));
我做错了吗?我该如何解决这个问题?
(所有其他功能都按照数据表示例简单实现。)
【问题讨论】:
【参考方案1】:while (TWCR & (1<<TWSTO));
看起来不对。 TWSTO 标志表示停止,并且您正确地写入它以停止。但它保持为 1,这会产生一个无限循环。如果有的话,你会想要的
while !(TWCR & (1<<TWSTO));
但代码示例根本没有循环。
【讨论】:
以上是关于使用 AVR TWI 接口的问题的主要内容,如果未能解决你的问题,请参考以下文章