51单片机关于IIC的问题
答案:3 悬赏:60 手机版
解决时间 2021-11-17 04:49
- 提问者网友:容嬷嬷拿针来
- 2021-11-16 20:51
51单片机关于IIC的问题
最佳答案
- 五星知识达人网友:白昼之月
- 2021-11-16 21:14
在主机发送应答信号后,把数据总线拉高,就是为了下一步检测从机的应答信号,这程序是连续的,既然前面的程序已经拉高了,准备检测从机的应答信号了,就不用再拉高一次啦,如果你愿意再拉一次也行啊。追问bit test() //检测从机应答信号
{
SCL=1; //把总线拉高 检测SDA的电平
delay();
if(SDA)
{
SCL=0;
_nop_();
stop();
return(0);
}
else
{
SCL=0;
_nop_();
return(1);
SCL=0;
_nop_();
SDA=1;
_nop_();
请问 加上上面这四条也可以 吗?
}
}追答是这四条吗:
SCL=0;
_nop_();
SDA=1;
_nop_();
加在这里,可就没有一点作用了,因为前面有一条return(1);这已经从子程序返回了,后面的就不会再执行了。你这不是马后炮吗?
{
SCL=1; //把总线拉高 检测SDA的电平
delay();
if(SDA)
{
SCL=0;
_nop_();
stop();
return(0);
}
else
{
SCL=0;
_nop_();
return(1);
SCL=0;
_nop_();
SDA=1;
_nop_();
请问 加上上面这四条也可以 吗?
}
}追答是这四条吗:
SCL=0;
_nop_();
SDA=1;
_nop_();
加在这里,可就没有一点作用了,因为前面有一条return(1);这已经从子程序返回了,后面的就不会再执行了。你这不是马后炮吗?
全部回答
- 1楼网友:英雄的欲望
- 2021-11-16 23:14
在检测从机应答时,主机释放SDA数据总线,间隔一定时间后从机拉低SDA一段时间作为从机的应答,同时主机一直在检测SDA总线是否被从机拉低,检测到时说明双方准备好了,开始通信。如果超过设定时间主机没有检测到从机的应答,则主机重复上一动作直至从机应答。
- 2楼网友:玩家
- 2021-11-16 22:26
为什么主机发送应答信号完毕的时候要把SDA置1如下:
--置一后,才能正确输入对方送来的高低电平。
但是在检测从机应答的时候却不用把SDA置1呢如下:
--应该,在此之前,先置一了。追问对的,在检测从机应答之前 把SDA拉高了 为什么在这个函数之后 为什么不把SDA再次拉高呢?
bit test() //检测从机应答信号
{
SCL=1; //把总线拉高 检测SDA的电平
delay();
if(SDA)
{
SCL=0;
_nop_();
stop();
return(0);
}
else
{
SCL=0;
_nop_();
return(1);
}
}追答为什么在这个函数之后 为什么不把SDA再次拉高呢?
--这个函数,并没有对其拉低,所以,
--在这个函数之后,并不需要把SDA再次拉高。
--外部输入的低电平,并不算,不必讨论。追问之前有个 if(sda)如果SDA为低电平的话 就直接返回1不用管了吗?追答返回了,你还想管些什么事?
返回了,这次操作就完成了,你还纠结拉不拉高,有什么意义?
--置一后,才能正确输入对方送来的高低电平。
但是在检测从机应答的时候却不用把SDA置1呢如下:
--应该,在此之前,先置一了。追问对的,在检测从机应答之前 把SDA拉高了 为什么在这个函数之后 为什么不把SDA再次拉高呢?
bit test() //检测从机应答信号
{
SCL=1; //把总线拉高 检测SDA的电平
delay();
if(SDA)
{
SCL=0;
_nop_();
stop();
return(0);
}
else
{
SCL=0;
_nop_();
return(1);
}
}追答为什么在这个函数之后 为什么不把SDA再次拉高呢?
--这个函数,并没有对其拉低,所以,
--在这个函数之后,并不需要把SDA再次拉高。
--外部输入的低电平,并不算,不必讨论。追问之前有个 if(sda)如果SDA为低电平的话 就直接返回1不用管了吗?追答返回了,你还想管些什么事?
返回了,这次操作就完成了,你还纠结拉不拉高,有什么意义?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯