标题: 关于IIC总线发送一个字节的单片机程序问题 [打印本页]

作者: tanghao8887    时间: 2019-10-7 19:12
标题: 关于IIC总线发送一个字节的单片机程序问题
以下是一段IIC的发送函数,我搞不懂的是,第一,为什么数据移位后要延时并且要让时钟先为1在延时后为0,难道这是在模拟整个发送时序吗?
第二,数据发送完成后,为何手动要将时钟和数据线置高电平?第三,为什么发送完数据并且判断完数据是否发送成功或者失败后,为什么要将时钟线拉成低电平,谢谢!

unsigned char I2cSendByte(unsigned char dat)
{
        unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。               
        for(a=0;a<8;a++)//要发送8位,从最高位开始
        {
                SDA=dat>>7;         //起始信号之后SCL=0,所以可以直接改变SDA信号
                dat=dat<<1;
                Delay10us();   (为什么这里要延时?)
                SCL=1;        (这里的时钟为什么要为1)
                Delay10us();//建立时间>4.7us
                SCL=0;       (这里为何要为0)
                Delay10us();//时间大于4us               
        }
        SDA=1;
        Delay10us();
        SCL=1;     (当发送完数据,为何要手动把时钟和数据线拉成低电平?)
        while(SDA)//等待应答,也就是等待从设备把SDA拉低
        {
                b++;
                if(b>200)         //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
                {
                        SCL=0;
                        Delay10us();
                        return 0;
                }
        }
        SCL=0;(为何发送完数据时钟要为0)
        Delay10us();
         return 1;               
}
作者: mosart    时间: 2019-10-8 08:45
第一,在发送数据的时候,已经发过START信号了,此时始终信号是低电平,所以要发送一个高电平延时再发送一个低电平就是模拟一个时钟信号。第二,数据发送完后,要释放数据线,等待接收ACK信号,时钟电平为高是发送一个SCL的高电平,等待数据线的ACK(时钟信号一般上升沿有效)。第三,SCL拉低是为下次发送做准备,这就对上了你的问题一SCL可以直接发送高电平了。f:\\123
作者: ping264888    时间: 2019-10-8 09:49
你為什麼不先去看一下IIC的通訊協議對於細節的描述.
作者: xing1988    时间: 2019-10-8 15:59
对照IIC芯片规格书的时序图就理解了
作者: xyq2576056187    时间: 2020-12-24 01:11
哇!我刚刚学到这,和楼主一模一样的问题,还是不能理解,能教教我吗?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1