新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > I2C串行總線的操作程序

        I2C串行總線的操作程序

        作者: 時間:2012-08-15 來源:網絡 收藏
        起始信號(時鐘線為高,數(shù)據(jù)線由高變低):

        void AT24C04_Start()

        {

        SDA = 1; //拉高數(shù)據(jù)線

        SCL = 1; //拉高時鐘線

        Delay5us(); //延時

        SDA = 0; //產生下降沿

        Delay5us(); //延時

        SCL = 0; //拉低時鐘線

        }

        結束信號:(時鐘線為高,數(shù)據(jù)線由低變高)

        void AT24C04_Stop()

        {

        SDA = 0; //拉低數(shù)據(jù)線

        SCL = 1; //拉高時鐘線

        Delay5us(); //延時

        SDA = 1; //產生上升沿

        Delay5us(); //延時

        }

        字節(jié)傳輸:(每個字節(jié)為8位,一個字節(jié)帶一個相應位)

        發(fā)送數(shù)據(jù):

        void AT24C04_SendByte(BYTE dat)

        {

        BYTE i;



        for (i=0; i8; i++) //8位計數(shù)器

        {

        dat = 1; //移出數(shù)據(jù)的最高位

        SDA = CY; //送數(shù)據(jù)口

        SCL = 1; //拉高時鐘線

        Delay5us(); //延時

        SCL = 0; //拉低時鐘線

        Delay5us(); //延時

        }

        AT24C04_RecvACK();

        }

        接收數(shù)據(jù):

        BYTE AT24C04_RecvByte()

        {

        BYTE i;

        BYTE dat = 0;



        SDA = 1; //使能內部上拉,準備讀取數(shù)據(jù)

        for (i=0; i8; i++) //8位計數(shù)器

        {

        dat = 1;

        SCL = 1; //拉高時鐘線

        Delay5us(); //延時

        dat |= SDA; //讀數(shù)據(jù)

        SCL = 0; //拉低時鐘線

        Delay5us(); //延時

        }



        return dat;

        }

        數(shù)據(jù)響應:

        每次數(shù)據(jù)傳輸成功后,接收器件發(fā)送一個應答信號,當?shù)诰艂€信號產生是,產生應答信號的器件將SDA拉低。

        接收起始條件和從地址后,應答,選擇讀寫操作。

        寫操作,每接收一個字節(jié),24c02發(fā)送一個應答信號。

        讀操作,發(fā)送一字節(jié)后釋放總線,等待應答信號。接收到應答信號繼續(xù)傳輸數(shù)據(jù),接收到非應答信號,等待接收結束信號。

        讀數(shù)據(jù)時發(fā)送應答信號

        void AT24C04_SendACK(bit ack)

        {

        SDA = ack; //寫應答信號

        SCL = 1; //拉高時鐘線

        Delay5us(); //延時

        SCL = 0; //拉低時鐘線

        Delay5us(); //延時

        }

        寫數(shù)據(jù)時接收應答信號

        bit AT24C04_RecvACK()

        {

        SCL = 1; //拉高時鐘線

        Delay5us(); //延時

        CY = SDA; //讀應答信號

        SCL = 0; //拉低時鐘線

        Delay5us(); //延時



        return CY;

        }

        頁寫和也讀程序:

        void AT24C04_WritePage()

        {

        BYTE i;



        AT24C04_Start(); //起始信號

        AT24C04_SendByte(0xa0); //發(fā)送設備地址+寫信號

        AT24C04_SendByte(0x00); //發(fā)送存儲單元地址

        for (i=0; i16; i++)

        {

        AT24C04_SendByte(TESTDATA[i]);

        }

        AT24C04_Stop(); //停止信號

        }



        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 连平县| 西安市| 东宁县| 夏河县| 梁山县| 兴海县| 喀喇沁旗| 隆安县| 大安市| 阳朔县| 西乡县| 莫力| 左云县| 黑龙江省| 东乡| 山阳县| 梧州市| 文昌市| 莒南县| 平原县| 罗田县| 宿迁市| 综艺| 剑河县| 长宁县| 应城市| 黔南| 从江县| 天峻县| 潢川县| 灵台县| 宝丰县| 白沙| 大田县| 祁连县| 满城县| 淮安市| 石阡县| 敖汉旗| 巴彦淖尔市| 山阳县|