一.簡介
I2C(Inter-Integrated Circuit)總線是一種由Philips公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設備。I2C總線產生于在80年代,最初為音頻和視頻設備開發(fā)。由于其簡單性,如今方泛用于微控制器與各種功能模塊的連接,可以說是學 單片機 的人,入門之后,必定要涉及到的。
I2C 總線實際上已經成為一個國際標準在超過100 種不同的IC 上實現,而且得到超過50 家公司的許可,正因為其簡單和應用廣泛,因此其功能也越來不滿足人們的要求,其速度也從原來的100Kbit/S,增加了快速模式,其速度達400Kbit/S,再后來也增加了高速模式,其速度更達3.4Mbit/S。
二.功能和特點
I2C總線是一種用于IC器件之間連接的雙向二線制總線,所謂總線它上面可以掛多少器件,并且通個兩根線連接,占用空間非常的小,總線的長度可高達25英尺,并且能夠以10Kbps的最大傳輸速率支持40個組件。它的另一優(yōu)點是多主控,只要能夠進行接收和發(fā)送的設備都可以成為主控制器,當然多個主控不能同一時間工作。
I2C總線有兩根信號線,一根為SDA(數據線),一根為SCL(時鐘線)。任何時候時鐘信號都是由主控器件產生。
I2C總線在傳送數據的過程中,主要有三種控制信號:起始信號,結不信號,應答信號
起始信號:當SCL為高電平時,SDA由高電平轉為低電平時,開始傳送數據
結束信號:當SCL為高電平時,SDA由低電平轉為高電平時,結束數據傳送
應答信號:接收數據的器件在接收到8bit數據后,向發(fā)送數據的器件發(fā)出低電平信號,表示已收到數據。這個信號可以是主控器件發(fā)出,也可以是從動器件發(fā)出??傊山邮諗祿钠骷l(fā)出。
這些信號中,起始信號是必需的,結束信號和應答信號,都可以不要。
三.基本操作
下面我們以ATMEL公司的AT24C02來介紹I2C的基本操作
AT24C02是美國ATMEL公司的低功耗CMOS串行EEPROM,它是內含256×8bit存儲空間,具有工作電壓寬(2.5~5.5V)、擦寫次數多(大于10000次)、寫入速度快(小于10ms)等特點。他在系統中始終為從動器件。
對AT24C02的操作主要有:字節(jié)讀,字節(jié)寫,頁面讀,頁面寫
首先發(fā)送起始信號,如下圖,起始信號后必須是控制字,
控制字格式如下,其中高四位為器件類型識別符(不同的芯片類型有不同的定義,EEPROM一般應為1010),接著三位為片選,也就是三個地址位,最后一位為讀寫控制位,當為1(Input)時為讀操作,為0(Output)時為寫操作。
控制字后就是相應的操作,讀或寫,一定不要結束,因為這個操作還沒有完成,如果結束就等于放棄操作。
先來看寫操作,寫操作分為字節(jié)寫和頁面寫兩種操作,對于頁面寫根據芯片的一次裝載的字節(jié)不同有所不同,AT24C02為8字節(jié),每寫一個字節(jié)后,地址自動加1。關于頁面寫的地址、應答和數據傳送的時序參見圖3,字節(jié)寫可以看成是只有一個字節(jié)的頁面寫,也就是寫一個數據后停止。注意:寫一次需要一定時間,一般為10ms,要等侍這個操作完成。時序如下圖:
說明:對于AT24C02,在控制字后還必須寫入地址,這個地址是以后讀寫的起始地址。
讀操作有三種基本操作:當前地址讀、隨機讀和順序讀。三種操作方法類似,只是讀的數據個數不同,可連續(xù)讀8個字節(jié),圖4給出的是順序讀的時序圖,圖中共讀了四個數據,需要注意的是當前的地址,如果不是想要的,可以用寫操作,重新寫入地址。非常重要的是,每讀一個數據后,必須置低SDA,作為應答,否則,只能讀一個數據,后面的數據,因為收到不應答信號,AT24C02就會認為出錯,停止操作。特別提醒的是,當SCL為低電平時,數據是可變的,因些只有SCL為高電平時,才能讀數。(相關時序,請看例程序的,讀功能函數)
四.例程序(51匯編,測試 單片機 為AT89C51,12M晶振)
電路連接如圖5,其中A0,A1,A2為地址線,本例中全部接地,因此全部為0。由于SCL和SDA為漏極開路輸出,所以在使用時,需加上拉電阻。
程序功是將數據66H寫入AT24C02地址單元00,數據88H寫01單元,再將00單元讀出放入 單片機 的40H單元,01單元讀出放入41H單元,再將其分別寫入AT24C02的02和03地址單元,最后將00,02讀出比較,01與03比較,如果相等,LED發(fā)光。以下是程序??蓪⒈境绦驈椭?,編譯后,燒錄后測試。 (程序看似復雜,其實很多功能是重復的)
SCL EQU P3.0 ;時鐘 SDA EQU P3.1 ;數據 LED EQU P1.0 ;操作成功指示,低電平點亮 ORG 0X0000 LJMP MAIN ;啟動功能函數,NOP用于滿足AT24C02的速度要求START: CLR SCL ;先將SCL置低才改變SDA,以免誤操作 NOP NOP SETB SDA NOP NOP SETB SCL NOP NOP CLR SDA NOP NOP RET ;結束功能函數STOP: CLR SCL ;先將SCL置低才改變SDA,以免誤操作 NOP NOP CLR SDA NOP NOP SETB SCL NOP NOP SETB SDA NOP NOP RET ;應答函數ACK: CLR SCL ;先將SCL置低才改變SDA,以免誤操作 NOP NOP CLR SDA ;發(fā)低電平應答 NOP NOP SETB SCL NOP NOP RET ;寫一個字節(jié) ;R2為要寫的數據,R3為每字節(jié)的位數,這兒為8位 ;返回時C為應答信號,可以不理會這個值WRITE: MOV R3,#8 MOV A,R2WRLOOP: CLR SCL RLC A NOP MOV SDA,C NOP NOP SETB SCL NOP NOP DJNZ R3,WRLOOP CLR SCL ;以下處理AT24C02的應答信號 NOP NOP SETB SDA ;置高SDA,用作輸入,如果AT24C02拉低,表示正確 NOP NOP SETB SCL NOP NOP MOV C,SDA ;讀取應答信號 RET ;讀一個字節(jié) ;返回時R2為讀得的數READ: MOV R3,#8RDLOOP: CLR SCL NOP NOP SETB SDA ;拉高SDA,用作輸入 NOP NOP SETB SCL NOP NOP MOV C,SDA RLC A DJNZ R3,RDLOOP MOV R2,A RET ;延時,用以保證寫操作完成,寫地址信號不用延時DELAY: MOV 0X31,#20AA: MOV 0X32,#200 DJNZ 0X32,$ DJNZ 0X31,AA RET MAIN: ACALL START ;啟動 MOV R2,#0XA0 ;將控制字“1010 0000”傳到R2,最后一位表示寫 ACALL WRITE ;調用寫函數 MOV R2,#0X00 ;設置要寫的地址 ACALL WRITE MOV R2,#0X66 ;寫入第一個字節(jié),66H,寫入到00單元 ACALL WRITE MOV R2,#0X88 ;寫入第一個字節(jié),88H,寫入到01單元 ACALL WRITE ACALL STOP ;停止操作 ACALL DELAY ;等待寫完成 ACALL START ;啟動 MOV R2,#0XA0 ;寫控制字 ACALL WRITE MOV R2,#00 ;設置要讀地址 ACALL WRITE ACALL START MOV R2,#0XA1 ;將控制字“1010 0001”傳到R2,最后一位表示讀 ACALL WRITE ;寫入控制字 ACALL READ ;調用讀命令 ACALL ACK ;應答 MOV 0X40,R2 ;將讀得的數據傳到40H ACALL READ ;讀下一位,將讀得的數據傳到41H ACALL ACK MOV 0X41,R2 ACALL STOP ;停止讀操作 ACALL START MOV R2,#0XA0 ;寫控制字,表示以下這寫操作 ACALL WRITE MOV R2,#0X02 ;設置地址 ACALL WRITE MOV R2,0X40 ;將上面讀得的數寫入到02單元 ACALL WRITE MOV R2,0X41 ;將上面讀得的數寫入到03單元 ACALL WRITE ACALL STOP ;停止操作 ACALL DELAY ;等待寫完成 ACALL START ;啟動 MOV R2,#0XA0 ;寫入控制字,表示以下為寫操作 ACALL WRITE MOV R2,#00 ;寫入讀的起始地址 ACALL WRITE ACALL START ;啟動 MOV R2,#0XA1 ;寫入控制字,表示以下為讀操作 ACALL WRITE ACALL READ ACALL ACK MOV 0X40,R2 ;以下連續(xù)讀出四個字節(jié) ACALL READ ACALL ACK MOV 0X41,R2 ACALL READ ACALL ACK MOV 0X42,R2 ACALL READ ACALL ACK MOV 0X43,R2 ACALL STOP MOV A,0X42 ;以下為比較讀出結果與寫入是否相等 CJNE A,#0X66,ENDALL MOV A,0X43 CJNE A,#0X88,ENDALL CLR LEDENDALL: SJMP $ END
評論
查看更多