|
STC很多系列的單片機片內都集成了EEPROM存儲器(其實是Data Flash),方便用戶使用,想得真周到!今天寫了個小程序,測試了一下,工作正常。下面就上我自己寫的源程序。本人在STC89C52RC單片機上試驗成功。
首先是stcEEPROM.h頭文件內容:
#ifndef __STCEEPROM_H__
#define __STCEEPROM_H__
#define STC_EEPROM_START_ADDR 0x2000 //STC89C52RC片內EEPROM起始地址
unsigned char eepromRead( unsigned int address );
void eepromWrite( unsigned int address, unsigned char writeData );
void eepromEraseSector( unsigned int address );
#endif
接下來是stcEEPROM.c文件內容:
sfr isp_data=0xe2;
sfr isp_addrh=0xe3;
sfr isp_addrl=0xe4;
sfr isp_cmd=0xe5;
sfr isp_trig=0xe6;
sfr isp_contr=0xe7;
//擦除片內EEPROM的一個扇區
//擦除只能以扇區為最小單位進行,沒法只擦除一個字節
//一個扇區是512個字節
//本函數參數里面的地址落在哪個扇區,則該扇區內數據都將被擦除
//例如:STC89C51RC片內EEPROM第一扇區開始地址為0x2000,結束地址為0x21ff
//如果調用 eepromEraseSector(0x2001),則第一扇區內數據都將被擦除
//擦除成功后,該扇區內各字節都將變為0xff
void eepromEraseSector (unsigned int address)
{ unsigned char i;
isp_addrl=address;
isp_addrh=address>>8;
isp_contr=0x01;
isp_contr=isp_contr|0x81; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHz
isp_cmd=0x03;
isp_trig=0x46;
isp_trig=0xb9;
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
}
//對STC片內EEPROM的指定地址寫入數據(即,字節編程)。
//注意:字節編程是指將eeprom的1寫成1或0,將0寫成0,而無法將0寫成1
//所以,在寫入數據前,一定要用扇區擦除將所有字節變為0xff
void eepromWrite(unsigned int address, unsigned char write_data)
{
unsigned char i;
isp_data=write_data;
isp_addrl=address;
isp_addrh=address>>8;
isp_contr=0x01;
isp_contr=isp_contr|0x81; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHz
isp_cmd=0x02;
isp_trig=0x46;
isp_trig=0xb9;
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00; } //讀取STC單片機內部EEPROM的一個字節
//主要不同的STC單片機EEPROM起始地址不同
//例如:STC89c52RC的片內EEPROM起始地址為0x2000
unsigned char eepromRead(unsigned int address)
{
unsigned char i,z;
isp_addrl=address;
isp_addrh=address>>8;
isp_contr=0x01;
isp_contr=isp_contr|0x81; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHz
isp_cmd=0x01;
isp_trig=0x46;
isp_trig=0xb9;
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
z=isp_data;
return(z);
}
使用的時候只需#include "stcEEPROM.h"即可。
一共3個函數,分別是擦除扇區、寫字節和讀字節。
要特別強調的是: 【1】每個型號的STC單片機都有自己的片內E2PROM起始地址和isp_trig,使用前注意看Datasheet的說明。 【2】片內EEPROM的寫操作叫做字節編程。它能將“1”寫成“1”或“0”,或者將“0”寫成“0”,但不能將“0”寫成“1”。所以,如果某存儲單元是0xff才可以對其編程。故,寫入前一定要擦除該單元,只有擦除才能將“0”擦除為“1”。 【3】擦除最小單位是扇區,512個字節為一個扇區(注意看Datasheet說明每個扇區的起始和結束地址)。 【4】如果在一個扇區中存放了大量數據,某次只要修改其中一個字節或一部分字節時,其它不需要修改的字節必須先讀出來,放入RAM中,然后擦除整個扇區,再將需要保留和修改的字節一一寫回。所以在設計程序時,盡量將同一次修改的數據放在同一個扇區中,而不同時修改的數據放在另外的扇區中。 【5】當電源電壓過低時(5v單片機在3.7v以下),不要進行EEPROM/IAP操作。
【6】為防止電壓過低造成的EEPROM操作失敗,可以先向某單元寫入一個已知數,然后再讀取它,如果返回值是剛才寫入的數,則說明EEPROM讀寫正常。還可以多檢測兩次以提高可靠性。
|
評分
-
查看全部評分
|