搜索
bottom↓
回复: 5

proteus的I2C总线读写调试 24c02 EEPRAM I2C总线一个神奇的问题

[复制链接]

出0入0汤圆

发表于 2011-11-8 10:56:10 | 显示全部楼层 |阅读模式
昨天学习I2C总线读写24C02,实物上总有问题,所以搬到了PROTEUS上来,用I2C DEBUGGER调试了下,发现了一个很奇怪的问题,上网搜了下,说这个的问题很少.所以贴出来,请各位大侠指导.
问题是这样的,我写了I2C的协议的一些函数,然后向24C02写一组数据,然后再把刚才写进去的数据读出来,以检测我写的函数的正确性.
源程序如下:
void main()
{
        U8 data dataWr[6]        = { 1,2,3,4,5,6};                //存到24C02的数据
        U8 data dataRd[6] = 0;                                        //从24c02读出来的数据存放处
        SendNByteData(dataWr, 0x00, 6);  
        ReceiveNByteDAta(0x00,dataRd,6);   
        while(1);       
}


//===============================================================
//        name   : void SendNByteData(U8 *dat,U8 addr,U8 byteLength)
//  fuction: 从发送N字节长度数据 ,N = byteLength,写入以addr为起始地址的数据区
//  input  :  U8 *dat:数据指针(或数组),byteLength:数据长度(以字节单位)                 
//  output :  1: 读写成功   0: 读写失败
//===============================================================
bit SendNByteData(U8 *dat, U8 addr, U8 byteLength)
        {
                U8 i = 0;
                bit bStart = 0;          //启动标志
                I2C_Stop(); //停止总线,总线初始化
                bStart = I2C_Start();
                if (!bStart) return 0; //启动失败,返回读写失败
                I2C_SendByte(0xa0);   //I2C从地址,写
                I2C_ReadAck(); //读取应答
                I2C_SendByte(addr);          //发送起始地址
                I2C_ReadAck();
                for (i = 0; i < byteLength; i++)
                {
                        I2C_SendByte(*(dat+i));
       
                        I2C_ReadAck();        //接收应答       
                }
                I2C_Stop(); //停止总线
                return 1;
        }

//===============================================================
//        name   : bit ReceiveNByteDAta(U8 *dat; U8 byteLength)
//  fuction: 接收N字节数据,数据从addr字址读出,存在变量dat指向的N个字节数据区段,N = byteLength;
//  input  :  void
//  output :  TRUE : 读写成功   FALSE: 读写失败
//===============================================================
bit ReceiveNByteDAta(U8 addr, U8 *dat, U8 byteLength)
{

       
        U8 i = 0;
        bit bStart = 0;          //启动标志
        I2C_Stop(); //总线初始化
        bStart = I2C_Start();
        if (!bStart) return 0; //启动失败,返回读写失败
        I2C_SendByte(0xa0);   //I2C从地址,写
        I2C_ReadAck();//读取应答                     ************************   问题一
        I2C_SendByte(addr);          //发送读起始地址
        I2C_ReadAck();
        I2C_Start();           //依据时序,再次启动
        I2C_SendByte(0xa1);   //i2c从地址,读,设置字地址后主设备读读数据模式由写数据转读数据)
        I2C_ReadAck();
        for (i = 0; i < byteLength - 1; i++)
        {
                *(dat + i) = I2C_ReceiveByte();
                I2C_SendAck();        //发送应答       
        }
        *(dat + i) = I2C_ReceiveByte(); //最后一个字节数据,要发送非应答
        I2C_SendNoAck();  //发送非应答,通知停止发送方发送数据
        I2C_Stop(); //停止总线
        return 1;
}

Proteus原理图见图一,

(原文件名:图片一1.jpg)


这里有一个很神奇的问题:
问题一: 将上面函数写入proteus的单片机,发现main函数中: 第一个函数SendNByteData(dataWr, 0x00, 6); 所行完毕,很正常,第二个函数        ReceiveNByteDAta(0x00,dataRd,6);   竟然在第一个读取应答处,读到的不是应答信号,而是非应答信号.(注意两个函数前面部分是一样的代码,可是第一个函数都一步执行到尾了,第二个函数竟然没有应答啊?????????这是为什么)  ,proteus里的ic2 debuuger  调试结果见图二:


(原文件名:图二二.jpg)

问题二 :   当我将主函数将SendNByteData(dataWr, 0x00, 6)备注掉之后 ,即主函数是:
void main()
{
        U8 data dataWr[6]        = { 1,2,3,4,5,6};                //存到24C02的数据
        U8 data dataRd[6] = 0;                                        //从24c02读出来的数据存放处
        //   SendNByteData(dataWr, 0x00, 6);  
        ReceiveNByteDAta(0x00,dataRd,6);   
        while(1);       
}
神奇的一刻到了,,,,,,,,!!!!!!!!!!!!!!!!!!!!第二个函数,竟然可以完全执行完了,,,在问题一处出现的没有应答而卡住了的问题,竟然没有问题了,,,,,,,,!!!?????????,,,, proteus里的ic2 debuuger  调试结果见:见图三


(原文件名:图三三.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-11-8 21:49:01 | 显示全部楼层
没人顶,,,,自己来一个

出0入0汤圆

 楼主| 发表于 2011-11-8 22:48:31 | 显示全部楼层
啊哈,,,,原来我忽略了写周期,,,,,呜呼呜呼,,,,,搞了我半天,,,,,,,,

出0入0汤圆

发表于 2011-11-9 12:35:19 | 显示全部楼层
笑而不语。。。。

出0入0汤圆

发表于 2012-4-5 17:00:58 | 显示全部楼层
写周期是不是等待24c02内部将数据存入指定地址。我的写周期设为for(10000)延迟,还有没有反应。。。。。。

出0入0汤圆

发表于 2012-4-5 17:15:12 | 显示全部楼层
youthdou 发表于 2012-4-5 17:00
写周期是不是等待24c02内部将数据存入指定地址。我的写周期设为for(10000)延迟,还有没有反应。。。。。。 ...

代码敲错了,导致没延迟。。。。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 00:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表