关于I2C传输协议的一些问题

2019-07-15 18:27发布

I2C关于开始和结束是这么说的SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
我在编程的时候这么写
void start()                //开始信号
{
        scl=1;
        delay();
        sda=1;
        delay();
        sda=0;
        delay();
}
void stop()                        //结束信号
{
        scl=1;
        delay();
        sda=0;
        delay();
        sda=1;
        delay();
}

这么写不能实现功能。而改成下面这样就可以了:
void start()  //开始信号
{       
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
}
void stop()   //停止
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}

感觉时序上是一样的啊,求助!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
狂客
1楼-- · 2019-07-15 22:57
 精彩回答 2  元偷偷看……
shitmanjqq
2楼-- · 2019-07-16 01:38
狂客 发表于 2014-9-25 17:00
你是看《新概念51单片机C语言教程》吗?那个I2C里有说。数据位的有效性规定,在SCL高电平时,要求SDA是稳定 ...

看的是郭天祥的书本,可是对于起始和终止信号就是在SCL为高电平期间SDA发生跳变啊,书上这么介绍的:SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。我两个函数都是使SCL为高,改变SDA的状态。
狂客
3楼-- · 2019-07-16 07:14
本帖最后由 狂客 于 2014-9-25 17:22 编辑
shitmanjqq 发表于 2014-9-25 17:15
看的是郭天祥的书本,可是对于起始和终止信号就是在SCL为高电平期间SDA发生跳变啊,书上这么介绍的:SCL ...

,我之前说错了,没表达好,意思是,只能变一次。而你是变两次了。。。。。我修改 了之前错误的表达,你再看看。
shitmanjqq
4楼-- · 2019-07-16 08:11
狂客 发表于 2014-9-25 17:17
,我之前说错了,没表达好,意思是,只能变一次。而你是变两次了。。。。。我修改 了之前错误的表达,你再 ...

我调了一下,出问题的是stop函数,两个start都可以使用,可能是start跟在void init(){
        sda=1;
        delay();
        scl=1;
        delay();
}
后面,时序上不会出现二次跳变。而stop是跟在
void respons()         //应答
{
        uchar i;
        scl=1;
        delay();
        while((sda==1)&&(i<250))i++;
        scl=0;
        delay();
}
后面,是不是在执行完应答函数之后sda已经变成高电平了?只有这样才会像你说的在SCL高电平期间产生二次跳变。



狂客
5楼-- · 2019-07-16 09:16
我发现我好像似乎没有解决你的问题。。。。。你可能是纠结于P181那个图,话说,在一个SCL高电平期间SDA做两次变化,真没试过。(我猜要么在一个SCL高电平期间SDA做两次变化不行,要么你delay不够,你试试延长delay)。呵呵,我也是半桶水而已。
dusqq
6楼-- · 2019-07-16 14:13
 精彩回答 2  元偷偷看……

一周热门 更多>