343|7

163

帖子

0

资源

一粒金砂(中级)

单片机+I2C通讯应答信号异常 [复制链接]

使用Proteus来进行89C52与24C02的I2C通讯仿真,实现将写入24C02的数据读出来点亮由P1控制的LED灯;发现在proteus里面LED灯不能正常按照写入的数据来点亮,而下载到开发板却是正常的。应答信号SDA波形如图;仿真图如图。


主要有如下疑问:


① 根据图示应答波形发现,SDA在SCL的下降沿期间发生了变化(拉高),这个是否正常?按照I2C应答时序图,应该是SCL拉低后一段时间SDA才能发生变化。看波形应该是24c02正常产生了应答,但是在SCL拉低时,SDA提早被释放了。


② 调试代码,将如下应答信号内的        while((sda==1)&&(i<250))i++; 这段延时给注释掉后,仿真可以正常点亮LED灯(但应答波形依旧),请问这段代码为什么会导致异常呢?
感谢指点!

void respons()  //应答
{
        uchar i;
        scl=1;
        delay();
//        while((sda==1)&&(i<250))i++;   // 注释掉此行代码后正常。
        scl=0;
        delay();
}


完整IIC代码:
***************************************************
#include<reg52.h>
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
uchar a;
void delay()
{ ;; }
void start()  //开始信号
{        
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
        scl=0;      
  delay();
}

void stop()   //停止
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
//        scl=0;
//  delay();
        
        
}

void respons()  //应答
{
        uchar i;
        scl=1;
        delay();
        while((sda==1)&&(i<250))i++;
        scl=0;
        delay();
}
//void Send_respons()            //发送应答信号,即给从机发0,如果不应答要发1,主程序中就不加这段程

序即可。
//{
//     sda=0;
//     delay();
//     scl=1;
//     delay();
//     scl=0;
//     delay();  
//}
void init()
{
        sda=1;
        delay();
        scl=1;
        delay();
}

void write_byte(uchar date)
{
        uchar i,temp;
        temp=date;

        for(i=0;i<8;i++)
        {
                temp=temp<<1;
          delay();
                sda=CY;
                delay();
                scl=1;
                delay();
          scl=0;
        }
        delay();
        sda=1;
        delay();
}

uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay();        
                k=(k<<1)|sda;
                scl=0;
                delay();        
        }
        return k;
}

void delay1(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
         for(b=100;b>0;b--);
}

void write_add(uchar address,uchar date)
{
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        write_byte(date);
        respons();
        stop();
}

uchar read_add(uchar address)
{
        uchar date;
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        delay1(100);
        start();
        write_byte(0xa1);
        respons();
        date=read_byte();        
        stop();
        return date;
}

void main()
{
        init();
        write_add(23,0xaa);
        delay1(100);
        P1=read_add(23);
        while(1);
}

此帖出自51单片机论坛
ack异常.png
仿真图.png

回复

3184

帖子

1

资源

五彩晶圆(初级)

模拟的I2C时序就跟着时序图来就行了。手册说高就高

点评

可能您没有看清我上面的问题描述哈,我贴出来的ack异常波形图,是接收应答(即24c02给的应答),sda此时被释放不受master控制。  详情 回复 发表于 2021-1-5 14:55
就是跟着时序图来写的。  详情 回复 发表于 2020-12-31 20:40
个人签名人已离开,无事别找,找也找不到。

回复

163

帖子

0

资源

一粒金砂(中级)

freebsder 发表于 2020-12-31 15:45 模拟的I2C时序就跟着时序图来就行了。手册说高就高

就是跟着时序图来写的。

点评

你这明显不是时序,既没有保持也没有延时,仔细看手册时序吧。  详情 回复 发表于 2021-1-4 21:19

回复

3184

帖子

1

资源

五彩晶圆(初级)

elec32156 发表于 2020-12-31 20:40 就是跟着时序图来写的。

你这明显不是时序,既没有保持也没有延时,仔细看手册时序吧。

个人签名人已离开,无事别找,找也找不到。

回复

163

帖子

0

资源

一粒金砂(中级)

freebsder 发表于 2020-12-31 15:45 模拟的I2C时序就跟着时序图来就行了。手册说高就高

可能您没有看清我上面的问题描述哈,我贴出来的ack异常波形图,是接收应答(即24c02给的应答),sda此时被释放不受master控制。


回复

163

帖子

0

资源

一粒金砂(中级)

当然,这个I2C运行异常不一定跟ack有关系,只是我提出来的我认为时序上的一个异常点;

另外将ack内的 while((sda==1)&&(i<250))i++; 注释掉之后程序就可以正常运行了,ack波形依旧,也证明跟这个没有关系。

但问题是为何while((sda==1)&&(i<250))i++;这条语句会对程序有影响,我没有搞明白。

这只是一条判断语句,sda也产生了应答的,那么while为假,所以执行这条语句也就是1个指令周期的时间,相当于延时了一个指令周期,为什么会有影响呢?


回复

163

帖子

0

资源

一粒金砂(中级)

分别抓取了注释while语句跟没有注释while语句的I2C调试数据与波形图,可以发现,前者正常执行了stop,后者没有,也就是说增加 while((sda==1)&&(i<250))i++; 之后,stop缺失,导致24c02没有进入写周期,数据也就没有写进去。如下是对比图:

 

时序图-0x80异常(没注释while).png
时序图-0x80异常(注释while).png

回复

3184

帖子

1

资源

五彩晶圆(初级)

把延迟时间拉长,你这波行看起来都像是变形了,不知道是不是仿真的原因。

个人签名人已离开,无事别找,找也找不到。

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/5 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表