<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    以C語言理解I2C總線:邊看源代碼邊讀波形

    發布時間:2015-1-23 09:47    發布者:designapp
    關鍵詞: I2C總線 , 時序 , SDA , SCL

            I2C 只是用兩條雙向的線,一條 Serial Data Line (SDA) ,另一條Serial Clock (SCL)。
    SCL:上升沿將數據輸入到每個EEPROM器件中;下降沿驅動EEPROM器件輸出數據。(邊沿觸發)
    SDA:雙向數據線,為OD門,與其它任意數量的OD與OC門成"線與"關系。
    為了加深對I2C總線的理解,用C語言模擬IIC總線,邊看源代碼邊讀波形:
    如下圖所示的寫操作的時序圖:



    讀時序的理解同理。對于時序不理解的朋友請參考“I2C總線概述及時序總結”
    完整的程序如下:
    #include
    #define uchar unsigned char
    #define uint unsigned int
    #define write_ADD 0xa0
    #define read_ADD 0xa1
    uchar a;  
    sbit SDA=P2^0;
    sbit SCL=P2^1;
    void SomeNop();     //短延時
    void init();    //初始化
    void check_ACK(void);
    void I2CStart(void);
    void I2cStop(void);
    void write_byte(uchar dat);//寫字節
    void delay(uint z);
    uchar read_byte();     //讀字節
    void write(uchar addr,uchar dat);  //指定地址寫
    uchar read(uchar addr);       //指定地址讀
    bit flag;  //應答標志位
    void main()
    {
        init();
        write_add(5,0xaa); //向地址5寫入0xaa
        delay(10);      //延時,否則被坑呀。!
         P1=read_add(5);      //讀取地址5的值
         while(1);   
    }

    //***************************************************************************  
    void delay()//簡單延時函數  
    { ;; }  
    //***************************************************************************  
    void start()  //開始信號 SCL在高電平期間,SDA一個下降沿則表示啟動信號  
    {     
        sda=1; //釋放SDA總線  
        delay();  
        scl=1;  
        delay();  
        sda=0;  
        delay();  
    }  
    //***************************************************************************  
    void stop()   //停止 SCL在高電平期間,SDA一個上升沿則表示停止信號  
    {  
        sda=0;  
        delay();  
        scl=1;  
        delay();  
        sda=1;  
        delay();  
    }
    //***************************************************************************  
    void respons()  //應答 SCL在高電平期間,SDA被從設備拉為低電平表示應答  
    {  
        uchar i;  
        scl=1;  
        delay();
        //至多等待250個CPU時鐘周期
        while((sda==1)&&(i
    本文地址:http://www.portaltwn.com/thread-144971-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    lindeijun 發表于 2018-10-22 22:17:19
    謝謝樓主分享
    王胖子 發表于 2016-6-30 08:53:41
    學習了
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • 你仿真過嗎?使用免費的MPLAB Mindi模擬仿真器降低設計風險
    • 更佳設計的解決方案——Microchip模擬開發生態系統
    • Cortex-M4外設 —— TC&TCC結合事件系統&DMA優化任務培訓教程
    • 想要避免發生災難,就用MPLAB SiC電源仿真器!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷