目標(biāo):EEPROM-IIC總線理解(二)
在實(shí)際的應(yīng)用中葬荷,保存在單片機(jī)RAM中的數(shù)據(jù),掉電后數(shù)據(jù)就丟失了熟史,保存在單片機(jī)的FLASH中的數(shù)據(jù)箱熬,又不能隨意改變类垦,也就是不能用它來記錄變化的數(shù)值。但是在某些場(chǎng)合城须,我們又確實(shí)需要記錄下某些數(shù)據(jù)蚤认,而它們還時(shí)常需要改變或更新,掉電之后數(shù)據(jù)還不能丟失糕伐,比如我們的家用電表度數(shù)砰琢,我們的電視機(jī)里邊的頻道記憶,一般都是使用EEPROM來保存數(shù)據(jù)赤炒,特點(diǎn)就是掉電后不丟失氯析。我們板子上使用的這個(gè)器件是24C02亏较,是一個(gè)容量大小是2Kbit位莺褒,也就是256個(gè)字節(jié)的EEPROM。一般情況下雪情,EEPROM擁有30萬到100萬次的壽命遵岩,也就是它可以反復(fù)寫入30-100萬次,而讀取次數(shù)是無限的。
24C02是一個(gè)基于I2C通信協(xié)議的器件尘执,因此從現(xiàn)在開始舍哄,我們的I2C和我們的EEPROM就要合體了。但是大家要分清楚誊锭,I2C是一個(gè)通信協(xié)議表悬,它擁有嚴(yán)密的通信時(shí)序邏輯要求,而EEPROM是一個(gè)器件丧靡,只是這個(gè)器件采樣了I2C協(xié)議的接口與單片機(jī)相連而已蟆沫,二者并沒有必然的聯(lián)系,EEPROM可以用其他接口温治,I2C也可以用在其它很多器件上饭庞。
(5)數(shù)據(jù)傳輸
I2C總線上傳送的數(shù)據(jù)信號(hào)是廣義的,既包括地址信號(hào)熬荆,又包括真正的數(shù)據(jù)信號(hào)舟山。在起始信號(hào)后必須傳送一個(gè)從機(jī)的地址(7位),第8位是數(shù)據(jù)的傳送方向位(R/W)卤恳,用“0”表示主機(jī)發(fā)送(寫)數(shù)據(jù)(W)累盗,“1”表示主機(jī)接收數(shù)據(jù)(R)。每次數(shù)據(jù)傳送總是由主機(jī)產(chǎn)生的終止信號(hào)結(jié)束纬黎。但是幅骄,若主機(jī)希望繼續(xù)占用總線進(jìn)行新的數(shù)據(jù)傳送,則可以不產(chǎn)生終止信號(hào)本今,馬上再次發(fā)出起始信號(hào)對(duì)另一從機(jī)進(jìn)行尋址拆座。
在總線的一次數(shù)據(jù)傳送過程中,可以有以下幾種組合方式:
a冠息、主機(jī)向從機(jī)發(fā)送數(shù)據(jù)挪凑,數(shù)據(jù)傳送方向在整個(gè)傳送過程中不變,即就連那一個(gè)從機(jī),白色框子里的A是從機(jī)發(fā)來的表示一個(gè)字節(jié)接受完了逛艰,如果是/A則表示從機(jī)沒有響應(yīng)則結(jié)束
b躏碳、主機(jī)在第一個(gè)字節(jié)后,立即從從機(jī)讀數(shù)據(jù),灰色框里的A是主機(jī)發(fā)出的響應(yīng)散怖,表示一個(gè)字節(jié)數(shù)據(jù)讀取完了
c菇绵、在傳送過程中,當(dāng)需要改變傳送方向時(shí)镇眷,起始信號(hào)和從機(jī)地址都被重復(fù)產(chǎn)生一次咬最,但兩次讀/寫方向位正好相反
2.EEPR0M(AT24C02)簡(jiǎn)介
AT24C01/02/04/08/16...是一個(gè)1K/2K/4K/8K/16K位串行CMOS28/256/512/1024/2048個(gè)8位字節(jié),AT24C01有一個(gè)8字節(jié)頁寫緩沖器欠动,
AT24C02/04/08/16有一個(gè)16字節(jié)頁寫緩沖器永乌。該器件通過I2C總線接口進(jìn)行操作惑申,它有一個(gè)專門的寫保護(hù)功能。
AT24c02就 是一個(gè)掛在總線上的從機(jī)可以往里面寫數(shù)據(jù)也可以讀里面的數(shù)據(jù)翅雏,而單片機(jī)就是主機(jī)來都里面或往里面寫數(shù)據(jù)
AT24C02器件地址為7位圈驼,高4位固定為1010,低3位由 A0/A1/A2信號(hào)線的電平定望几。因?yàn)閭鬏數(shù)刂坊驍?shù)據(jù)是以字節(jié)為單位傳送的绩脆,當(dāng)傳送地址時(shí),器件地址占7位橄抹,還有最后一位(最低位R/W)用來選擇讀寫方向衙伶,它與地址無關(guān)。
- 起始時(shí)害碾,起始信號(hào)的數(shù)據(jù)線的高電平要至少保持4.7us矢劲,低電平最少要4us,I2C通信的起始信號(hào)的定義是SCL為高電平期間慌随,SDA由高電平向低電平變化產(chǎn)生一個(gè)下降沿芬沉,表示起始信號(hào)
void I2CStart() //產(chǎn)生總線起始信號(hào)
{
I2C_SDA = 1; //首先確保SDA、SCL都是高電平
I2C_SCL = 1;
I2CDelay();
I2C_SDA = 0; //先拉低SDA
I2CDelay();
I2C_SCL = 0; //再拉低SCL
}
- 終止時(shí)阁猜,終止信號(hào)的數(shù)據(jù)線的低電平最少4us,高電平最少4.7us丸逸,I2C通信停止信號(hào)的定義是SCL為高電平期間,SDA由低電平向高電平變化產(chǎn)生一個(gè)上升沿剃袍,表示結(jié)束信號(hào)
應(yīng)答就是SDA是低電平時(shí)黄刚,SCL要保持高電平大于4us
非應(yīng)答就是SDA是高電平時(shí)。SCL保持高電平大于4us
void I2CStop() //產(chǎn)生總線停止信號(hào)
{
I2C_SCL = 0; //首先確保SDA民效、SCL都是低電平
I2C_SDA = 0;
I2CDelay();
I2C_SCL = 1; //先拉高SCL
I2CDelay();
I2C_SDA = 1; //再拉高SDA
I2CDelay();
}
- 數(shù)據(jù)傳輸:I2C通信是高位在前憔维,低位在后。I2C沒有固定波特率畏邢,但是有時(shí)序的要求业扒,要求當(dāng)SCL在低電平的時(shí)候,SDA允許變化舒萎,也就是說程储,發(fā)送方必須先保持SCL是低電平,才可以改變數(shù)據(jù)線SDA臂寝,輸出要發(fā)送的當(dāng)前數(shù)據(jù)的一位章鲤;而當(dāng)SCL在高電平的時(shí)候,SDA絕對(duì)不可以變化咆贬,因?yàn)檫@個(gè)時(shí)候败徊,接收方要來讀取當(dāng)前SDA的電平信號(hào)是0還是1,因此要保證SDA的穩(wěn)定不變化素征,如上圖中的每一位數(shù)據(jù)的變化集嵌,都是在SCL的低電平位置。
3.EEPROM模塊電路