找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4068|回复: 13
收起左侧

i2c的应答问题 求指教

[复制链接]
ID:34668 发表于 2012-2-22 01:40 | 显示全部楼层 |阅读模式

这东西搞了两天了 ,好生郁闷

一个字节的数据传完后 要返回一个ack

void respons()  //应答
{
 uchar i;
 scl=1;
 delay();
 while((sda==1)&&(i<250))i++;
 scl=0;
 delay();
}

这个返回里并没有对返回值操作呀  难道是器件自发的返回ack? 如果返回的标志是sda=0 那为什么有一定的时间限制呢? 求解答。。

回复

使用道具 举报

ID:27916 发表于 2012-2-22 09:01 | 显示全部楼层
首先要知道I2C是低电平准备数据,高电平读取数据
[此贴子已经被作者于2012-2-22 15:38:46编辑过]
回复

使用道具 举报

ID:27916 发表于 2012-2-22 09:01 | 显示全部楼层

SCL=1;

准备读取ACK

[此贴子已经被作者于2012-2-22 15:40:54编辑过]
回复

使用道具 举报

ID:27916 发表于 2012-2-22 09:03 | 显示全部楼层
在SCL=1;的情况下,从机输出是不变的
[此贴子已经被作者于2012-2-22 15:41:32编辑过]
回复

使用道具 举报

ID:27916 发表于 2012-2-22 09:05 | 显示全部楼层

先不考虑I

如果这个时候SDA==1为假,也就是说有ACK信号了,那么跳过后面的语句,直接SCL=0

回复

使用道具 举报

ID:27916 发表于 2012-2-22 09:05 | 显示全部楼层

ACK信号读取成功

回复

使用道具 举报

ID:27916 发表于 2012-2-22 09:07 | 显示全部楼层

在考虑I

如果SDA==1为真,也就是SDA是高,没有收到ACK,这个时候通过I来做一段延时, 延时到再退出

[此贴子已经被作者于2012-2-22 15:43:12编辑过]
回复

使用道具 举报

ID:27916 发表于 2012-2-22 09:10 | 显示全部楼层

如果在一定的时间内没有读到ACK,说明通讯失败,在你上面的程序里,没有标记失败的变量,是按照正常情况来退出的,一般来说I2C器件都不会出现这种失败的情况,但为了程序的可靠性,应该在以上一段程序后增加STOP,不知道你没有帖出来的程序里时候有

 

以上仅供参考!

回复

使用道具 举报

ID:34668 发表于 2012-2-22 13:17 | 显示全部楼层

谢谢耐心的解答 , 不过i2c不是clk高电平读取数据 低电平是准备阶段吗  低电平的时候允许sda改变   还有个新问题 有人写延时函数的时候是

void delay()
{; ;}
这是不是和
{_nop_();_nop_(); }是一样的意思??
百度不让查这个符号 麻烦大神解答一下。

回复

使用道具 举报

ID:34668 发表于 2012-2-22 14:15 | 显示全部楼层
.应该不是一样的意思 两个延时时间不同  不过上面那个到底是什么意思呢。。
回复

使用道具 举报

ID:27916 发表于 2012-2-22 15:38 | 显示全部楼层
这个不好意思,写错了,是低电平准备数据,高电平取数据
回复

使用道具 举报

ID:65341 发表于 2014-9-14 14:17 | 显示全部楼层
SCL在高电平期间,SDA
回复

使用道具 举报

ID:65341 发表于 2014-9-14 14:20 | 显示全部楼层
SCL在高电平期间,SDA被从设备拉为低电平表示应答。  首先第四行scl=1;表示先把SCL拉高,等待从设备将SDA拉低,也就是ack信号,等待250个操作后,不再等待SCL拉低退出
回复

使用道具 举报

ID:75031 发表于 2015-5-25 10:48 | 显示全部楼层
这对于我也是一个重难点
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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