EEPROM 功能使用方法 - 新茂國際科技股份有限公司

EEPROM 功能使用方法
EEPROM 功能使用方法
1
適用產品:
1.1 SM39R16A2/ SM39R12A2/ SM39R08A2
1.2 SM39R4051/ SM39R2051
1.3 SM39R04G1/ SM39R02G1
2
EEPROM 功能概述:
2.1 使用 code flash 模擬為 Internal EEPROM,在程序執行時,可將 code flash 作為 data flash 儲存
資料使用。
2.2 EEPROM command 包括:Chip erase、page erase 及 byte program。
2.3 EEPROM 必須避免定址在主程序(user code)區域;而為保護 ISP code,在 ISP 保護區(ISP block
N)所保護的位置,EEPROM command 將視為無效。
Start addr: $0000
EEPROM must
avoid
User code
Memory space
EEPROM valid...
EEPROM in-valid
ISP code
End addr: $3FFF
2.4 MCU 空片及 erase 後 code flash 皆為 FFh。Flash 每一 page=256 byte。
2.5 Page erase 及 byte program 時間紀錄:
EEPROM 執行 command 時間,為系統內振,與 user 設定的系統晶振頻率無關
page erase (ms)
byte program(ms)
about 28~35ms
about 0.065~0.075
Specifications subject to change without notice, contact your sales representatives for the most recent information.
ISSFA-0237
1
Ver A 2011/09
EEPROM 功能使用方法
2.6 EEPROM 相關的特殊暫存器 Special Function Register (SFR)
2.6.1 EERPOM register – TAKEY, IFCON, ISPFAH, ISPFAL, ISPFD and ISPFC
Mnemoni
c
Description
Bit 7
Direct
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
RESET
ISP function
TAKEY
IFCON
ISPFAH
ISPFAL
ISPFD
ISPFC
Time Access Key
register
Interface Control
register
ISP Flash
Address - High
register
ISP Flash
Address - Low
register
ISP Flash Data
register
ISP Flash Control
register
F7h
TAKEY [7:0]
8Fh
-
CDPR
-
-
00H
-
-
ISPE
00H
E1h
ISPFAH [7:0]
FFH
E2h
ISPFAL [7:0]
FFH
E3h
ISPFD [7:0]
FFH
E4h
EMF1
EMF2
EMF3
EMF4
-
ISPF.2
6
ISPF.1
ISPF.0
00H
Address: F7H
Mnemonic: TAKEY
7
-
5
4
3
TAKEY [7:0]
2
1
0
Reset
00H
ISP 致能位元(ISPE)預設為唯讀屬性,為避免程序錯誤導致 ISP 誤動作,使用者必須依序寫入三筆資料到(55h, AAh,
5Ah)TAKEY,才可將 ISP 致能位元(ISPE)改變為可寫入屬性,程序參考如下:
MOV TAKEY, #055h
MOV TAKEY, #0AAh
MOV TAKEY, #05Ah
; enable ISPE write attribute
ORL IFCON, #001H
; enable ISP function
注意:以上程序,中間不可有任何程序執行,包括不可有程序中斷(Interrupt)或設定模擬器中斷(break point)
干擾其操作流程,必須依序且完整的連續寫入,否則該功能將無法致能。完整程序可參考 Assembly 或 C
語言範例程序。
Specifications subject to change without notice, contact your sales representatives for the most recent information.
ISSFA-0237
2
Ver A 2011/09
EEPROM 功能使用方法
Mnemonic: IFCON
7
6
ITS
CDPR
5
F12K
4
F8K
3
ALEC[1]
2
ALEC[0]
1
EMEN
Address: 8FH
0
Reset
ISPE
00H
ISP 致能位元(ISPE)預設為唯讀屬性,為避免程序錯誤導致 ISP 誤動作,使用者必須依序寫入三筆資料到(55h, AAh,
5Ah)TAKEY,才可將 ISP 致能位元(ISPE)改變為可寫入屬性:
ISPE: = 1, ISP致能,ISP暫存器(ISPFAH, ISPFAL, ISPFD , ISPFC)設為可寫入。
= 0, ISP禁能,ISP暫存器(ISPFAH, ISPFAL, ISPFD and ISPFC)為唯讀 (預設)。
程序範例,ISP byte program #22H 到 program flash 位置$1005H,如下:
MOV TAKEY, #055h
MOV TAKEY, #0AAh
MOV TAKEY, #05Ah
; enable ISPE write attribute
ORL IFCON, #001H
; enable ISP function
MOV ISPFAH, #010H
; set flash address-high, 10H
MOV ISPFAL, #005H
; set flash address-low, 05H
MOV ISPFD, #022H
; set flash data to be programmed, data = 22H
MOV ISPFC, #000H
; start to program #22H to the flash address $1005H
Mnemonic: ISPFAH
7
6
ISPFAH7 ISPFAH6
5
ISPFAH5
4
ISPFAH4
3
ISPFAH3
2
ISPFAH2
1
ISPFAH1
Address: E1H
0
Reset
ISPFAH0
FFH
ISPFAH [7:0]: ISP 共提供 16 位元定址,此為高位元 8~15 位置。
Mnemonic: ISPFAL
7
6
ISPFAL7
ISPFAL6
5
ISPFAL5
4
ISPFAL4
3
ISPFAL3
2
ISPFAL2
1
ISPFAL1
Address: E2H
0
Reset
ISPFAL0 FFH
1
ISPFD1
Address: E3H
0
Reset
ISPFD0
FFH
ISPFAL [7:0]: ISP 共提供 16 位元定址,此為低位元 0~7 的位置。
Mnemonic: ISPFD
7
6
ISPFD7
ISPFD6
5
ISPFD5
4
ISPFD4
3
ISPFD3
2
ISPFD2
Specifications subject to change without notice, contact your sales representatives for the most recent information.
ISSFA-0237
3
Ver A 2011/09
EEPROM 功能使用方法
ISPFD [7:0]: ISP 資料暫存器。
Mnemonic: ISPFC
Address: E4H
7
6
5
4
3
2
1
0
Reset
EMF1
EMF2
EMF3
EMF4
ISPF[2]
ISPF[1]
ISPF[0]
00H
EMF1:
Entry mechanism (1) flag, clear by reset. (Read only)
ISP 進入記錄旗標(1),唯讀,可由晶片復位清除
EMF2:
Entry mechanism (2) flag, clear by reset. (Read only)
ISP 進入記錄旗標(2),唯讀,可由晶片復位清除
EMF3:
Entry mechanism (3) flag, clear by reset. (Read only)
ISP 進入記錄旗標(3),唯讀,可由晶片復位清除
EMF4:
Entry mechanism (4) flag, clear by reset. (Read only)
ISP 進入記錄旗標(4),唯讀,可由晶片復位清除
ISPF [2:0]: ISP function select bit.
ISP 功能選擇元位,提供七組功能
ISPF[2:0]
ISP function
000
Byte program
001
Chip protect
010
Page erase
011
Chip erase
100
Write option
101
Read option
110
Erase option
Finish Flag*(註一)
111
註一:只有Write option或Erase option後,才須執行Finish flag指令以示完成,否則寫入
值皆視為無效。EEPROM不須執行Finish Flag。
2.7 EEPROM Assembly 語言範例程式:
Description
Main program
此範例展示有 EEP_Byte_Program、EEP_Chip_Protect、EEP_Page_Erase、EEP_Byte_Read、EEP_Enable
及 EEP_Disable 基本功能,提供使用者自行開發 ISP code 或 EEPROM 應用參考。
//=========================================================================
//
//
S Y N C M O S T E C H N O L O G Y
//
//=========================================================================
#include "SM39R16A2.h"
//ISPFC.ISPF[2:0]
#define d_COMMAND_BYTE_PROGRAM
#define d_COMMAND_CHIP_PROTECT
#define d_COMMAND_PAGE_ERASE
//#define d_COMMAND_CHIP_ERASE
0
1
2
3
dat
equ 30h
addh equ 31h
addl equ 32h
org
0000h
//Start
Start:
//test1======================
mov
addh,
#0x01
Specifications subject to change without notice, contact your sales representatives for the most recent information.
ISSFA-0237
4
Ver A 2011/09
EEPROM 功能使用方法
mov
addl,
#0x00
mov
dat,
#0x10
call
EEP_Byte_Program
call
EEP_Byte_Read
mov
P0,
dat
//test2======================
mov
addh,
#0x02
mov
addl,
#0x00
mov
dat,
#0x20
call
EEP_Byte_Program
call
EEP_Byte_Read
mov
P1,
dat
//===========================
jmp
$
EEP_Byte_Program:
call
EEP_Enable
mov
ISPFD,
dat
mov
ISPFAH, addh
mov
ISPFAL, addl
mov
ISPFC,
#d_COMMAND_BYTE_PROGRAM
call
EEP_Disable
ret
EEP_Chip_Protect:
call
EEP_Enable
mov
ISPFC,
#d_COMMAND_CHIP_PROTECT;
call
EEP_Disable
ret
EEP_Page_Erase://256-Byte
call
EEP_Enable
mov
ISPFAH, addh
mov
ISPFC,
#d_COMMAND_PAGE_ERASE
call
EEP_Disable
ret
EEP_Byte_Read:
clr
A
mov
dph,
addh
mov
dpl,
addl
movc
A,
@a+dptr
mov
dat,
A
ret
EEP_Enable:
MOV
A,
IFCON
JB
0xE0.0, EEP_Enable_ret
mov
TAKEY,
#0x55
mov
TAKEY,
#0xAA
mov
TAKEY,
#0x5A
orl
IFCON,
#0x01
// ISPE=1, Enable ISP function
MOV
A,
IFCON
JNB
0xE0.0, EEP_Enable
EEP_Enable_ret:
ret
EEP_Disable:
MOV
A,
IFCON
JNB
0xE0.0, EEP_Disable_ret
mov
TAKEY,
#0x55
mov
TAKEY,
#0xAA
Specifications subject to change without notice, contact your sales representatives for the most recent information.
ISSFA-0237
5
Ver A 2011/09
EEPROM 功能使用方法
mov
TAKEY,
anl
IFCON,
MOV
A,
JB
0xE0.0,
EEP_Disable_ret:
ret
end
#0x5A
#0xFE
IFCON
EEP_Disable
// ISPE=1, Enable ISP function
2.8 EEPROM C 語言範例程式:
Description
EEPROM
program
此範例展示有 EEP_Byte_Program、EEP_Chip_Protect、EEP_Page_Erase、EEP_Byte_Read、EEP_Enable
及 EEP_Disable 基本功能,提供使用者自行開發 ISP code 或 EEPROM 應用參考。
//====================================================================
//
//
S Y N C M O S T E C H N O L O G Y
//
//====================================================================
#include <source\SM39R04G1.h>
#include <absacc.h>
/* Include Macro Definitions */
/*ISPFC.ISPF[2:0]*/
#define d_Command_Byte_Program
#define d_Command_Chip_Protect
#define d_Command_Page_Erase
#define d_Command_Chip_Erase
0
1
2
3
//====================================================================
#define d_DATALEN 128
// idata limit:1~128
unsigned char idata buf[d_DATALEN]; // idata limit:1~128
void EEPROM_Enable(void)
{
TAKEY = 0x55;
TAKEY = 0xAA;
TAKEY = 0x5A;
IFCON |= 0x01;
}
void EEPROM_Disable(void)
{
TAKEY = 0x55;
TAKEY = 0xAA;
TAKEY = 0x5A;
IFCON &= 0xFE;
}
// ISPE=1, Enable ISP function
// ISPE=0, Disable ISP function
void EEPROM_Byte_Program(unsigned int Addr, unsigned char Data)
{
EEPROM_Enable();
ISPFD
= Data;
ISPFAH
= (Addr / 256);
ISPFAL
= (Addr % 256);
ISPFC
= d_Command_Byte_Program;
EEPROM_Disable();
}
Specifications subject to change without notice, contact your sales representatives for the most recent information.
ISSFA-0237
6
Ver A 2011/09
EEPROM 功能使用方法
void EEPROM_Page_Erase(unsigned int Addr)
{
EEPROM_Enable();
ISPFAH
= (unsigned char)(Addr >>8);
ISPFC
= d_Command_Page_Erase;
EEPROM_Disable();
}
/*
void EEPROM_Page_Erase(unsigned int Addr)
{
EEPROM_Enable();
ISPFAH
= (unsigned char)(Addr >>8);
ISPFC
= d_Command_Chip_Erase;
EEPROM_Disable();
}
*/
// erase 256-Byte
// erase while chip
/*
void EEPROM_Chip_Protect(void)
{
EEPROM_Enable();
ISPFC
= d_Command_Chip_Protect;
EEPROM_Disable();
}
*/
void EEPROM Sector Program(unsigned int Addr start, unsigned int Addr end, unsigned
char Data)
{
unsigned int i;
for(i=Addr_start; i<=Addr_end; i++)
{
EEPROM_Byte_Program(i, Data);
}
/* for(i=0; i<(Addr_end - Addr_start)+1; i++)
{
EEPROM_Byte_Program(Addr_start+i, Data);
}
*/
}
unsigned char EEPROM_Byte_Read(unsigned int Addr)
{
/* unsigned char temp;
unsigned char code *pAddr;
pAddr = Addr;
// Set address
temp = (*pAddr);
// Read data
return temp;
*/
return CBYTE[Addr];
//The range of valid index values for this macro
is 0-65535.
}
/*
unsigned int EEPROM_Word_Read(unsigned int Addr)
{
return CWORD[Addr];
//The range of valid index values for this macro
is 0-32767.
Specifications subject to change without notice, contact your sales representatives for the most recent information.
ISSFA-0237
7
Ver A 2011/09
EEPROM 功能使用方法
}
*/
void EEPROM_Byte_Modify(unsigned int Addr, unsigned char Data)
{
unsigned char i;
for(i=0; i<d_DATALEN; i++)
buf[i] = EEPROM_Byte_Read((Addr&0xFF00)+i); // page read
EEPROM_Page_Erase(Addr);
// erase page
buf[(unsigned char)Addr] = Data;
// byte modify
for(i=0; i<d_DATALEN; i++)
EEPROM_Byte_Program((Addr&0xFF00)+i, buf[i]);// page program
Main.c
}
#include <source\SM39R04G1.h>
#include <source\EEPROM.h>
#define test_len
100
#define test_start_addr
0x1000
void main(void)
{
unsigned int i;
unsigned char buf[test_len];
EEPROM_Page_Erase(test_start_addr);
EEPROM_Sector_Program(test_start_addr, test_start_addr+test_len-1, 0x55);
for(i=0; i<test_len; i++)
{
buf[i]= EEPROM_Byte_Read(test_start_addr+i);
}
for(i=0; i<test_len; i++)
{
EEPROM_Byte_Modify(test_start_addr+i, i);
}
for(i=0; i<test_len; i++)
{
buf[i]= EEPROM_Byte_Read(test_start_addr+i);
}
while(1)
{
}
}
新茂國際科技 希望能為客戶減少開發的時間及辛勞,針對所有特殊功能應在C語言程序開發,皆提供 “Codzard
範例程式產生器"可於 新茂網站首頁>下載專區> 軟體下載 內下載此軟體,如有任何建議,請來信告知,謝謝!
銷售客服
電子信箱: [email protected]
Specifications subject to change without notice, contact your sales representatives for the most recent information.
ISSFA-0237
8
Ver A 2011/09
EEPROM 功能使用方法
技術支援
電子信箱: [email protected]
Specifications subject to change without notice, contact your sales representatives for the most recent information.
ISSFA-0237
9
Ver A 2011/09