新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > I2C的讀寫操作實驗

        I2C的讀寫操作實驗

        作者: 時間:2011-05-12 來源:網絡 收藏

        [任務]
        利用24C08斷電以后存儲的數據不消失的特點,可以做一個斷電保護裝置。首先利用單片機做一個0-99秒的自動計時器。然后隨機關斷電源,在 通電以后計時器接著斷電前的狀態繼續計時。

        本文引用地址:http://www.104case.com/article/150752.htm

        [原理]
        首先簡單的說明以下總線,總線是一種串行數據總線,只有二根信號線,一根是雙向的數據線SDA,另一根是時鐘線SCL。在 總線上傳送的一個數據字節由八位組成。總線對每次傳送的字節數沒有限制,但每個字節后必須跟一位應答位。數據傳送首先傳送最高位(MSB),數據傳送按圖1所示格式進行。首先由主機發出啟動信號“S”(SDA在SCL高電平期間由高電平跳變為低電平),然后由主機發送一個字節的數據。啟動信號后的第一個字節數據具有特殊含義:高七位是從機的地址,第八位是傳送方向位,0表示主機發送數據(寫),1表示主機接收數據(讀)。被尋址到的從機設備按傳送方向位設置為對應工作方式。標準I2C總線的設備都有一個七位地址,所有連接在I2C總線上的設備都接收啟動信號后的第一個字節,并將接收到的地址與自己的地址進行比較,如果地址相符則為主機要尋訪的從機,應在第九位答時鐘脈沖時向SDA線送出低電平作為應答。除了第一字節是通用呼叫地址或十位從機地址之外第二字節開始即數據字節。數據傳送完畢,由主機發出停止信號“P”(SDA在SCL高電平期間由低電平跳變為高電平)。
          AT24C系列串行E2PROM具有I2C總線接口功能,功耗小,寬電源電壓(根據不同型號2.5V~6.0V),工作電流約為3mA,靜態電流隨電源電壓不同為30μA~110μA,AT24C系列串行E2PROM參數如下
        型 號 容 量 器件尋址字節(8位) 一次裝載字節數
        AT24C01 128×8 1010A2A1A0 R/W 4
        AT24C02 256×8 1010A2A1A0 R/W 8
        AT24C04 512×8 1010A2A1P0 R/W 16
        AT24C08 1024×8 1010A2P1P0 R/W 16
        AT24C16 2048×8 1010P2P1P0 R/W 16
          由于I2C總線可掛接多個串行接口器件,在I2C總線中每個器件應有唯一的器件地址,按I2C總線規則,器件地址為7位數據(即一個I2C總線系統中理論上可掛接128個不同地址的器件),它和1位數據方向位構成一個器件尋址字節,最低位D0為方向位(讀/寫)。器件尋址字節中的最高4位(D7~D4)為器件型號地址,不同的I2C總線接口器件的型號地址是廠家給定的,如AT24C系列E2PROM的型號地址皆為1010,器件地址中的低3位為引腳地址A2 A1 A0,對應器件尋址字節中的D3、D2、D1位,在硬件設計時由連接的引腳電平給定。
          對AT24C系列 E2PROM的完全遵守I2C總線的主收從發和主發從收的規則。

        [C語言源程序]
        #include AT89X52.H>
        #include stdio.h>
        #include absacc.h>
        unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
        0x6d,0x7d,0x07, 0x7f,0x6f,};
        unsigned char sec; //定義計數值,每過1秒,sec加1
        unsigned int tcnt; //定時中斷次數
        bit write=0; //寫24C08的標志;
        sbit gewei=P2^0; //個位選通定義
        sbit shiwei=P2^1; //十位選通定義
        /////////24C08驅動程序////////////////////
        sbit scl=P3^4; // 24c08 SCL
        sbit sda=P3^5; // 24c08 SDA
        void delay1(unsigned char x)
        { unsigned int i;
        for(i=0;ix;i++);
        ;}
        void flash()
        { ; ; }
        void x24c08_init() //24c08初始化子程序
        {scl=1; flash(); sda=1; flash();}
        void start() //啟動I2C總線
        {sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();}
        void stop() //停止I2C總線
        {sda=0; flash(); scl=1; flash(); sda=1; flash();}
        void writex(unsigned char j) //寫一個字節
        { unsigned char i,temp;
        temp=j;
        for (i=0;i8;i++)
        {temp=temp1; scl=0; flash(); sda=CY; flash(); scl=1; flash();}
        scl=0; flash(); sda=1; flash();
        }
        unsigned char readx() //讀一個字節
        {
        unsigned char i,j,k=0;
        scl=0; flash(); sda=1;
        for (i=0;i8;i++)
        {
        flash(); scl=1; flash();
        if (sda==1) j=1;
        else j=0;
        k=(k1)|j;
        scl=0;}
        flash(); return(k);
        }
        void clock() // I2C總線時鐘
        {
        unsigned char i=0;
        scl=1; flash();
        while ((sda==1)(i255))i++;
        scl=0; flash();
        }
        ////////從24c02的地址address中讀取一個字節數據/////
        unsigned char x24c08_read(unsigned char address)
        {
        unsigned char i;
        start(); writex(0xa0);
        clock(); writex(address);
        clock(); start();
        writex(0xa1); clock();
        i=readx(); stop();
        delay1(10);
        return(i);
        }
        //////向24c02的address地址中寫入一字節數據info/////
        void x24c08_write(unsigned char address,unsigned char info)
        {
        EA=0;
        start(); writex(0xa0);
        clock(); writex(address);
        clock(); writex(info);
        clock(); stop();
        EA=1;
        delay1(50);
        }

        p2p機相關文章:p2p原理



        上一頁 1 2 下一頁

        關鍵詞: 實驗 操作 讀寫 I2C

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 昭平县| 广饶县| 永仁县| 盖州市| 庆城县| 固镇县| 襄城县| 遵化市| 湘阴县| 井研县| 佛冈县| 三江| 丰镇市| 鹤峰县| 雷波县| 错那县| 青川县| 吉隆县| 合山市| 大安市| 体育| 扎鲁特旗| 谢通门县| 灌阳县| 通许县| 磴口县| 增城市| 新干县| 崇明县| 年辖:市辖区| 鄂尔多斯市| 达拉特旗| 宣化县| 海盐县| 崇信县| 灵寿县| 柏乡县| 朝阳县| 南陵县| 来凤县| 扬州市|