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