[求助] 单片机学习IIC的问题

xiaobaisoso   2011-10-13 20:54 楼主
这两天在学习IIC  实在是学的一头雾水   有好多问题   特意发帖  如能相助  不胜感激
首先 看一段代码:

void WriteSet(unsigned char add, unsigned char dat)
// 在指定地址addr处写入数据WriteCurrent
{
start(); //开始数据传递
WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要对其写入数据
Ask();
WriteCurrent(add); //写入指定地址
Ask();
WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据
Ask();
stop(); //停止数据传递
delaynms(4); //1个字节的写入周期为1ms, 最好延时1ms以上
}

bit Ask() //检测应答
{
bit ack_bit; //储存应答位
SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
//以让SDA线转由接收设备(AT24Cxx)控制
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
SCL = 1; //根据上述规定,SCL应为高电平
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
//若送高电平,表示没有接收到,传送异常 结束发送
SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
return ack_bit; // 返回AT24Cxx应答位
}

问题:在WriteSet 中的ASK()  为什么没有对返回值进行处理?   有可能我返回还是1   即从设备忙,不能应答     那后面的一串函数就可能出错啊    
这段代码是书上的。。。。。

回复评论 (5)

应答可以不对返回值进行处理的

应答可以不对返回值进行处理的
点赞  2011-10-15 17:01
我知道可以不处理的 但是要是发生不应答的状况 但程序岂不是不能进行判断
点赞  2011-10-15 23:18

_Justin

这本书貌似很给力啊,呵呵
要不要应答都没用吧
呵呵,没准他的意思是当从机忙的时候,等待一段时间,然后默认它送了数据,接下来继续送数据

在iic上,所有字节都是一把为数据传送的,发送器没法送一位字节后,就在第九个时钟脉冲期间释放数据线,由接收信号反馈一个应答信号。(低接受,高。。。。)
我感觉,你可以这样写啊
void ask()
{
scl=1;
delay();
while((sda==1)&(i<200))
{
  i++;
}
scl=0;
delay();
}
点赞  2011-10-16 13:32

回复 楼主 xiaobaisoso 的帖子

我也遇到同样的问题了  你若是明白的话能讲解一下吗   谢谢
点赞  2013-2-25 22:59
IIC对时序要求很严的,不过既然代码是书上的,时序本身错的可能性就比较小了,有可能是速率的问题,把速率降低一下试试,一般的IIC器件支持标准的100K速率和快速的400K速率,一些新型的片子可以支持到1M,但是在较高速率下出错的可能性也就大,先降低一下速度试试,自己算一下现在的速率是多少。有示波器的话看一下波形,与标准的时序做一下对比!
点赞  2013-2-26 21:36
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复