• 專注電子技術學習與研究
    當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

    IIC總線時序

    作者:lch900   來源:lch900   點擊數:  更新時間:2014年05月16日   【字體:

     

     
     
    最近做的項目中涉及了IIC總線的運用
     
    IIC總線的運用范圍十分廣泛
     
    寫下博客記錄
     
     
     
    IIC總線延時 大于4.7us
     
     
     
    #define Decoded_iic_delay() \
    {\
     Decoded_iic_DELAY_TMP=Decoded_iic_DELAY_VALUE;\
     while(--Decoded_iic_DELAY_TMP);\
    }
     
    初始化
     
    void Decoded_iic_init()
    {
     Decoded_iic_SCL=1;
     Decoded_iic_delay();
     Decoded_iic_SDA=1;
     Decoded_iic_delay();
    }
     
    開始信號
     
    void Decoded_iic_start()
    {
     Decoded_iic_SDA=1; 
     Decoded_iic_delay();
     //Myputchar(Decoded_iic_SDA);
     
     Decoded_iic_SCL=1;
     Decoded_iic_delay();
     //Myputchar(Decoded_iic_SCL);
     
     Decoded_iic_SDA=0;
     Decoded_iic_delay();
     //Myputchar(Decoded_iic_SDA);
     
     Decoded_iic_SCL=0;
     Decoded_iic_delay();
     //Myputchar(Decoded_iic_SCL);
    }
     
    寫時序
     
    void Decoded_iic_write(uchar dat)
     uchar idata t=8;
     while(t--)
     {
      Decoded_iic_SDA=(bit)(dat&0x80);
      dat<<=1;
      Decoded_iic_SCL=1;
      Decoded_iic_delay();
      Decoded_iic_SCL=0;
      Decoded_iic_delay();
     }
    }
     
    讀時序
     
    uchar Decoded_iic_read()
    {
     uchar dat=0;
     uchar t=8;
     
     //Myputchar(dat);
     
     Decoded_iic_SDA=1;讀之前SDA拉高
     while(t--)
     {
      Decoded_iic_SCL=1;
      Decoded_iic_delay();
     
      dat <<= 1;一定要先移位后讀 如果先讀后移位會擠掉最高位
     
      if(Decoded_iic_SDA)
      {
       dat |= 0x01;
      }
     
      Decoded_iic_SCL=0;
      Decoded_iic_delay();
     }
     
     
     
     return dat;
    }
     
    獲取ACK
     
    bit Decoded_iic_getack()
    {
     bit ack;
     Decoded_iic_SDA=1;SDA為高釋放總線
     Decoded_iic_delay();
     Decoded_iic_SCL=1;
     Decoded_iic_delay();
     ack=Decoded_iic_SDA;
     
     Decoded_iic_SCL=0;
     Decoded_iic_delay();
     
     return ack;
    }
     
    發送ACK
     
    void Decoded_iic_putack(bit ack)
    {
     Decoded_iic_SDA=ack;
     Decoded_iic_SCL=1;
     Decoded_iic_delay();
     Decoded_iic_SCL=0;
     Decoded_iic_delay(); 
    }
     
    結束信號
     
    void Decoded_iic_stop()
    {
     uint t=Decoded_iic_WAIT_VALUE;
     Decoded_iic_SDA=0;
     Decoded_iic_delay();
     Decoded_iic_SCL=1;
     Decoded_iic_delay();
     Decoded_iic_SDA=1;
     Decoded_iic_delay();
     while(t--);
    }
     
    綜合發送
     
    bit Decoded_iic_puts(unsigned char SlaveAddr,uchar *dat,unsigned int Length)
    {
     if ( Length == 0 ) return 0;
     
     Decoded_iic_start();
     
     Decoded_iic_write(SlaveAddr);發送地址
     
     if ( Decoded_iic_getack() )
     {
      Decoded_iic_stop();
      return 1;
     }
     
    發送數據
     do
     {
      Decoded_iic_write(*dat++);
      if ( Decoded_iic_getack() )
      { 
       //Myputchar('c');
        break;
      }
     } while ( --Length != 0 );
     
     Decoded_iic_stop();
     
     if ( Length == 0 )
     {
      //Myputchar('a');
      return 0;
      
     }
     else
     {
      //Myputchar('b');
      return 1;
      
     }
    }
     
    綜合接收數據
     
    bit Decoded_iic_gets(unsigned char SlaveAddr,uchar *dat,unsigned int Length)
    {
     if(!Length)
     return 0;
     
     Decoded_iic_start();
     Decoded_iic_write(SlaveAddr+1);發送地址+1  +1是讀的意思
     
     if(Decoded_iic_getack())
     {
      Decoded_iic_stop();
      return 1; 
     }
     
     for (;;)
     {
      *dat++ = Decoded_iic_read();
      if ( --Length == 0 )
      {
       Decoded_iic_putack(1);發送非ACK
       break;
      }
      Decoded_iic_putack(0);發送ACK
     }
    //接收完畢,停止I2C總線,并返回結果
     Decoded_iic_stop();
     return 0;
    }
     
    關閉窗口

    相關文章

    亚洲一区二区制服在线|在绩专区欧美自拍日韩|青春娱乐网97超碰人人射|在线观看国产网址你懂的