新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機I2C總線驅動程序

        51單片機I2C總線驅動程序

        作者: 時間:2016-11-18 來源:網絡 收藏
        SI2I2C總線是PHLIPS公司推出的一種串行總線,是具備多主機系統所需的包括總線裁決和高低速器件同步功能的高性能串行總線。

        I2C總線只有兩根雙向信號線。一根是數據線SDA,另一根是時鐘線SCL。

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

        一.I2C系統結構

        每個接到I2C總線上的器件都有唯一的地址。主機與其它器件間的數據傳送可以是由主機發送數據到其它器件,這時主機即為發送器。由總線上接收數據的器件則為接收器。

        二.數據位的有效性規定

        I2C總線進行數據傳送時,時鐘信號為高電平期間,數據線上的數據必須保持穩定,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平狀態才允許變化。

        三.字節傳送與應答

        每一個字節必須保證是8位長度。數據傳送時,先傳送最高位(MSB),每一個被傳送的字節后面都必須跟隨一位應答位(即一幀共有9位)。

        四.驅動程序

        #define uchar unsigned char#define uint unsigned int#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()sbit SCL=P2^1;sbit SDA=P2^0;
        • 1
        • 2
        • 3
        • 4
        • 5

        1.起始信號和終止信號

        SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號;
        SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號。

        起始和終止信號都是由主機發出的,在起始信號產生后,總線就處于被占用的狀態;在終止信號產生后,總線就處于空閑狀態

        void I2C_Start()     //起始{SCL=1;somenop();SDA=1;somenop();SDA=0;somenop();SCL=0;somenop();}void I2C_Stop()      //終止{  SDA=0;somenop();SCL=1;somenop();SDA=1;somenop();}
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22

        2.發送數據

        void I2C_SendByte(uchar dat, uchar ack)   //發送一個字節{uchar i,j,b=0;for(i=0;i<8;i++){    SCL=0;  somenop();   SDA=(bit)(dat&0x80);     //每次取最高位進行發送dat<<=1;        //從最高位開始發送,左移使每一位逐漸成為最高位SCL=1;          //上升沿時發送數據somenop();      }SCL=0;somenop(); SDA=1;     somenop();SCL=1;_nop_();while((SDA==1)&&(j<250))  j++;  //等待應答,也就是等待從設備把SDA拉低SCL=0;_nop_();   }
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22

        3.讀取數據

        uchar I2C_ReadByte()     //讀一個字節{uchar i,dat=0;SCL=0;         //此處也可以不置低,因為起始和發送一個字節之后SCL都是0somenop();SDA=1;      //拉高準備數據讀取_nop_();for(i=0;i<8;i++)   //讀取8位數據{SCL=1;somenop();dat<<=1;if(SDA==1)dat=dat"0x01;somenop();SCL=0;     //下降沿時讀取數據somenop();}return dat;}


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 莎车县| 博湖县| 清流县| 开平市| 宁城县| 湄潭县| 正安县| 墨江| 凤庆县| 巨鹿县| 永胜县| 卢氏县| 安国市| 日土县| 保靖县| 江阴市| 中西区| 建始县| 安国市| 原阳县| 河曲县| 安化县| 阿图什市| 贵溪市| 仁化县| 宁河县| 浦江县| 饶平县| 仁布县| 台南市| 涪陵区| 琼海市| 镇巴县| 攀枝花市| 霍城县| 凯里市| 无为县| 象山县| 棋牌| 格尔木市| 岳池县|