版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
I2C總線(xiàn)接口設(shè)計(jì)51單片機(jī)實(shí)戰(zhàn)指南本章內(nèi)容:2I2C總線(xiàn)概述1單片機(jī)與EEPROM編程實(shí)例29.1.1I2C總線(xiàn)認(rèn)識(shí)與UART的比較UART屬于異步通信,通信雙方?jīng)]有同一個(gè)時(shí)鐘信號(hào)。而I2C是一種雙向二線(xiàn)制同步串行總線(xiàn),屬于同步通信。UART通信多用于板間通信,比如單片機(jī)和電腦,這個(gè)設(shè)備和另外一個(gè)設(shè)備之間的通信。而I2C多用于板內(nèi)通信。有2根接口線(xiàn)一根是串行時(shí)鐘線(xiàn)SCL,負(fù)責(zé)收發(fā)雙方的時(shí)鐘節(jié)拍;另一根是串行數(shù)據(jù)線(xiàn)SDA,負(fù)責(zé)傳輸數(shù)據(jù)。器件掛在總線(xiàn)上,每個(gè)器件都有唯一的地址,器件和器件之間均可進(jìn)行信息傳送。支持多主和主從兩種方式,通常為主從工作方式;在主從方式中,主器件啟動(dòng)數(shù)據(jù)發(fā)送,產(chǎn)生時(shí)鐘信號(hào),發(fā)出停止信號(hào);9.1.2I2C總線(xiàn)硬件結(jié)構(gòu)圖SCL和SDA均需接上拉電阻,開(kāi)發(fā)板上接的是4.7kΩ的上拉電阻。總線(xiàn)在空閑的時(shí)候保持高電平;連接到總線(xiàn)上的任一器件輸出低電平,都將使總線(xiàn)的信號(hào)拉低,相當(dāng)于“線(xiàn)與”的關(guān)系。(數(shù)字電路中門(mén)電路知識(shí))9.1.3I2C總線(xiàn)時(shí)序I2C總線(xiàn)在數(shù)據(jù)傳輸時(shí),時(shí)鐘信號(hào)為高電平期間,數(shù)據(jù)線(xiàn)上的數(shù)據(jù)必須保持穩(wěn)定,只有在時(shí)鐘線(xiàn)為低電平期間,數(shù)據(jù)線(xiàn)上的電平狀態(tài)才允許變化。由起始信號(hào)、終止信號(hào)、應(yīng)答信號(hào)、以及有效數(shù)據(jù)字節(jié)構(gòu)成。起始和終止信號(hào)都由主控制器發(fā)出,起始信號(hào)后,總線(xiàn)就處于被占用的狀態(tài);當(dāng)終止信號(hào)出現(xiàn)后,總線(xiàn)才重新處于空閑狀態(tài)。9.1.3I2C總線(xiàn)時(shí)序1.發(fā)送起始信號(hào)UART通信是從一直持續(xù)的高電平出現(xiàn)一個(gè)低電平標(biāo)志起始位;而I2C通信的起始信號(hào)的定義是SCL為高電平期間,SDA由高電平向低電平變化產(chǎn)生一個(gè)下降沿,表示起始信號(hào),如圖8-2中的Start部分所示。9.1.3I2C總線(xiàn)時(shí)序2.發(fā)送地址信號(hào)高7位為地址位,器件地址碼高4位(D7~D4)為AAAA,是器件的類(lèi)型,具有固定的定義,如EERROM為1010。中間的3位(D3~D1)為BBB,是片選信號(hào),同類(lèi)型的器件最多可以在I2C總線(xiàn)上掛載8個(gè)。最后一位D0位為讀寫(xiě)控制位。位D7D6D5D4D3D2D1D0說(shuō)明AAAABBB9.1.3I2C總線(xiàn)時(shí)序3.發(fā)送應(yīng)答信號(hào)I2C總線(xiàn)協(xié)議規(guī)定,每傳送一個(gè)字節(jié)數(shù)據(jù)(含地址和命令字)后,都要有一個(gè)應(yīng)答信號(hào),以確定傳輸數(shù)據(jù)是否被對(duì)方收到。應(yīng)答信號(hào)由接收設(shè)備產(chǎn)生,在SCL的高電平期間,接收設(shè)備將SDA拉為低電平,表示數(shù)據(jù)傳輸成功。9.1.3I2C總線(xiàn)時(shí)序4.數(shù)據(jù)傳輸I2C沒(méi)有固定波特率(UART有),但是有時(shí)序的要求,要求當(dāng)SCL在低電平的時(shí)候,SDA允許變化,也就是說(shuō),發(fā)送方必須先保持SCL是低電平,才可以改變數(shù)據(jù)線(xiàn)SDA,輸出要發(fā)送的當(dāng)前數(shù)據(jù)的一位。9.1.3I2C總線(xiàn)時(shí)序5.發(fā)送非應(yīng)答信號(hào)當(dāng)主機(jī)為接收設(shè)備時(shí),主機(jī)對(duì)最后一個(gè)字節(jié)不應(yīng)答(不拉低SDA),以向發(fā)送設(shè)備表示數(shù)據(jù)傳送結(jié)束。9.1.3I2C總線(xiàn)時(shí)序6.發(fā)送停止信號(hào)UART通信的停止位是一位固定的高電平信號(hào);而I2C通信停止信號(hào)的定義是SCL為高電平期間,SDA由低電平向高電平變化產(chǎn)生一個(gè)上升沿,表示結(jié)束信號(hào),如圖8-2中的Stop部分所示。9.1.3I2C總線(xiàn)時(shí)序總線(xiàn)的一次數(shù)據(jù)傳送過(guò)程中,可以有以下幾種組合方式:1)主機(jī)向從機(jī)發(fā)送數(shù)據(jù),數(shù)據(jù)傳輸方向在整個(gè)傳輸過(guò)程中不變;2)主機(jī)在發(fā)送第一個(gè)字節(jié)后,立即從從機(jī)讀數(shù)據(jù)。3)在傳送過(guò)程中,當(dāng)需要改變傳輸方向時(shí),需將起始信號(hào)和從機(jī)地址各重復(fù)一次,而兩次讀/寫(xiě)方向位相反。9.1.3I2C總線(xiàn)時(shí)序9.1.3I2C總線(xiàn)時(shí)序這里先定義了一個(gè)延時(shí)約4μs的宏I2cDelay(),代碼如下:#defineI2cDelay(){_nop_();_nop_();_nop_();_nop_();}這里用到了庫(kù)函數(shù)_nop_(),可以進(jìn)行精確延時(shí),1個(gè)_nop_()函數(shù)的執(zhí)行時(shí)間為1個(gè)機(jī)器周期,這個(gè)庫(kù)函數(shù)包含在intrins.h這個(gè)文件中,如果需要使用這個(gè)庫(kù)函數(shù),只需要在程序的最開(kāi)始,加入#include<intrins.h>即可。、9.1.3I2C總線(xiàn)時(shí)序-產(chǎn)生起始信號(hào)在SCL時(shí)鐘信號(hào)在高電平期間SDA信號(hào)產(chǎn)生一個(gè)下降沿,起始之后SDA和SCL都為0voidI2cStart(){ SDA=1;//首先保證SDA和SCL都是高電平 SCL=1; I2cDelay(); SDA=0; //先拉低SDA I2cDelay(); SCL=0; //再拉低SCL I2cDelay(); }9.1.3I2C總線(xiàn)時(shí)序-產(chǎn)生停止信號(hào)在SCL時(shí)鐘信號(hào)高電平期間SDA信號(hào)產(chǎn)生一個(gè)上升沿,結(jié)束之后保持SDA和SCL都為1,表示總線(xiàn)空閑。voidI2cStop(){ SDA=0; //首先保證SDA和SCL都是低電平 SCL=0; I2cDelay(); SCL=1; //先拉高SCL I2cDelay(); SDA=1; //再拉高SDA I2cDelay(); }9.1.3I2C總線(xiàn)時(shí)序-總線(xiàn)寫(xiě)操作bitI2cWriteByte(unsignedchardat){ unsignedchari=0; bitack; for(i=0;i<8;i++) //要發(fā)送8位,從最高位開(kāi)始 { //起始信號(hào)之后SCL=0,所以可以直接改變SDA信號(hào) SDA=dat>>7; dat=dat<<1; I2cDelay(); SCL=1; //拉高SCL I2cDelay(); SCL=0; //再拉低SCL,完成一個(gè)位周期 I2cDelay(); }9.1.3I2C總線(xiàn)時(shí)序-總線(xiàn)寫(xiě)操作
SDA=1;//8位數(shù)據(jù)發(fā)送完以后主機(jī)釋放SDA,以檢測(cè)從機(jī)應(yīng)答 I2cDelay(); SCL=1; //拉高SCL ack=SDA; //讀取此時(shí)的SDA值,即為從機(jī)的應(yīng)答值 I2cDelay(); SCL=0; //再拉低SCL完成應(yīng)答位,并保持住總線(xiàn) return~ack; //應(yīng)答位取反以符合邏輯習(xí)慣,0:不存在
//或忙或失敗,1:存在且空閑或?qū)懭氤晒 9.1.3I2C總線(xiàn)時(shí)序-總線(xiàn)讀操作unsignedcharI2cReadByte(bitACK){ unsignedchari=0,dat=0; SDA=1; //首先確保主機(jī)釋放SDA I2cDelay(); for(i=0;i<8;i++) //從高位到低位接收8位 { SCL=1; I2cDelay(); dat<<=1; dat|=SDA; I2cDelay(); SCL=0; I2cDelay(); }9.1.3I2C總線(xiàn)時(shí)序-總線(xiàn)讀操作
SDA=ack; //8位數(shù)據(jù)發(fā)送完以后,發(fā)送應(yīng)答(ack為0)或非 //應(yīng)答信號(hào)(ack為1) I2cDelay(); SCL=1; //拉高SCL I2cDelay(); SCL=0; //再拉低SCL完成應(yīng)答或非應(yīng)答位,并保持住總線(xiàn) returndat;
}9.2
單片機(jī)與EEPROM編程實(shí)例開(kāi)發(fā)板上使用的這個(gè)器件是ATMEL公司的ATC系列的EEPROM,主要型號(hào)有AT24C01/02/04/08/16等,后面兩位數(shù)字的單位是Kbit,因此AT24C02,是一個(gè)容量大小為2Kbits,也就是256個(gè)字節(jié)的EEPROMAT24C02是一個(gè)基于I2C通信協(xié)議的器件,我們通過(guò)51單片機(jī)對(duì)I2C總線(xiàn)時(shí)序進(jìn)行模擬后,就可以對(duì)EEPROM訪(fǎng)問(wèn)了。二者并沒(méi)有必然的聯(lián)系,EEPROM可以用其它接口,I2C也可以用在其它很多器件上。9.2.1
EEPROMAT24C02引腳與尋址介紹9.2.1
EEPROMAT24C02引腳與尋址介紹引腳名稱(chēng)引腳功能A2,A1,A0編程的地址輸入端GND電源地SDA串行數(shù)據(jù)輸入/輸出端SCL串行時(shí)鐘輸入端WP寫(xiě)輸入保護(hù)端,用于硬件數(shù)據(jù)保護(hù)。當(dāng)其為低電平時(shí),可以對(duì)整個(gè)存儲(chǔ)器進(jìn)行正常的讀寫(xiě)操作;當(dāng)其為高電平時(shí),存儲(chǔ)器具有寫(xiě)保護(hù)功能,但讀操作不受影響。VCC電源正端9.2.1
EEPROMAT24C02引腳與尋址介紹3.存儲(chǔ)器結(jié)構(gòu)與尋址AT24C02的存儲(chǔ)容量為2Kb,內(nèi)部分成32頁(yè),每頁(yè)8字節(jié),共256字節(jié),操作時(shí)有兩種尋址方式:芯片尋址和片內(nèi)存儲(chǔ)單元尋址。1)芯片尋址AT24C02的芯片地址為1010,其地址控制字格式為1010A2A1A0。其中A2,A1,A0為可編程的地址選擇位,A2,A1,A0引腳接高、低電平后得到確定的三位編碼,與1010組合成7位編碼,即該器件的地址碼。為芯片讀寫(xiě)控制位,該位為0,表示對(duì)芯片進(jìn)行寫(xiě)操作;該位為1,表示對(duì)芯片進(jìn)行讀操作。2)片內(nèi)存儲(chǔ)單元尋址芯片內(nèi)可尋址內(nèi)部256字節(jié)的任何一個(gè)進(jìn)行讀/寫(xiě)操作,其地址空間為00~FF。9.2.2讀寫(xiě)操作時(shí)序-單字節(jié)寫(xiě)入1)首先是I2C的起始信號(hào),接著跟上首字節(jié),也就是我們前邊講的I2C的器件地址,并且在讀寫(xiě)方向上選擇“寫(xiě)”操作。2)發(fā)送數(shù)據(jù)的存儲(chǔ)地址。24C02一共256個(gè)字節(jié)的存儲(chǔ)空間,地址從0x00~0xFF。3)發(fā)送要存儲(chǔ)的8位數(shù)據(jù)。注意在寫(xiě)數(shù)據(jù)的過(guò)程中,EEPROM每個(gè)字節(jié)都會(huì)回應(yīng)一個(gè)“應(yīng)答位0”,來(lái)告訴我們寫(xiě)EEPROM數(shù)據(jù)成功,如果沒(méi)有回應(yīng)答位,說(shuō)明寫(xiě)入不成功。9.2.2讀寫(xiě)操作時(shí)序-頁(yè)寫(xiě)入方式頁(yè)面寫(xiě)入與字節(jié)寫(xiě)入相同,但是單片機(jī)在第一個(gè)字節(jié)后不發(fā)送停止位。相反,在EEPROM確認(rèn)收到第一個(gè)數(shù)據(jù)字后,單片機(jī)還可以發(fā)送多達(dá)7個(gè)字節(jié)(2401/2402)。每個(gè)數(shù)據(jù)字收到后,EEPROM會(huì)給出應(yīng)答。若收到非應(yīng)答,單片機(jī)必須終止頁(yè)面寫(xiě)入。每成功寫(xiě)入一個(gè)字節(jié),EEPROM存儲(chǔ)空間的地址就會(huì)自動(dòng)加1,故寫(xiě)入一頁(yè)以為的數(shù)據(jù)字時(shí),只需輸入首地址。如果寫(xiě)到此頁(yè)的最后一個(gè)地址,主器件再發(fā)送數(shù)據(jù),數(shù)據(jù)會(huì)寫(xiě)入到該頁(yè)的首地址,也就會(huì)覆蓋掉原來(lái)的數(shù)據(jù),這個(gè)現(xiàn)象稱(chēng)為“翻轉(zhuǎn)”(RollOver)。解決“翻轉(zhuǎn)”的方法是在寫(xiě)完8個(gè)字節(jié)數(shù)據(jù)后,將下一頁(yè)的首地址重新寫(xiě)到總線(xiàn)上。9.2.2讀寫(xiě)操作時(shí)序-指定地址讀1)首先是I2C的起始信號(hào),接著跟上首字節(jié),也就是我們前邊講的I2C的器件地址,并且在讀寫(xiě)方向上選擇“寫(xiě)”操作。注意,這一步依然是“寫(xiě)”,我們選擇寫(xiě)操作,是為了把所要讀的數(shù)據(jù)的存儲(chǔ)地址先寫(xiě)進(jìn)去,告訴EEPROM我們要讀取哪個(gè)地址的數(shù)據(jù)。2)發(fā)送要讀取的數(shù)據(jù)的地址,注意是地址而非存在EEPROM中的數(shù)據(jù)。3)重新發(fā)送I2C起始信號(hào)和器件地址,并且在方向位選擇“讀”操作。前三步中,每一個(gè)字節(jié)實(shí)際上都是在“寫(xiě)”,所以每一個(gè)字節(jié)EEPROM都會(huì)回應(yīng)一個(gè)“應(yīng)答位0”。4)讀取從器件發(fā)回的數(shù)據(jù),讀一個(gè)字節(jié),并發(fā)送非應(yīng)答位ACK(1)9.2.3.單字節(jié)讀寫(xiě)實(shí)戰(zhàn)開(kāi)發(fā)板上單片機(jī)與AT24C02硬件連接如圖9-9所示,其中A2,A1,A0與WP都接地,SDA接單片機(jī)P3.6引腳,SCL接單片機(jī)P3.7引腳,SDA與SCL分別于Vcc之間接一4.7kΩ的上拉電阻,因?yàn)锳T24C02總線(xiàn)內(nèi)部是漏極開(kāi)漏形式,不接上拉電阻無(wú)法確定總線(xiàn)空閑時(shí)的電平狀態(tài)。其中SDA接單片機(jī)P3.6引腳,SCL接P3.7引腳9.2.3.單字節(jié)讀寫(xiě)實(shí)戰(zhàn)【例9.2.1】通過(guò)串口向單片機(jī)發(fā)送1位十進(jìn)制數(shù)據(jù)(0-9),單片機(jī)接收到以后顯示在數(shù)碼上,并加1后回傳到電腦端串口調(diào)試助手,同時(shí)保存在中,這樣下次開(kāi)機(jī)后,單片機(jī)從出最后一次保存在AT24C02中的數(shù)據(jù),并顯示在數(shù)碼管上。其中SDA接單片機(jī)P3.6引腳,SCL接P3.7引腳9.2.3.單字節(jié)讀寫(xiě)實(shí)戰(zhàn)遵循模塊化編程的原則,考慮到I2C接口還要和A/D和D/A轉(zhuǎn)換器PCF8591通信,我們沒(méi)有把EEPROM的讀寫(xiě)函數(shù)一起放入i2c.c文件中,而是單獨(dú)寫(xiě)了一個(gè)EEPROM.c文件,包括它的頭文件EEPROM.h文件。封裝了2個(gè)函數(shù):向AT24c02的一個(gè)地址寫(xiě)入一個(gè)數(shù)據(jù)voidAt24c02WriteByte(unsignedcharaddr,unsignedchardat)讀取AT24c02的一個(gè)地址的一個(gè)數(shù)據(jù)*unsignedcharAt24c02ReadByte(unsignedcharaddr)9.2.3.單字節(jié)讀寫(xiě)實(shí)戰(zhàn)/*向AT24c02的一個(gè)地址寫(xiě)入一個(gè)數(shù)據(jù)*/voidAt24c02WriteByte(unsignedcharaddr,unsignedchardat){ I2cStart(); I2cWriteByte(0xA0);
//發(fā)送寫(xiě)器件地址 I2cWriteByte(addr);
//發(fā)送要寫(xiě)入內(nèi)存地址 I2cWriteByte(dat);
//發(fā)送數(shù)據(jù) I2cStop();}9.2.3.單字節(jié)讀寫(xiě)實(shí)戰(zhàn)/*讀取AT24c02的一個(gè)地址的一個(gè)數(shù)據(jù)*/unsignedcharAt24c02ReadByte(unsignedcharaddr){ unsignedcharnum; I2cStart(); I2cWriteByte(0xA0);
//發(fā)送寫(xiě)器件地址 I2cWriteByte(addr);
//發(fā)送要讀取的地址 I2cStart(); I2cWriteByte(0xA1);
//發(fā)送讀器件地址 num=I2cReadByte(1);
//讀取數(shù)據(jù),發(fā)送非應(yīng)答信號(hào) I2cStop(); returnnum; }9
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《壽司店策劃》課件
- 《種苗檔案建設(shè)》課件
- 二次函數(shù)復(fù)習(xí)課件
- 2024-2025學(xué)年廣東省清遠(yuǎn)市四校聯(lián)考高一上學(xué)期11月期中聯(lián)考物理試題(解析版)
- 單位管理制度集粹匯編職員管理十篇
- 《危險(xiǎn)管理與保險(xiǎn)》課件
- 單位管理制度匯編大合集職工管理十篇
- 三年級(jí)數(shù)學(xué)欣賞與設(shè)計(jì)課件
- 單位管理制度分享大全【人事管理篇】十篇
- 《孔徑孔容計(jì)算》課件
- 連退生產(chǎn)過(guò)程操作優(yōu)化-質(zhì)量預(yù)報(bào)監(jiān)測(cè)及診斷
- 梅毒專(zhuān)題知識(shí)培訓(xùn)
- 小說(shuō)閱讀抓住矛盾沖突參考資料課件
- 簡(jiǎn)約企業(yè)報(bào)刊報(bào)紙?jiān)O(shè)計(jì)排版word模板
- 矛盾糾紛排查化解登記表
- 大班科學(xué)活動(dòng) 有害的噪音
- 建筑施工成品保護(hù)措施
- 魚(yú)骨圖PPT模板精品教案0002
- 冠狀動(dòng)脈造影基本知識(shí)-
- 油墨組成和分類(lèi)
- DB37T 5175-2021 建筑與市政工程綠色施工技術(shù)標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論