<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> 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;
        }
         
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮