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 ISSFA-0238 1 Ver A 2011/09
2.6 EEPROM 相关的特殊缓存器 Special Function Register (SFR) 2.6.1 EERPOM TAKEY, IFCON, ISPFAH, ISPFAL, ISPFD and ISPFC Mnemoni c TAKEY IFCON ISPFAH ISPFAL ISPFD ISPFC Description Direct Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 RESET Time Access Key Interface Control ISP Flash Address - High ISP Flash Address - Low ISP Flash Data ISP Flash Control ISP function F7h TAKEY [7:0] 00H 8Fh - CDPR - - - - - ISPE 00H E1h ISPFAH [7:0] FFH E2h ISPFAL [7:0] FFH E3h ISPFD [7:0] FFH E4h EMF1 EMF2 EMF3 EMF4 - ISPF.2 ISPF.1 ISPF.0 00H Mnemonic: TAKEY Address: F7H TAKEY [7:0] 00H ISP 致能位 (ISPE) 预设为只读属性, 为避免程序错误导致 ISP 误动作, 使用者必须依序写入三笔数据到 (55h, AAh, 5Ah)TAKEY, 才可将 ISP 致能位 (ISPE) 改变为可写入属性, 程序参考如下 : MOV TAKEY, #055h MOV TAKEY, #0AAh MOV TAKEY, #05Ah ORL IFCON, #001H ; enable ISPE write attribute ; enable ISP function 注意 : 以上程序, 中间不可有任何程序执行, 包括不可有程序中断 (Interrupt) 或设定仿真器中断 (break point) 干扰其操作流程, 必须依序且完整的连续写入, 否则该功能将无法致能 完整程序可参考 Assembly 或 C 语言范例程序 ISSFA-0238 2 Ver A 2011/09
Mnemonic: IFCON Address: 8FH ITS CDPR F12K F8K ALEC[1] ALEC[0] EMEN 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 Address: E1H ISPFAH7 ISPFAH6 ISPFAH5 ISPFAH4 ISPFAH3 ISPFAH2 ISPFAH1 ISPFAH0 FFH ISPFAH [7:0]: ISP 共提供 16 位寻址, 此为高位 8~15 位置 Mnemonic: ISPFAL Address: E2H ISPFAL7 ISPFAL6 ISPFAL5 ISPFAL4 ISPFAL3 ISPFAL2 ISPFAL1 ISPFAL0 FFH ISPFAL [7:0]: ISP 共提供 16 位寻址, 此为低位 0~7 的位置 Mnemonic: ISPFD Address: E3H ISPFD7 ISPFD6 ISPFD5 ISPFD4 ISPFD3 ISPFD2 ISPFD1 ISPFD0 FFH ISSFA-0238 3 Ver A 2011/09
ISPFD [7:0]: ISP 数据缓存器 Mnemonic: ISPFC Address: E4H 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 111 Finish Flag*( 注一 ) 注一 : 只有 Write option 或 Erase option 后, 才须执行 Finish flag 指令以示完成, 否则写入 值皆视为无效 EEPROM 不须执行 Finish Flag 2.7 EEPROM Assembly 语言范例程序 : Description 此范例展示有 EEP_Byte_Program EEP_Chip_Protect EEP_Page_Erase EEP_Byte_Read EEP_Enable 及 EEP_Disable 基本功能, 提供使用者自行开发 ISP code 或 EEPROM 应用参考 Main program //========================================================================= // // 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 0 #define d_command_chip_protect 1 #define d_command_page_erase 2 //#define d_command_chip_erase 3 dat equ 30h addh equ 31h addl equ 32h org 0000h //Start Start: //test1====================== mov addh, #0x01 ISSFA-0238 4 Ver A 2011/09
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 EEP_Chip_Protect: call EEP_Enable mov ISPFC, #d_command_chip_protect; call EEP_Disable EEP_Page_Erase://256-Byte call EEP_Enable mov ISPFAH, addh mov ISPFC, #d_command_page_erase call EEP_Disable EEP_Byte_Read: clr A mov dph, addh mov dpl, addl movc A, @a+dptr mov dat, A EEP_Enable: MOV A, IFCON JB 0xE0.0, EEP_Enable_ 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_: EEP_Disable: MOV A, IFCON JNB 0xE0.0, EEP_Disable_ mov TAKEY, #0x55 mov TAKEY, #0xAA ISSFA-0238 5 Ver A 2011/09
mov TAKEY, #0x5A anl IFCON, #0xFE // ISPE=1, Enable ISP function MOV A, IFCON JB 0xE0.0, EEP_Disable EEP_Disable_: end 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 0 #define d_command_chip_protect 1 #define d_command_page_erase 2 #define d_command_chip_erase 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(); ISSFA-0238 6 Ver A 2011/09
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 urn temp; urn CBYTE[Addr]; //The range of valid index values for this macro is 0-65535. /* unsigned int EEPROM_Word_Read(unsigned int Addr) urn CWORD[Addr]; //The range of valid index values for this macro is 0-32767. ISSFA-0238 7 Ver A 2011/09
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); buf[(unsigned char)addr] = Data; // erase page // byte modify Main.c for(i=0; i<d_datalen; i++) EEPROM_Byte_Program((Addr&0xFF00)+i, buf[i]);// page program #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 范例程序产生器 " 可于新茂网站首页 > 下载专区 > 软件下载内下载此软件, 如有任何建议, 请來信告知, 谢谢! 销售客服 电子信箱 : sales@mail.syncmos.com.tw ISSFA-0238 8 Ver A 2011/09
技术支持电子信箱 : support@mail.syncmos.com.tw ISSFA-0238 9 Ver A 2011/09