24C02在PIC單片機(jī)系統(tǒng)中的應(yīng)用
由于部分PIC單片機(jī)不具備I2C總線接口,在應(yīng)用時必須用軟件法加以解決。
在軟件編制時應(yīng)當(dāng)嚴(yán)格遵循I2C總線規(guī)則,并注意24C02的片內(nèi)讀寫周期時間,調(diào)整好程序流程,以避免寫不進(jìn)、讀不出的問題。
下面將筆者在實(shí)際工作中遇到的問題和解決的方法進(jìn)行簡單的介紹,希望可以給同行一些幫助。
首先約定,數(shù)據(jù)由微處理器發(fā)送到24C02稱“寫”、“發(fā)”,反之稱“讀”、“收”。24C02支持順序讀寫和隨機(jī)讀寫,文中以隨機(jī)讀寫方式為例進(jìn)行介紹。
一、硬件電路(如圖1所示)。
使用微處理的任意兩個通用I/O端口(圖中用RA2、RA3)作為與24C02的連接,其中一個作為時鐘SCL線,另外一個作為數(shù)據(jù)SAD線。兩個端口均接22kΩ上拉電阻。
二、軟件設(shè)計(jì)
首先簡要介紹一下用EEPROM的I2C總線的規(guī)則。
初始狀態(tài)時,SCL、SDA兩線都為高。
當(dāng)SCL為高電平時,如果SDA線跌落,認(rèn)為是“起始位”。
當(dāng)SCL為高電平時,如果SDA線上升,認(rèn)為是“停止位”。
除此之外,在發(fā)送數(shù)據(jù)的過程中當(dāng)SCL為高電平時,SDA應(yīng)保持穩(wěn)定。
ACK應(yīng)答位指在此時鐘周期內(nèi)由從器件(EEPROM)把SDA拉低,表示回應(yīng)。這時主器件(PIC16微處理器)的SDA口的屬性應(yīng)該變?yōu)檩斎胍员銠z測。
1.在寫數(shù)據(jù)周期應(yīng)該依次執(zhí)行以下過程:
1)發(fā)“起始位”。2)發(fā)“寫入代碼”(8bit),1010(A1A2A3)0,其中的A1、A2、A3三位是片地址,由24C02的硬件決定,文中采用000。3)收“ACK”應(yīng)答(1bit)。4)發(fā)EEPROM片內(nèi)地址(即要寫入EEPROM的什么位置)(8bit)。從00到FF中的任意一個,對應(yīng)EEPROM中的相應(yīng)位。5)收“ACK”應(yīng)答(1bit)。6)發(fā)要發(fā)送的數(shù)據(jù)(8bit),即要存儲到EEPROM中的數(shù)據(jù)。7)發(fā)“停止位”。
接下來,如圖2所示,進(jìn)入輪詢程序以便檢驗(yàn)24C02片內(nèi)寫周期是否完成。如果已經(jīng)完成則進(jìn)入下一個字節(jié)的寫操作過程。如果沒有完成則繼續(xù)等待,直到完成。
2.在讀數(shù)據(jù)周期,依次執(zhí)行以下過程:
1)發(fā)“起始位”。2)發(fā)“寫入代碼”(8bit),1010(A1A2A3)0,其中A1、A2、A3三位是片地址,由24C02的硬件決定,文中采用000。3)收“ACK”應(yīng)答(1bit)。4)發(fā)“EEPROM”片內(nèi)地址(即要讀出EEPROM的位置)(8bit)。從00到FF中的任意一個,對應(yīng)EEPROM中的相應(yīng)位。5)收“ACK”應(yīng)答(1bit)。6)發(fā)“起始位”(1bit)。7)發(fā)“讀出代碼”(8bit),1010(A1A2A3)1,其中A1、A2、A3三位是片地址,由24C02的硬件接線決定,文中采用000。8)接收。9)發(fā)ACK應(yīng)答。10)發(fā)“停止位”。
要特別注意的兩個問題是:1)24C02有一個約10ms的片內(nèi)寫周期。在這個周期內(nèi),24C02是不對外界的操作作出反應(yīng)的。2)在發(fā)送數(shù)據(jù)的過程中,要確保當(dāng)SCL為高電平時,SDA保持穩(wěn)定。
解決第一個問題的常見方法有兩個,其一為采用延時等待,確保在寫過程中,在一個字節(jié)完成發(fā)送了停止位之后,微處理器等待足夠的時間,通常應(yīng)該超過10ms,再送下一個字節(jié),這段時間用來等待EEPROM完成片內(nèi)寫周期。另一個是采用輪詢的方式,判斷EEPROM是否完成了片內(nèi)寫周期。這種方式的主導(dǎo)思想是,當(dāng)向EEPROM發(fā)送寫標(biāo)志后,正常情況下,EEPROM應(yīng)該有ACK應(yīng)答。但是當(dāng)EEPROM在進(jìn)行片內(nèi)寫周期的時候,則不會產(chǎn)生這樣的應(yīng)答。程序據(jù)此判斷,EEPROM是否完成了片內(nèi)的寫周期程序。如果完成,則可以繼續(xù)寫入下一個要寫的內(nèi)容,否則繼續(xù)等待。
第一種方法編程較為簡單,但是會浪費(fèi)大量的機(jī)器時間,并且程序的延時時間不好確定。第二種方法的優(yōu)點(diǎn)在于,雖然編程較為復(fù)雜,但是較為快速,對其余的程序模塊影響較少,便于完成程序的模塊化設(shè)計(jì)。
對于在發(fā)送數(shù)據(jù)的過程中,要確保當(dāng)SCK為高電平時,SDA必須保持穩(wěn)定,應(yīng)該在程序中利用軟件給予保證。
如果可以很好的解決以上兩個問題,數(shù)據(jù)的寫入和讀出是方便快捷和可靠的。
湖南孫文康
評論