历史上的今天
今天是:2025年02月26日(星期三)
2020年02月26日 | 在Proteus 6.9中调试I2C设备的方法
2020-02-26 来源:eefocus
刚开始调试TWI总线与AT24C02连接时,因为我是第1次以硬件的方式实现I2C,因此走了几天的弯路。今天完全调试通了。写些调试经验,省得以后有人继续走弯路。
可以这么说,利用Proteus调试I2C还是很方便的,比如在图纸上连接好MEGA8和AT24C02后,如果要看I2C调试情况,可以用两种方法:
第1种方法是在I2C总线上多连接一个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 main Simulation Log,即是否将记录下来的情况写到主窗口仿真Log文件。如果要看到Log的情况,该选项必须选Yes,否则看不到历史记录。如果24C系列的元件接收或者发送标志信息和数据信息,在主窗口的Log文件中可以看到这些信息记录。具体看的方法是在System菜单中单击Text Viewer即可。
下面谈几点Proteus中24c系列元件的调试特点。
原理图中放好的24c系列元件的某地址一旦被正确写入数据,无论是否停止调试或者重新装入数据文件或者重新装入该原理图,该数据仍然保持。很神奇吧。我在Proteus 6.9sp4中发现了这个问题,这个情况和我们想象的情况完全不同。
另外,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自动切换到主机读状态,等待一点时间后,如果读到东西,就可以在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的手册中也没有提到这个事,最后搞了好久,脑袋突然灵光起来才试出来的。
写下此文,与君共勉。
史海拾趣
|
原来是做软件开发的,C系的语言学的还可以。 C语言 C++ VC++ C# 都学过,java VB PHP ASP之类的也学了一些。 有一点电子基础,能看懂简单一点的线路图。 关于与非门 或非门的有点晕。 现在学C51 弄了一个学习板,已经可以 ...… 查看全部问答> |
|
Wince智能设备C#开发中,如何把byte[]装换为Bitmap或者Image??[ 网上通常的转换都是.net的,在.net Compact中Image没有 FromStream函数。 我目前用的代码是: MemoryStream ms = new MemoryStream(byteArrayIn,index,count); Bitmap returnImage = nu ...… 查看全部问答> |
|
现在我的WINCE环境下有日文的输入法,但是日文输入法中还有几种的输入法,比如直接英文输入,全角平假输入,半角平假输入等等. 我现在下当打开系统的软键盘时,输入法自动设置为半角平假输入状态.该如何设置呢? 我想通过调用\"keybd_event\"这个API,向 ...… 查看全部问答> |
|
以下的显示小程序在实验板上为什么总有拖尾,请大家帮忙看看.谢谢 #include #define uchar unsigned char uchar table[10]={0xf9,0xa4,0xb0,0x99}; char act[4]={0xfe,0xfd,0xfb,0xf7}; char disp[4]; void dl_ms(int t) {uchar j, i; for( ...… 查看全部问答> |
|
WHEN s0 => DX_red<=\'0\';NB_yellow<=\'0\';DX_green<=\'1\' ; NB_red<=\'1\'; IF clk_1s\'EVENT AND clk_1s=\'1\' THEN &n ...… 查看全部问答> |
|
【重要新闻】意法半导体正式发布超低功耗的STM32L系列产品 STMicroelectronics Unveils STM32L Ultra-Low-Power ARM Cortex?-M3 based Microcontrollers for ‘Energy-Lite’ Applications Efficient STM32L series leverages ST’s 130nm low-power technology platform to deliver excellent 32-bit ...… 查看全部问答> |
|
我按lm567的典型选频电路搭建,5、6脚的电阻电容分别为10k、104,根据给出的中心频率计算公式f=1/(1.1rc)可得f=900hz左右,1、2脚电容我选223和103,理论上是不是应该在输入为900Hz、幅度>25mv时,在8脚有低电平信号输出(已接上拉)。但现实情况是 ...… 查看全部问答> |
|
大家好,我想问一下,有人了解数字型加速度计吗? 不知道数字型加速度计的灵敏度的单位从count/g或者g/digit转换成v/g该如何转换! 还有数字型的加速度计分辨率的单位如何从Bit转换成ug呢?… 查看全部问答> |




