搜索
bottom↓
回复: 16

I2C总线学习应答信号总结

[复制链接]

出0入0汤圆

发表于 2012-2-1 18:20:40 | 显示全部楼层 |阅读模式
这两天研究I2C总线,用51单片机,遇到了困难,被应答信号给卡住了,不过总算是解决了。

在这发个学习总结。有不对的,希望高手指点。


(原文件名:6.jpg)
上图为应答信号时序图

在单片机系统中,单片机和24c02是互为发送端和接收端的。

首先关于发送端和接收端的定义得明确一下:

发送端:往I2C总线上送数据的设备
接收端:从I2C总线上获取数据的设备

时序图上,能看出来,发送端在发送数据后,要在SCL第9个脉冲来临前把SDA拉高,以等待接收端发来ACK信号,接收端在接收到数据后,会向发送端发出ACK信号,也就是图上标的ACKNOWLEDGE

1、当单片机向2402写数据的时候,会向I2C总线发送数据,这时单片机作为发送端。
2、24c02作为接收端。反过来,读取24c02的数据时,单片机就成了接收端,2402成了发送端。

一、单片机作为发送端时,当它发送完一字节的数据后,
需要执行的语句是:
/**************************************
接收应答信号(写数据时)

检测24c02,是否产生应答信号,
若24c02,接收完一字节数据,则产生应答信号。告诉单片机已接收到数据。
若24c02,没接收到一字节数据,则产生非应答信号。告诉单片机没接收到完整的数据。此时可根据程序重复发送。
**************************************/
void recv_ack()
{
        uchar i;                                        //声明i变量,不应答时延时
        sda=1
    delay();                                        //释放SDA,等待24c02发送ACK应答信号
while((sda==1)&&(i<250))i++;// 一、若24c02发送ACK应答信号,即SDA=0,时序图的ACKNOWLEDGE信号
二、若24c02没发送ACK应答信号,即SDA=1,时序图的NOT ACKNOWLEDGE信号,则延时到I>250,默认已应答。
    scl=1;
        delay();                                         
        scl=0;
        delay();                                        //确认接收到应答信号SCL=H>L
}                                                                                                              
二、当单片机作为接收端时,如果接收多个数据,那么,在每接收完一字节的数据后,

都要执行以下语句:
/**************************************
发送应答信号(读数据时)

产生应答信号即已读完一字节
入口参数:ack (0:ACK 1:NAK)
**************************************/
void send_ack(bit ack)                        //发送DATE后,接收端SDA=L,后发送端SCL=H>L
{
sda=ack;                                        //ack=0应答ack=1不应答,
即向24c02发送ACK应答信号,说明已接收到8位数据,使24C02地址自己加1
        scl=1;
        delay();               
        scl=0;
        delay();                                         //产生应答信号SCL=H>L           delay()>=4.7us
}

如果只接受一个字节的数据,那么就不发送ACK,这个时候,
要发送非应答信号即SDA=1,时序图的NOT ACKNOWLEDGE信号
就要把SDA置高,即执行语句:SDA=1

把ACK置1,后产生STOP信号,告诉24C02单片机停止接收数据,不用再发送了……

应答信号总结ourdev_715457OP12II.doc(文件大小:51K) (原文件名:I2C总线学习应答信号总结.doc)

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-2-1 19:07:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-1 21:08:41 | 显示全部楼层
严格对照着时序图写代码就好办了 当初写1602就是这样做的

出0入0汤圆

发表于 2012-2-1 22:40:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-2 08:43:33 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-2-2 22:49:57 | 显示全部楼层
自己还有点问题,学习中

出0入0汤圆

发表于 2012-2-3 11:01:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-18 08:42:28 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2012-2-19 16:52:48 | 显示全部楼层
楼主,也是在广州上班的吗?我是在广州上班的,有空可以交流下。我现在也在自学单片机

出0入0汤圆

发表于 2012-2-26 22:35:20 | 显示全部楼层
不错,学习下

出0入0汤圆

发表于 2012-2-27 00:22:00 | 显示全部楼层
很好!学习一下!

出0入0汤圆

发表于 2012-3-5 13:50:23 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2012-3-10 17:19:13 | 显示全部楼层
回复【9楼】yhgwork  
-----------------------------------------------------------------------

在广州上学,呵呵呵~~

出0入0汤圆

发表于 2012-3-23 21:14:11 | 显示全部楼层
可以哟。。其实还有很多不标准的I2C总线。小伙子

出0入0汤圆

发表于 2012-4-12 10:31:05 | 显示全部楼层
谢谢啊,正在学习中...

出0入0汤圆

发表于 2013-1-26 21:58:26 | 显示全部楼层
感激不尽!为了这个,苦了我1个多小时,看了楼主的帖子,瞬间明白了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 18:18

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

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