问题是刚从睡眠中醒来后的一个或几个失败的TWI交易。在连接到XMega的I2C总线上,我们有几个电位器,一个温度计和一个RTC。 XMega是公交车上唯一的主人。
我们使用AVRLIBC中的睡眠功能:
{code for turning of VCC to all I2C connected devices}
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
{code for turning on VCC to all I2C connected devices}
由RTC从睡眠中唤醒的XMega将引脚设置为高电平。在XMega从睡眠中唤醒之后,我们想要在其中一个电位器上设置一个值,但这会失败。出于某种原因,TWI事务结果在第一个事务中是TWIM_RESULT_NACK_RECEIVED而不是TWIM_RESULT_OK。之后,一切似乎都再次发挥作用。
我们错过了什么吗? XMega,睡眠和TWI有任何已知问题吗?从睡眠中醒来后,我们是否需要重置清除任何标志的TWI?
祝你好运 弗雷德里克
答案 0 :(得分:2)
I2C / TWI存在一个常见问题,即如果事务未完全完成,内部状态机将陷入中间状态。然后,当在下一个事务中寻址时,从设备不会正确响应。这通常发生在主机复位或停止通过读或写部分输出SCK信号时。解决方案是在开始任何数据事务之前手动切换SCK线8或9次,以便从站中的内部状态机全部重置为传输点的开始,然后它们都在寻找它们的地址字节。