zoukankan      html  css  js  c++  java
  • 模拟IIC协议时序

    IIC是飞利浦公司开发的两线式串行总线,主要应用在单片机和外围电子器件之间的数据通讯。

    IIC总线优点是节约总线数,稳定,快速,是目前芯片制造上非常流行的一种总线,大多数单片机已经片内集成了IIC总线接口,无需用户自己模拟,只需配置相关寄存器即可使用,但是,为了更好地理解IIC总线协议,可以自行按照IIC时序图进行模拟,加深理解。

    IIC总线有两条串行线,其一是时钟线SCK,其二是数据线SDA。

    在寻常的应用之中,单片机常常作为主机,外围器件作为从机使用。

    每一个从机器件都拥有唯一的一个地址,这个地址在芯片手册上会有详细的介绍,一般还需要自行配置芯片管脚上的高低电平,来实现确定从机地址的目的。

    硬件设计上,SCK线和SDA线通过典型的4.7K电阻进行上拉,保证两条线空闲时保持高电平状态。

    SDA上的数据在SCK高电平期间必须稳定,SDA上的数据在SCK期间才可以被更改。

    IIC总线的时序分析:

    起始信号:在SCK高电平期间,SDA一个下降沿,即构成了IIC的起始信号。

    终止信号:在SCK高电平期间,SDA一个上升沿,即构成了IIC的终止信号。

    程序上的模拟如下所示:

    1->IIC起始信号模拟程序:

     1 void IIC_start(void)
     2 {
     3     SCK=1;
     4     SDA=1;
     5     IIC_delay();
     6     SDA=0;
     7     IIC_delay();
     8     SCK=0;
     9     IIC_delay();
    10 }

    2->IIC终止信号模拟程序:

     1 void IIC_end(void)
     2 {
     3     SCK=0;
     4     SDA=0;
     5     IIC_delay();
     6     SCK=1;
     7     IIC_delay();
     8     SDA=1;
     9     IIC_delay();
    10 }

    IIC发送数据:
    在IIC一次发送8位数据,数据发送时,总是高位在前,分8次传送出去。

    IIC发送数据模拟程序:

     1 void IIC_write(unsigned char dat)
     2 {
     3     unsigned char temp;
     4     for(temp=0x80;temp!=0;temp>>=1)
     5     {
     6             if(temp&dat==0)
     7             {
     8                         SDA=0;
     9             }
    10             else
    11             {
    12                         SDA=1;
    13             }
    14             IIC_delay();
    15             SCK=1;
    16             IIC_delay();
    17             SCK=0;
    18     }
    19 }

    IIC接收应答模拟程序:

     1 bit Get_IIC_ack(void)
     2 {
     3         bit ack;
     4         SDA=1;        //释放数据线,准备接收应答
     5         SCK=1;
     6         if(SDA==1)
     7         {
     8                 ack=0;//无应答信号
     9         }
    10         else
    11         {
    12                 ack=1;//有应答信号
    13         }
    14         SCK=0;
    15         IIC_delay();
    16         return ack;
    17 }

    IIC读取数据模拟程序:

     1 unsigned char IIC_Read(void)
     2 {
     3         unsigned char temp;
     4         unsigned char dat;
     5         SDA=1; //释放总线准备接收
     6         for(temp=0x80;temp!=0;temp>>=1)
     7         {
     8                 IIC_delay();
     9                 SCK=1;
    10                 if(SDA==1)
    11                 {
    12                         dat|=temp;
    13                 }
    14                 else
    15                 {
    16                         dat&=~temp;
    17                 }
    18                 SCK=0;
    19         }
    20         return dat;
    21 }

    IIC非应答信号模拟程序:

    void IIC_No_ack(void)
    {
            SDA=1;
            SCK=1;
            IIC_delay();
            SCK=0;
            IIC_delay();
    }

    IIC应答信号模拟程序:

    void IIC_ack(void)
    {
            SDA=0;
            SCK=1;
            IIC_delay();
            SCK=0;
            IIC_delay();        
    }
  • 相关阅读:
    FreeCAD二次开发-makeChamfer创建倒角
    FreeCAD二次开发-makeFillet创建倒圆
    FreeCAD二次开发-Gui.Selection.getSelectionEx() 遍历选中的对象
    FreeCAD二次开发-Part.Ellipse创建椭圆
    FreeCAD二次开发-Part.makePolygon创建多边形
    FreeCAD二次开发-face.extrude创建拉伸
    FreeCAD二次开发-Part.Face创建面
    FreeCAD二次开发-Part.Shape合并几何元素,生成拓扑形状
    FreeCAD二次开发-Part.LineSegment创建直线
    FreeCAD二次开发-Part.Arc创建圆弧
  • 原文地址:https://www.cnblogs.com/achao123456/p/IIC.html
Copyright © 2011-2022 走看看