51單片機(jī)控制24C02串行E2PROM的讀寫(xiě)
i2c總線是一種用于ic器件之間連接的二線制總線。它通過(guò)sda(串行數(shù)據(jù)線)及scl(串行時(shí)鐘線)兩根線在連到總線上的器件之間傳送信息,并根據(jù)地址識(shí)別每個(gè)器件:不管是單片機(jī)、存儲(chǔ)器、lcd驅(qū)動(dòng)器還是鍵盤(pán)接口。
1.i2c總線的基本結(jié)構(gòu) 采用i2c總線標(biāo)準(zhǔn)的單片機(jī)或ic器件,其內(nèi)部不僅有i2c接口電路,而且將內(nèi)部各單元電路按功能劃分為若干相對(duì)獨(dú)立的模塊,通過(guò)軟件尋址實(shí)現(xiàn)片選,減少了器件片選線的連接。cpu不僅能通過(guò)指令將某個(gè)功能單元電路掛靠或摘離總線,還可對(duì)該單元的工作狀況進(jìn)行檢測(cè),從而實(shí)現(xiàn)對(duì)硬件系統(tǒng)的既簡(jiǎn)單又靈活的擴(kuò)展與控制。i2c總線接口電路結(jié)構(gòu)如圖1所示。 2.雙向傳輸?shù)慕涌谔匦浴鹘y(tǒng)的單片機(jī)串行接口的發(fā)送和接收一般都各用一條線,如mcs51系列的txd和rxd,而i2c總線則根據(jù)器件的功能通過(guò)軟件程序使其可工作于發(fā)送或接收方式。當(dāng)某個(gè)器件向總線上發(fā)送信息時(shí),它就是發(fā)送器(也叫主器件),而當(dāng)其從總線上接收信息時(shí),又成為接收器(也叫從器件)。主器件用于啟動(dòng)總線上傳送數(shù)據(jù)并產(chǎn)生時(shí)鐘以開(kāi)放傳送的器件,此時(shí)任何被尋址的器件均被認(rèn)為是從器件。i2c總線的控制完全由掛接在總線上的主器件送出的地址和數(shù)據(jù)決定。在總線上,既沒(méi)有中心機(jī),也沒(méi)有優(yōu)先機(jī)。
總線上主和從(即發(fā)送和接收)的關(guān)系不是一成不變的,而是取決于此時(shí)數(shù)據(jù)傳送的方向。sda和scl均為雙向i/o線,通過(guò)上拉電阻接正電源。當(dāng)總線空閑時(shí),兩根線都是高電平。連接總線的器件的輸出級(jí)必須是集電極或漏極開(kāi)路,以具有線“與”功能。i2c總線的數(shù)據(jù)傳送速率在標(biāo)準(zhǔn)工作方式下為100kbit/s,在快速方式下,最高傳送速率可達(dá)400kbit/s。
3.i2c總線上的時(shí)鐘信號(hào) 在i2c總線上傳送信息時(shí)的時(shí)鐘同步信號(hào)是由掛接在scl時(shí)鐘線上的所有器件的邏輯“與”完成的。scl線上由高電平到低電平的跳變將影響到這些器件,一旦某個(gè)器件的時(shí)鐘信號(hào)下跳為低電平,將使scl線一直保持低電平,使scl線上的所有器件開(kāi)始低電平期。此時(shí),低電平周期短的器件的時(shí)鐘由低至高的跳變并不能影響scl線的狀態(tài),于是這些器件將進(jìn)入高電平等待的狀態(tài)。
當(dāng)所有器件的時(shí)鐘信號(hào)都上跳為高電平時(shí),低電平期結(jié)束,scl線被釋放返回高電平,即所有的器件都同時(shí)開(kāi)始它們的高電平期。其后,第一個(gè)結(jié)束高電平期的器件又將scl線拉成低電平。這樣就在scl線上產(chǎn)生一個(gè)同步時(shí)鐘??梢?jiàn),時(shí)鐘低電平時(shí)間由時(shí)鐘低電平期最長(zhǎng)的器件確定,而時(shí)鐘高電平時(shí)間由時(shí)鐘高電平期最短的器件確定。
4.?dāng)?shù)據(jù)的傳送 在數(shù)據(jù)傳送過(guò)程中,必須確認(rèn)數(shù)據(jù)傳送的開(kāi)始和結(jié)束。在i2c總線技術(shù)規(guī)范中,開(kāi)始和結(jié)束信號(hào)(也稱(chēng)啟動(dòng)和停止信號(hào))的定義如圖2所示。當(dāng)時(shí)鐘線scl為高電平時(shí),數(shù)據(jù)線sda由高電平跳變?yōu)榈碗娖蕉x為“開(kāi)始”信號(hào);當(dāng)scl線為高電平時(shí),sda線發(fā)生低電平到高電平的跳變?yōu)椤敖Y(jié)束”信號(hào)。開(kāi)始和結(jié)束信號(hào)都是由主器件產(chǎn)生。在開(kāi)始信號(hào)以后,總線即被認(rèn)為處于忙狀態(tài);在結(jié)束信號(hào)以后的一段時(shí)間內(nèi),總線被認(rèn)為是空閑的。i2c總線的數(shù)據(jù)傳送格式是:在i2c總線開(kāi)始信號(hào)后,送出的第一個(gè)字節(jié)數(shù)據(jù)是用來(lái)選擇從器件地址的,其中前7位為地址碼,第8位為方向位(r/w)。方向位為“0”表示發(fā)送,即主器件把信息寫(xiě)到所選擇的從器件;方向位為“1”表示主器件將從從器件讀信息。開(kāi)始信號(hào)后,系統(tǒng)中的各個(gè)器件將自己的地址和主器件送到總線上的地址進(jìn)行比較,如果與主器件發(fā)送到總線上的地址一致,則該器件即為被主器件尋址的器件,其接收信息還是發(fā)送信息則由第8位(r/w)確定。
在i2c總線上每次傳送的數(shù)據(jù)字節(jié)數(shù)不限,但每一個(gè)字節(jié)必須為8位,而且每個(gè)傳送的字節(jié)后面必須跟一個(gè)認(rèn)可位(第9位),也叫應(yīng)答位(ack)。數(shù)據(jù)的傳送過(guò)程如圖3所示。每次都是先傳最高位,通常從器件在接收到每個(gè)字節(jié)后都會(huì)作出響應(yīng),即釋放scl線返回高電平,準(zhǔn)備接收下一個(gè)數(shù)據(jù)字節(jié),主器件可繼續(xù)傳送。如果從器件正在處理一個(gè)實(shí)時(shí)事件而不能接收數(shù)據(jù)時(shí),(例如正在處理一個(gè)內(nèi)部中斷,在這個(gè)中斷處理完之前就不能接收i2c總線上的數(shù)據(jù)字節(jié))可以使時(shí)鐘scl線保持低電平,從器件必須使sda保持高電平,此時(shí)主器件產(chǎn)生1個(gè)結(jié)束信號(hào),使傳送異常結(jié)束,迫使主器件處于等待狀態(tài)。當(dāng)從器件處理完畢時(shí)將釋放scl線,主器件繼續(xù)傳送。當(dāng)主器件發(fā)送完一個(gè)字節(jié)的數(shù)據(jù)后,接著發(fā)出對(duì)應(yīng)于scl線上的一個(gè)時(shí)鐘(ack)認(rèn)可位,在此時(shí)鐘內(nèi)主器件釋放sda線,一個(gè)字節(jié)傳送結(jié)束,而從器件的響應(yīng)信號(hào)將sda線拉成低電平,使sda在該時(shí)鐘的高電平期間為穩(wěn)定的低電平。從器件的響應(yīng)信號(hào)結(jié)束后,sda線返回高電平,進(jìn)入下一個(gè)傳送周期。
i2c總線還具有廣播呼叫地址用于尋址總線上所有器件的功能。若一個(gè)器件不需要廣播呼叫尋址中所提供的任何數(shù)據(jù),則可以忽略該地址不作響應(yīng)。如果該器件需要廣播呼叫尋址中提供的數(shù)據(jù),則應(yīng)對(duì)地址