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

評論