1、在 Proteus 中调试 I2C 设备的方法这几天因为一个想法,因此,开始利用 MEGA8 和 AT24C02 调试 I2C 总线。大家都知道,AVR 是没有 I2C 总线的,取而代之的是 TWI 总线,听说是避免向菲利普缴纳专利费。刚开始调试 TWI 总线与 AT24C02 连接时,因为我是第 1 次以硬件的方式实现 I2C,因此走了几天的弯路。今天完全调试通了。写些调试经验,省得以后有人继续走弯路。可以这么说,利用 Proteus 调试 I2C 还是很方便的,比如在图纸上连接好 MEGA8 和AT24C02 后,如果要看 I2C 调试情况,可以用两种方法:第 1 种方法是在 I2C 总线
2、上多连接一个 I2C Debugger 仪器,在仿真调试期中,该仪器可以显示 I2C 数据传送时间、S (START 状态)、Sr(ReStart 状态)、A(Ask 响应)、N (No ask 状态)、P(Stop 状态)、数据(同时显示数据的 16 进制值和每位的值)。通过查看 I2C Debugger 窗口的显示,可以知道 I2C 总线上发送和接受的数据是否正确。第 2 种方法是利用 24C 系列的 I2C EEPROM 元件属性设置中的 Log 功能。这些 Log 功能默认情况下是 No,即不使用。我们可以把它设置成 Yes。特别要提到的一点:这些 Log功能的最后一项是 Log to
3、 main Simulation Log,即是否将记录下来的情况写到主窗口仿真Log 文件。如果要看到 Log 的情况,该选项必须选 Yes,否则看不到历史记录。如果 24C系列的元件接收或者发送标志信息和数据信息,在主窗口的 Log 文件中可以看到这些信息记录。具体看的方法是在 System 菜单中单击 Text Viewer 即可。下面谈几点 Proteus 中 24c 系列元件的调试特点。原理图中放好的 24c 系列元件的某地址一旦被正确写入数据,无论是否停止调试或者重新装入数据文件或者重新装入该原理图,该数据仍然保持。很神奇吧。我在 Proteus 6.9sp4 中发现了这个问题,这个
4、情况和我们想象的情况完全不同。另外,24c02 元件的读写必须按照以下方法进行:读。AVR 必须先发送 START 位,然后检测总线是否在控制下,很多情况下,TWI_STATUS 返回 TW_START、TW_REP_START 或者都可以继续传送。接下来传送【地址|TW_WRITE 】,然后,检查 TWI_STATUS,如果正确,应该返回 TW_MT_SLA_ACK,然后就可以发送地址字节,如果发送成功,TWI_STATUS 返回 TW_MT_DATA_ACK,接下来就可以继续发送 START 位、【地址|TW_READ 】, 然后 AVR 自动切换到主机读状态,等待一点时间后,如果读到东西
5、,就可以在 TWI_STATUS 中检测到 TW_MR_DATA_ACK 或者 TW_MR_DATA_NACK,TWDR 中得到的就是读出的数据。值得注意的是,在 Proteus 仿真时,响应很慢,很多时候 TWI_STATUS 中得到是TW_NO_INFO(无信息),出现这种情况是因为 AVR 收到应答信号后,还需要等一点时间TWI_STATUS 中的值才会更新。为了读到正确的数据,可以在 TWINT 置位后,等上了几十个微妙,然后就可以得到正确的 TWI_STATUS 的值了。究其原因,我估计是当数据发送出去或者接受完毕后,TWINT 就置位了,但是ACK/NACK 还需要一点时间才能收到,这样就差了一点时间才能收到正确的 TWI_STATUS的值。这个问题搞了我很久,也和想象中的不一样,而且 MEGA8 的手册中也没有提到这个事,最后搞了好久,脑袋突然灵光起来才试出来的。