單片機內(nèi)部EEPROM的讀寫原理及驅(qū)動程序編寫_第1頁
單片機內(nèi)部EEPROM的讀寫原理及驅(qū)動程序編寫_第2頁
單片機內(nèi)部EEPROM的讀寫原理及驅(qū)動程序編寫_第3頁
單片機內(nèi)部EEPROM的讀寫原理及驅(qū)動程序編寫_第4頁
單片機內(nèi)部EEPROM的讀寫原理及驅(qū)動程序編寫_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第第頁單片機內(nèi)部EEPROM的讀寫原理及驅(qū)動程序編寫

18.1內(nèi)部E2PROM簡介

(單片機)在運行時數(shù)據(jù)均存儲在內(nèi)部(RAM)(隨機存儲器)中,在掉電時無法保存數(shù)據(jù)。前面提到過可以通過增加外部存儲器AT24C01(芯片)的方式解決,但因為需要增加外部電路,性價比并不高,因此不(推薦)該方法。STC89C51、52內(nèi)部都自帶有2K字節(jié)的E2PROM。可通過對STC單片機內(nèi)部的E2PROM(編程)來實現(xiàn),這樣節(jié)省了片外資源,使用也比較方便。

STC單片機內(nèi)部的E2PROM并不是真正的E2PROM,而是用DATAFLASH(模擬)出來的,因此操作方法與普通E2PROM不同。STC單片機內(nèi)部的E2PROM采用的是IAP(在應用編程)技術(shù)實現(xiàn)讀寫操作,擦寫次數(shù)可達100,000次以上。所謂IAP指程序在運行時程序存儲器可有程序本身進行擦寫。IAP是相對ISP而言的,下面進行詳細的分析。

18.2ISP和IAP區(qū)別

ISP:InSystemProgramable是指在系統(tǒng)編程,通俗的講,就是片子已經(jīng)焊板子上,不用取下,就可以簡單而方便地對其進行編程。比如我們通過(電腦)給STC單片機(下載)程序。

IAP:InAppl(ic)ationProgramable是指在應用編程,就是片子提供一系列的機制((硬件)/軟件上的)當片子在運行程序的時候可以提供一種改變存儲器數(shù)據(jù)的方法。通俗點講,也就是說程序自己可以往程序存儲器里寫數(shù)據(jù)或修改程序。這種方式的典型應用就是用一小段代碼來實現(xiàn)程序的下載,實際上單片機的ISP功能就是通過IAP技術(shù)來實現(xiàn)的,即片子在出廠前就已經(jīng)有一段小的boot程序在里面,片子上電后,開始運行這段程序,當(檢測)到(上位機)有下載要求時,便和上位機(通信),然后下載程序到程序存儲區(qū)。

以STC89C52為例進行分析,存儲空間包括8KBflash程序存儲空間、512BRAM數(shù)據(jù)存儲空間、2KBE2PROM存儲空間。在51單片機中采用的是數(shù)據(jù)和程序存儲地址空間并行的哈佛結(jié)構(gòu),地址分配如下所示:

8KBflash地址:0——1FFFH

512BRAM地址:0——0200H

2KBE2PROM地址:2000H——27FFH

ISP操作對象為8KBflash,IAP的操作對象為2KBE2PROM,IAP不能對flash進行讀寫操作。IAP在讀寫操作的結(jié)果為,將要寫入的值與E2PROM中原來的值進行與操作然后將結(jié)果存入。例如在地址2000H處第一次成功寫入11010110,第二次寫入00111010,讀出的結(jié)果將會是這兩個結(jié)果的相與0010010,因此如果寫入數(shù)據(jù)前該處數(shù)據(jù)不為FFH,那么寫入的數(shù)據(jù)將會不正確。IAP的擦除操作的功能就是將數(shù)據(jù)變?yōu)镕FH,但擦除操作是以扇區(qū)為基本操作單位的,STC89C52的E2PROM扇區(qū)地址安排如下表所示。每個扇區(qū)的大小為512B。

數(shù)據(jù)存儲操作按照以下步驟進行:

1.寫操作之前先將對應扇區(qū)的有效數(shù)據(jù)讀取到RAM中暫存(這步不是必須的);

2.對整個扇區(qū)進行擦除操作,擦除后該扇區(qū)的數(shù)據(jù)均為FFH;

3.將要寫入的字節(jié)寫入;

4.將暫存的數(shù)據(jù)寫入;

STC單片機IAP程序操作步驟如下:

1.配置ISP_CONTR(寄存器),使能第7位ISPEN,讓ISP_IAP功能生效,并配置低三位的等待時間;

2.寫指令:讀/寫/擦除,3個命令;

3.賦值ISP_(AD)DRH和ISP_ADDRL的地址值,分別為所要操作位置的地址高低位;

4.關(guān)閉總中斷EA,因為下面要寫的2個觸發(fā)指令必須是連續(xù)操作;

5.執(zhí)行ISP_IAP觸發(fā)指令,觸發(fā)后才能進行讀寫;

6.打開總中斷EA,關(guān)閉ISP_IAP功能,清除相關(guān)寄存器。

IAP及E2PROM新增特殊功能寄存器如下圖所示:

1.ISP_DATA:ISP/IAP數(shù)據(jù)寄存器

ISP/IAP操作時的數(shù)據(jù)存儲器,ISP/IAP從Flash讀出來的數(shù)據(jù)存放在此處,向Flash寫的數(shù)據(jù)也需要放在此處。

2.ISP_ADDRH/ISP_ADDRL:ISP/IAP地址寄存器

分別為地址的高、低八位,復位值為0x0000。

3.ISP_CMD:ISP/IAP命令寄存器

MS1MS0=00

待機模式,無數(shù)據(jù)讀寫操作;

MS1MS0=01

從應用程序區(qū)對”DataFlash/E2PROM區(qū)”進行字節(jié)讀命令

MS1MS0=10

從應用程序區(qū)對”DataFlash/E2PROM區(qū)”進行字節(jié)寫命令

MS1MS0=11

從應用程序區(qū)對”DataFlash/E2PROM區(qū)”進行扇區(qū)擦除命令

4.ISP_TRIG:ISP/IAP命令觸發(fā)寄存器

在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入0x46,再寫入0xB9,ISP/IAP功能才會生效。

5.ISP_CONTR:ISP/IAP控制寄存器

ISPEN:ISP/IAP功能允許位。ISPEN=0,禁止ISP/IAP讀、寫、擦除操作。ISPEN=1,允許ISP/IAP讀、寫、擦除操作。

SWBS:0表示,軟件從應用程序區(qū)啟動,1表示,從系統(tǒng)ISP監(jiān)控程序區(qū)啟動。需與SW(RS)T配合使用。

SWRST:0不操作,1表示產(chǎn)生軟件系統(tǒng)復位,硬件自動復位。

SWBS=1,SWRST=1時,表示在應用程序區(qū)軟件復位并從系統(tǒng)ISP監(jiān)控程序區(qū)開始執(zhí)行程序。SWBS=0,SWRST=1時,表示在應用程序區(qū)軟件復位并從應用程序區(qū)開始處執(zhí)行程序。

B2~B0表示在讀、寫、擦除操作過程中(CPU)插入的等待時間,推薦選擇如下所示。

18.3E2PROM驅(qū)動函數(shù)編寫

前面已經(jīng)講解了與內(nèi)部E2PROM有關(guān)的6個寄存器的功能,下面我們結(jié)合這些寄存器編寫驅(qū)動函數(shù),因為在正常的reg52.h中并沒有對上述6個特殊功能寄存器進行聲明,所以首先得進行聲明以及名字字節(jié)定義,如下代碼所示:

/****************特殊功能寄存器聲明****************/sfrISP_DATA=0xE2;sfrISP_ADDRH=0xE3;sfrISP_ADDRL=0xE4;sfrISP_CMD=0xE5;sfrISP_TRIG=0xE6;sfrISP_CONTR=0xE7;/******************定義命令字節(jié)******************/#defineread_cmd0x01//讀命令#definewirte_cmd0x02//寫命令#defineerase_cmd0x03//擦除命令/****定義操作等待時間以及允許IAP操作*******/#defineenable_w(ai)t(Ti)me0x82//系統(tǒng)工作(時鐘)接下來兩個函數(shù)分別為關(guān)閉、開啟ISP/IAP功能函數(shù),以便后續(xù)調(diào)用,如下所示:

voidISP_IAP_disable(void)//關(guān)閉ISP_IAP{EA=1;//恢復中斷ISP_CONTR=0x00;ISP_CMD=0x00;ISP_TRIG=0x00;}voidISP_IAP_trigger()//開啟{EA=0;//下面的2條指令必須連續(xù)執(zhí)行,故關(guān)中斷ISP_TRIG=0x46;//送觸發(fā)命令字0x46ISP_TRIG=0xB9;//送觸發(fā)命令字0xB9}如上所示,在開啟功能也成為功能觸發(fā)函數(shù)時需要關(guān)閉系統(tǒng)中斷EA,保證命令字0x46、0xB9被連續(xù)寫入。單片機對E2PROM的操作包括讀、寫以及擦除,讀數(shù)據(jù)操作步驟如下所示:

1.清零數(shù)據(jù)寄存器ISP_DATA,這一步不是必須的;

2.向寄存器ISP_CMD寫入讀數(shù)據(jù)命令;

3.允許ISP/IAP,并給出操作等待時間;

4.發(fā)送要讀取的目標數(shù)據(jù)的存儲地址;

5.開啟ISP/IAP功能;

6.讀出ISP_DATA中的數(shù)據(jù)并保存;

7.關(guān)閉ISP/IAP功能;

上面講解的是讀取單個字節(jié)的步驟,如需讀取多個字節(jié)的數(shù)據(jù)只需重復第4到第6步,讀數(shù)據(jù)函數(shù)如下所示:

voidISP_IAP_readData(uintbeginAddr,uchar*pBuf,uintdataSize)//讀取數(shù)據(jù){ISP_DATA=0;//清零,不清也可以ISP_CMD=read_cmd;//指令:讀取ISP_CONTR=enable_waitTime;//開啟ISP_IAP,并送等待時間while(dataSize--)//循環(huán)讀取{ISP_ADDRH=(uchar)(beginAddr>>8);//送地址高字節(jié)ISP_ADDRL=(uchar)(beginAddr//送地址低字節(jié)ISP_IAP_trigger();//觸發(fā)beginAddr++;//地址++*pBuf++=ISP_DATA;//將數(shù)據(jù)保存到接收緩沖區(qū)}ISP_IAP_disable();//關(guān)閉ISP_IAP功能}寫數(shù)據(jù)函數(shù)與讀數(shù)據(jù)函數(shù)類似,如下所示:

voidISP_IAP_wri(te)Data(uintbeginAddr,uchar*pDat,uintdataSize)//寫數(shù)據(jù){ISP_CONTR=enable_waitTime;//開啟ISP_IAP,并送等待時間ISP_CMD=wirte_cmd;//送字節(jié)編程命令字while(dataSize--){ISP_ADDRH=(uchar)(beginAddr>>8);//送地址高字節(jié)ISP_ADDRL=(uchar)(beginAddr//送地址低字節(jié)ISP_DATA=*pDat++;//送數(shù)據(jù)beginAddr++;ISP_IAP_trigger();//觸發(fā)}ISP_IAP_disable();//關(guān)閉}擦除扇區(qū)函數(shù)如下所示:

voidISP_IAP_sectorErase(uintsectorAddr)//扇區(qū)擦除{ISP_CONTR=enable_waitTime;//開啟ISP_IAP;并送等待時間ISP_CMD=erase_cmd;//送扇區(qū)擦除命令字ISP_ADDRH=(uchar)(sectorAddr>>8);//送地址高字節(jié)ISP_ADDRL=(uchar)(sectorAddr//送地址低字節(jié)ISP_IAP_trigger();//觸發(fā)ISP_IAP_disable();//關(guān)閉ISP_IAP功能}值得注意的是:在擦除扇區(qū)函數(shù)中,地址只需在該扇區(qū)范圍內(nèi)即可,不要求發(fā)送該扇區(qū)的首地址。到此我們編寫完成了所有函數(shù),因此將函整合到完整的驅(qū)動代碼中。"Drive_Eep(rom).h"代碼如下:

#ifndef__Eeprom_H__#define__Eeprom_H__externvoidISP_IAP_disable(void);//關(guān)閉ISP_IAPexternvoidISP_IAP_trigger();//觸發(fā)externvoidISP_IAP_readData(unsignedintbeginAddr,unsignedchar*pBuf,unsignedintdataSize);//讀取數(shù)據(jù)externvoidISP_IAP_writeData(unsignedintbeginAddr,unsignedchar*pDat,unsignedintdataSize);//寫數(shù)據(jù)externvoidISP_IAP_sectorErase(unsignedintsectorAddr);//扇區(qū)擦除#endif"Drive_Eeprom.c"代碼如下:

#include#defineuintunsignedint#defineucharunsignedchar/****************特殊功能寄存器聲明****************/sfrISP_DATA=0xE2;sfrISP_ADDRH=0xE3;sfrISP_ADDRL=0xE4;sfrISP_CMD=0xE5;sfrISP_TRIG=0xE6;sfrISP_CONTR=0xE7;/******************定義命令字節(jié)******************/#defineread_cmd0x01//讀命令#definewirte_cmd0x02//寫命令#defineerase_cmd0x03//擦除命令/****定義操作等待時間以及允許IAP操作*******/#defineenable_waitTime0x82//系統(tǒng)工作時鐘>8);//送地址高字節(jié)ISP_ADDRL=(uchar)(beginAddr//送地址低字節(jié)ISP_IAP_trigger();//觸發(fā)beginAddr++;//地址++*pBuf++=ISP_DATA;//將數(shù)據(jù)保存到接收緩沖區(qū)}ISP_IAP_disable();//關(guān)閉ISP_IAP功能}voidISP_IAP_writeData(uintbeginAddr,uchar*pDat,uintdataSize)//寫數(shù)據(jù){ISP_CONTR=enable_waitTime;//開啟ISP_IAP,并送等待時間ISP_CMD=wirte_cmd;//送字節(jié)編程命令字while(dataSize--){ISP_ADDRH=(uchar)(beginAddr>>8);//送地址高字節(jié)ISP_ADDRL=(uchar)(beginAddr//送地址低字節(jié)ISP_DATA=*pDat++;//送數(shù)據(jù)beginAddr++;ISP_IAP_trigger();//觸發(fā)}ISP_IAP_disable();//關(guān)閉}voidISP_IAP_sectorErase(uintsectorAddr)//扇區(qū)擦除{ISP_CONTR=enable_waitTime;//開啟ISP_IAP;并送等待時間ISP_CMD=erase_cmd;//送扇區(qū)擦除命令字ISP_ADDRH=(uchar)(sectorAddr>>8);//送地址高字節(jié)ISP_ADDRL=(uchar)(sectorAddr//送地址低字節(jié)ISP_IAP_trigger();//觸發(fā)ISP_IAP_disable();//關(guān)閉ISP_IAP功能}18.4E2PROM應用

下面我們下一個小的應用程序來驗證我們驅(qū)動函數(shù),函數(shù)實現(xiàn)的功能為記錄開發(fā)板上電的次數(shù)。并把上電的次數(shù),顯示到1602液晶顯示器上,主函數(shù)如下圖所示:

#include#include"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論