ISP & EEPROM 功能使用方法 ISP & EEPROM 功能使用方法 1 适用产品: 1.1 SM59R16A2/ SM59R08A2 1.2 SM59R16A5/ SM59R09A5/ SM59R05A5/ SM59R16A3/ SM59R09A3/ SM59R05A3 1.3 SM59R16G6/ SM59R09G6/ SM59R05G6 1.4 SM59R04A2/ SM59R04A1/ SM59R03A1/ SM59R02A1 2 功能概述: 2.1 SM59R 系列皆有提供 ISP code 烧录档及 ISP source code,利于客户生产及开发。 2.2 ISP(In System Program)与 IAP(In Application Program)之差异说明: IAP:SM59R系列使用code flash仿真为Internal EEPROM,在客户应用程序执行中,即可变 更code flash,指令包括(1)byte program (2)chip erase (3)page erase (4)chip protect。 ISP:MCU 在线烧写编程常用的方式之一,属于 IAP+UART(或其它通讯方式…)的应用,新茂 标准的 ISP code 都是使用 UART0。另除了 IAP 的指令可使用外,还可以执行功能选择位区域 做读写的变更,指令包括 (1)Write option (2)Read option (3)Erase option (4)Finish flag。 2.3 SM59R 系列 MCU 各型号差异比较列表(一): ISP code size 最大限制(KB) Page size (Byte) ISP code supported ISP H/W Entry Mechanism FFFFh 4K byte 256 有 有 F000h FFFFh 4K byte 256 有 有 SM59R05A5 F000h FFFFh 4K byte 256 有 有 SM59R16A3 F000h FFFFh 4K byte 256 有 有 SM59R09A3 F000h FFFFh 4K byte 256 有 有 SM59R05A3 F000h FFFFh 4K byte 256 有 有 SM59R16G6 F000h FFFFh 4K byte 256 有 有 SM59R09G6 F000h FFFFh 4K byte 256 有 有 SM59R05G6 F000h FFFFh 4K byte 256 有 有 ISP addr. Device addr. start addr. end SM59R16A5 F000h SM59R09A5 Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 1 Ver B 2011/01 ISP & EEPROM 功能使用方法 SM59R16A2 - - 无限制 512 有 无 SM59R08A2 - - 无限制 512 有 无 SM59R04A2 3000h 3FFFh 4K byte 256 有 有 SM59R04A1 3000h 3FFFh 4K byte 256 有 有 SM59R03A1 3000h 3FFFh 4K byte 256 有 有 SM59R02A1 3000h 3FFFh 4K byte 256 有 有 Notice: 上述只有 SM59R16A2 及 SM59R08A2 出厂没有带 ISP code,其它出厂皆有。 (如有须要请联系代理商或新茂原厂提供即可) 2.4 SM59R 系列 MCU 各型号差异比较列表(二): 写入位置 烧写指令 Device Device SM59R16A5/ SM59R09A5/ SM59R05A5/ SM59R16A3/ SM59R09A3/ SM59R05A3/ SM59R16G6/ SM59R09G6/ SM59R05G6/ SM59R04A2/ SM59R04A1/ SM59R03A1/ SM59R02A1/ SM59R16A2/ SM59R08A2 IAP ISP ICP IAP ISP ICP byte program O O O O O O chip erase O O O O O O page erase O O O O O O chip protect O O O X X O Read option O O O X X O Write option X O O X X O Erase option X O O X X O Finish flag*(注一) X O O X X X Code flash Function Option (功能选择位) 注一:只有SM59R16G6/ SM59R09G6/ SM59R05G6有此功能。 Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 2 Ver B 2011/01 ISP & EEPROM 功能使用方法 3 以下说明适用:SM59R16A5/ SM59R09A5/ SM59R05A5/ SM59R16A3 SM59R09A3/ SM59R05A3/ SM59R16G6/ SM59R09G6/ SM59R05G6/ SM59R04A2/ SM59R04A1/ SM59R03A1/ SM59R02A1 (关于 SM59R16A2/ SM59R08A2 请参考第 4 章节说明)。 3.1 ISP service program 最大可设计为 4K byte,共可区分为 16 个 page,每一 page 为 256 byte; 未使用到的部分仍可当作 code flash 使用(ISP 寻址地址请参考:各型号 ISP 差异列表)。 3.2 chip protect,当 chip protect 之前,code flash (包括 ISP service program)仍可被 writer 或 ICE 读出,chip protect 之后,code flash (包括 ISP service program)则不可读出。 3.3 ISP service program 进入方式: 3.3.1 可由使用者选择致能或禁能,但系统设计时必须注意各种条件,以避免误入ISP service program。 3.3.2 ISP service program的进入方式,条件如下(以下复位仅限制为POR或Pad reset): 硬件:code flash addr. $0000=#FFH。 硬件:P2.6, P2.7为低电位。 硬件:P4.3为低电位。 硬件:P3.0 输入两个频率。 软件:可应用程序”LJMP”跳跃至ISP service program相对的起启位置。 3.4 为避免误入 ISP,MCU 复位必须是 POR 或 PAD reset 才可以进入,若是 LVR 或 software reset 则不会进入 ISP。 3.5 为保护功能选择位,只限定 MCU 是以硬件进入 ISP 才可以执行变更功能选择位,若以软件进入 ISP(例如,LJMP 3E00h)则不可以变更功能选择位。 3.6 为保护功能选择位,ISP 执行完成后,离开 ISP servicer program 时,建议使用 software reset(SFR 会 Reset),不建议使用 LJMP 0000h 的方式(SFR 不会 Reset)。 3.7 ISP Command Table: 写入地址 code flash 功能选择位 烧写指令 IAP ISP byte program O O chip erase O O page erase O O chip protect O O Write option X O Read option O O Erase option X O Finish flag*(注一) X O 注一:只有SM59R16G6/ SM59R09G6/ SM59R05G6有此功能。 Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 3 Ver B 2011/01 ISP & EEPROM 功能使用方法 3.8 共有六组重要的功能选择位提供使用,ISP 及 ICP/Writer 存取能力的比较,参考如下:59R 功能选择位说明 ISPFAL ISP Read ISP Write ICP/Writer Read ICP/Writer Write 0x03H WDTEN. O O O O 0x04H System clock select, FCLK [3:0] O O O O 0x05H pin function select O O O O 0x06H Internal reset time O O O O 0x07H Lock bit N O X O O 0x08H ISP entry mechanism select O O O O 3.8.1 看门狗功能致能(ISPFAL=0x03H)说明: 于程序中执行看门狗功能前需先将此特殊功能缓存器第7位置低(0x03H,Bit 7=0),此位可使 用ISP或ICP方式设定;于程序执行中亦可使用IAP之字节读命令读取此位之状态。 Bit 7 WDTEN Bit 6 - Bit 5 - Bit 4 - Bit 3 - Bit 2 - Bit 1 - Bit 0 - WDTEN 0 is enable WDT 1 is disable WDT 3.8.2 时钟来源选择(ISPFAL=0x04H) 说明: 可使用ISP或ICP等方式设定时钟来源选择;于程序执行中亦可使用IAP之字节读命令读取时钟 来源之设定值。 System clock Select: Bit 7 - Bit 6 - Bit 5 - Bit 4 - System clock select FCLK[3:0] XXXX-0XXX XXXX-1000 XXXX-1001 XXXX-1010 XXXX-1011 XXXX-1100 Bit 3 FCLK3 Bit 2 FCLK2 Bit 1 FCLK1 Bit 0 FCLK0 System clock External crystal 24MHz from internal OSC 20MHz from internal OSC 16MHz from internal OSC 12MHz from internal OSC 8MHz from internal OSC Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 4 Ver B 2011/01 ISP & EEPROM 功能使用方法 XXXX-1101 XXXX-1110 XXXX-1111 4MHz from internal OSC 2MHz from internal OSC 1MHz from internal OSC 3.8.3 P4[4:7] I/O功能选择(ISPFAL=0x05H) 说明: 可使用ICP或ISP方式设定,将OCI_SCL、ALE、OCI_SDA and RESET 等I/O 定义成P4.4、 P4.5、P4.6 and P4.7;于程序执行中亦可使用IAP之字节读命令读取I/O 之设定值。 Bit 7 - Bit 6 - Bit 5 - Bit 4 - Bit 3 RESET Bit 2 OCI_SDA Bit 1 ALE Bit 0 OCI_SCL RESET: 0 is bi-direction I/O pin (P4.7). 1 is reset input pin with 1000ns deglitch. OCI_SDA: 0 is bi-direction I/O pin (P4.6). 1 is OCI_SDA pin. ALE: 0 is bi-direction I/O pin (P4.5). 1 is ALE pin. OCI_SCL: 0 is bi-direction I/O pin (P4.4). 1 is OCI_SCL pin. 各种封装对应之PIN脚如下表: 40-PIN PDIP 44-PIN PLCC 44-PIN PQFP 48-PIN LQFP OCI_SCL/P4.4 29 32 26 29 ALE/P4.5 30 33 27 30 OCI_SDA/P4.6 31 35 29 32 RESET/P4.7 9 10 4 5 3.8.4 内建复位电路重置时间选择(ISPFAL=0x06H) 说明: 可使用ICP或ISP方式选择复位电路重置时间;于程序执行中亦可使用IAP之字节读命令读取复 位电路重置时间之设定值。 Internal reset timer select: Internal reset time select[7:0] XXXX-X111 0000-0110 0000-0101 0000-0100 Reset time 25ms (default) 200ms 100ms 50ms Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 5 Ver B 2011/01 ISP & EEPROM 功能使用方法 0000-0011 0000-0010 0000-0001 0000-0000 16ms 8ms 4ms 2ms 3.8.5 ISP服务程序区进入方式之设定(ISPFAL=0x08H) 说明: 可使用ICP或ISP方式选择ISP服务程序区进入方式,于程序执行中亦可使用IAP之字节读命令 读取ISP服务程序区进入方式之设定值,ISP服务程序区进入方式有四种,分别由旗标EMF1~4 所记录。 ISP entry mechanism select: Bit 7 Bit 6 Bit 5 Trigger source ISP entry mechanism (1) First Address Blank. I.e. $0000 = FFh (2) P2.6 = 0 & P2.7 = 0 (3) P4.3 = 0 (4) P3.0 input 2 clocks Bit 7: = 1, = 0, Bit 6: = 1, = 0, Bit 5: = 1, = 0, Bit 4: = 1, = 0, Bit 3: = 1, = 0, Bit 2: = 1, = 0, Bit 1: = 1, = 0, Bit 0: = 1, = 0, Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 芯片复位源 芯片复位源 Internal Reset PAD reset EMF (Entry mechanism flag) Bit 7 Bit 5 Bit 3 Bit 1 Bit 6 Bit 4 Bit 2 Bit 0 EMF1 EMF2 EMF3 EMF4 禁能触发(1),禁能 ISP 由内建复位电路触发(包括 POR 及 WDT)。 致能触发(1),致能 ISP 由内建复位电路触发(包括 POR 及 WDT)。 禁能触发(1),禁能 ISP 由 PAD reset 触发。 致能触发(1),致能 ISP 由 PAD reset 触发。 禁能触发(2),禁能 ISP 由内建复位电路触发(包括 POR 及 WDT)。 致能触发(2),致能 ISP 由内建复位电路触发(包括 POR 及 WDT)。 禁能触发(2),禁能 ISP 由 PAD reset 触发。 致能触发(2),致能 ISP 由 PAD reset 触发。 禁能触发(3),禁能 ISP 由内建复位电路触发(包括 POR 及 WDT)。 致能触发(3),致能 ISP 由内建复位电路触发(包括 POR 及 WDT)。 禁能触发(3),禁能 ISP 由 PAD reset 触发。 致能触发(3),致能 ISP 由 PAD reset 触发。 禁能触发(4),禁能 ISP 由内建复位电路触发(包括 POR 及 WDT)。 致能触发(4),致能 ISP 由内建复位电路触发(包括 POR 及 WDT)。 禁能触发(4),禁能 ISP 由 PAD reset 触发。 致能触发(4),致能 ISP 由 PAD reset 触发。 3.8.6 ISP Lock bit N(ISPFAL=0x07H) 说明: Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 6 Ver B 2011/01 ISP & EEPROM 功能使用方法 只可由烧录器或ICP才可以设定及抺除,ISP service program并无此指令。该位是用来设定 ISP service program的容量大小,且可保护ISP service program不被ISP or IAP所执行的” chip erase”抺除。lock bit ”N”设定ISP相对的起启位置请参考如下: ISP code area Table: SM59R04A2/ SM59R04A1/ SM59R03A1/ SM59R02A1 SM59R16A5/ SM59R16A3/ SM59R09A5/ SM59R09A3/ SM59R05A5/ SM59R05A3/ SM59R16G6/ SM59R09G6/ SM59R05G6 N ISP service program address N ISP service program address 0 No ISP service program 0 No ISP service program 1 256 bytes ($3F00h ~ $3FFFh) 1 256 bytes ($FF00h ~ $FFFFh) 2 512 bytes ($3E00h ~ $3FFFh) 2 512 bytes ($FE00h ~ $FFFFh) 3 768 bytes ($3D00h ~ $3FFFh) 3 768 bytes ($FD00h ~ $FFFFh) 4 1.0 K bytes ($3C00h ~ $3FFFh) 4 1.0 K bytes ($FC00h ~ $FFFFh) 5 1.25 K bytes ($3B00h ~ $3FFFh) 5 1.25 K bytes ($FB00h ~ $FFFFh) 6 1.5 K bytes ($3A00h ~ $3FFFh) 6 1.5 K bytes ($FA00h ~ $FFFFh) 7 1.75 K bytes ($3900h ~ $3FFFh) 7 1.75 K bytes ($F900h ~ $FFFFh) 8 2.0 K bytes ($3800h ~ $3FFFh) 8 2.0 K bytes ($F800h ~ $FFFFh) 9 2.25 K bytes ($3700h ~ $3FFFh) 9 2.25 K bytes ($F700h ~ $FFFFh) 10 2.5 K bytes ($3600h ~ $3FFFh) 10 2.5 K bytes ($F600h ~ $FFFFh) 11 2.75 K bytes ($3500h ~ $3FFFh) 11 2.75 K bytes ($F500h ~ $FFFFh) 12 3.0 K bytes ($3400h ~ $3FFFh) 12 3.0 K bytes ($F400h ~ $FFFFh) 13 3.25 K bytes ($3300h ~ $3FFFh) 13 3.25 K bytes ($F300h ~ $FFFFh) 14 3.5 K bytes ($3200h ~ $3FFFh) 14 3.5 K bytes ($F200h ~ $FFFFh) 15 3.75 K bytes ($3100h ~ $3FFFh) 15 3.75 K bytes ($F100h ~ $FFFFh) 16 4.0 K bytes ($3000h ~ $3FFFh) 16 4.0 K bytes ($F000h ~ $FFFFh) Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 7 Ver B 2011/01 ISP & EEPROM 功能使用方法 3.9 ISP 相关的特殊缓存器 Special Function Register (SFR) 3.9.1 ISP 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 ITS CDPR F12K F8K 00H ALEC.1 ALEC.0 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 EMEN 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-0188 8 Ver B 2011/01 ISP & 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-0188 9 Ver B 2011/01 ISP & 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 注一:只有SM59R16G6/ SM59R09G6/ SM59R05G6有此功能。当功能选择位(option) 经由Erase及Write之后,最后必须下一次Finish flag指令以示完成,否则写入值皆视为无 效。 3.10 EEPROM Assembly 语言范例程序: 此范例展示有 EEP_Byte_Program、EEP_Chip_Protect、EEP_Page_Erase、EEP_Byte_Read、 EEP_Enable 及 EEP_Disable 基本功能,提供使用者自行开发 ISP code 或 EEPROM 应用参考。 Description Main program 范例适用: SM59R16A5/ SM59R16A3/ SM59R09A5/ SM59R09A3/ SM59R05A5/ SM59R05A3/ SM59R04A2/ SM59R04A1/ SM59R03A1/ SM59R02A1/ SM59R16G6/ SM59R09G6/ SM59R05G6 //===================================================================== ==== // // S Y N C M O S T E C H N O L O G Y // //===================================================================== ==== #include "SM59R04A2.h" //ISPFC.ISPF[2:0] #define d_COMMAND_BYTE_PROGRAM 0 Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 10 Ver B 2011/01 ISP & EEPROM 功能使用方法 #define d_COMMAND_CHIP_PROTECT #define d_COMMAND_PAGE_ERASE //#define d_COMMAND_CHIP_ERASE dat addh addl 1 2 3 equ 30h equ 31h equ 32h org 0000h //Start Start: //test1====================== mov addh, #0x01 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 $ jmp Start 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 Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 11 Ver B 2011/01 ISP & EEPROM 功能使用方法 movc a, mov dat, ret EEP_Enable: MOV A, JB 0xE0.0, mov TAKEY, mov TAKEY, mov TAKEY, orl IFCON, MOV A, JNB 0xE0.0, EEP_Enable_ret: ret EEP_Disable: MOV A, JNB 0xE0.0, mov TAKEY, mov TAKEY, mov TAKEY, anl IFCON, MOV A, JB 0xE0.0, EEP_Disable_ret: ret end @a+dptr a IFCON EEP_Enable_ret #0x55 #0xAA #0x5A #0x01 // ISPE=1, Enable ISP function IFCON EEP_Enable IFCON EEP_Disable_ret #0x55 #0xAA #0x5A #0xFE // ISPE=1, Enable ISP function IFCON EEP_Disable 3.11 EEPROM C 语言范例程序: SyncMOS 原厂已有标准的 ISP code 及 AP 提供客户使用;此范例展示有 chip erase, page erase, chip protect, byte write, byte read 等基本功能,提供使用者自行开发 ISP code 或 EEPROM 应用参 考。 Description Main program 范例适用: SM59R16A5/ SM59R16A3/ SM59R09A5/ SM59R09A3/ SM59R05A5/ SM59R05A3/ SM59R04A2/ SM59R04A1/ SM59R03A1/ SM59R02A1/ SM59R16G6/ SM59R09G6/ SM59R05G6 //==================================================================== // // S Y N C M O S T E C H N O L O G Y // //==================================================================== #include "..\h\SM59R04A2.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 #define d_Command_Write_Option 4 #define d_Command_Read_Option 5 Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 12 Ver B 2011/01 ISP & EEPROM 功能使用方法 #define d_Command_Erase_Option 6 //all //==================================================================== /* ISPFAL must entry ISP by hardware;Lock bit as read only; ISPFAL: Function: 0x03H WDTEN. 0x04H System clock select, FCLK [3:0] 0x05H pin function select 0x06H Internal reset time 0x07H Lock bit N 0x08H ISP entry mechanism select */ //==================================================================== void Delay1mSec(unsigned int NTime) { unsigned int i, j; for(i=0; i<NTime; i++) for(j=0; j<1300; j++); } void EEPROM_Enable(void) { unsigned char ucRetry=255; while((IFCON&0x01)!=0x01) { TAKEY = 0x55; TAKEY = 0xAA; TAKEY = 0x5A; IFCON |= 0x01; ucRetry--; if(ucRetry<=0) // V105; go on if ISPE != 1 // ISPE=1, Enable ISP function break; } } void EEPROM_Disable(void) { unsigned char ucRetry =255; while((IFCON&0x01)!=0x00) // V105; go on if ISPE != 0 { TAKEY = 0x55; TAKEY = 0xAA; TAKEY = 0x5A; IFCON &= 0xFE; // ISPE=0, Disable ISP function ucRetry--; if(ucRetry<=0) break; } Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 13 Ver B 2011/01 ISP & EEPROM 功能使用方法 } //void EEPROM_Byte_Program(unsigned char Addr_H, unsigned char Addr_L, unsigned char Data ) void EEPROM_Byte_Program(unsigned int Addr, unsigned char Data) { //unsigned char Temp =ISPFC; EEPROM_Enable(); ISPFD = Data; ISPFAH = (Addr >>8); ISPFAL = (Addr & 0x00FF); ISPFC = d_Command_Byte_Program; EEPROM_Disable(); } void EEPROM_Chip_Protect(void) { EEPROM_Enable(); ISPFC = d_Command_Chip_Protect; EEPROM_Disable(); } //void EEPROM_Page_Erase(unsigned char Addr_H, unsigned char Addr_L) void EEPROM_Page_Erase(unsigned int Addr) //256-Byte { EEPROM_Enable(); ISPFAH = (unsigned char)(Addr >>8); // ISPFAL = (unsigned char)(Addr & 0x00FF); ISPFC = d_Command_Page_Erase; EEPROM_Disable(); } void EEPROM_Chip_Erase(void) { EEPROM_Enable(); ISPFC = d_Command_Chip_Erase; EEPROM_Disable(); } void EEPROM Sector Program(unsigned int Addr start, unsigned int Addr end, unsigned char Data) { unsigned int i; for(i=0; i<(Addr_end - Addr_start); i++) { EEPROM_Byte_Program(Addr_start+i, Data); } } //unsigned char EEPROM_Byte_Read(unsigned char Addr_H, unsigned char Addr_L) unsigned char EEPROM_Byte_Read(unsigned int Addr) Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 14 Ver B 2011/01 ISP & EEPROM 功能使用方法 { unsigned char temp; unsigned char code *pAddr; pAddr = Addr; // Set address temp = (*pAddr); // Read data return temp; } void EEPROM_Byte_Modify(unsigned int Addr, unsigned char Data) { unsigned int i; unsigned char xdata buf[256]; for(i=0; i<256; i++) //page read buf[i] = EEPROM_Byte_Read((Addr&0xFF00)+i); EEPROM_Page_Erase(Addr&0xFF00); buf[(unsigned char)Addr] = Data; //page erase //byte modify for(i=0; i<256; i++) //page program EEPROM_Byte_Program((Addr&0xFF00)+i, buf[i]); } void main(void) { unsigned char buffer=0; unsigned int Err=0, i=0; P0 = 0x55; Delay1mSec(100); //wait for system stable P0 = 0xAA; EEPROM_Page_Erase(0x1000); EEPROM_Page_Erase(0x2000); for(i=0; i<256; i++) { EEPROM_Byte_Program( 0x1000+i, i ); buffer = EEPROM_Byte_Read( 0x1000+i); if(buffer != i) Err++; } P0 = (unsigned char)(Err>>8); P1 = (unsigned char)(Err); P2 = ~P2; P2 = ~P2; Delay1mSec(500); Delay1mSec(500); EEPROM_Byte_Modify(0x2000, 0x66); buffer = EEPROM_Byte_Read(0x2000); P0 = buffer; Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 15 Ver B 2011/01 ISP & EEPROM 功能使用方法 EEPROM_Byte_Modify(0x2001, 0x88); buffer = EEPROM_Byte_Read(0x2001); P1 = buffer; while(1) { P2 = ~P2; P2 = ~P2; }; Delay1mSec(500); Delay1mSec(500); } 4 适用产品:SM59R16A2 / SM59R08A2 4.1 EEPROM 使用概述: 4.1.1 使用program flash模拟为Internal EEPROM。 4.1.2 Page Erase及Program Byte的动作说明: Page Erase 是将 flash 的电位全部提升至”1”,Program Byte 是将 flash 的电位”high”拉为”low”。 当程序执行一次 Program Byte,IC 内部硬件完整的步骤为:(1)read page(2)modify Byte(3)erase page(4)write page;写 N 个 byte,就必须经过 N 次(1~4)的步骤。 若少量次数的数据变动,可直接使用 EEPROM Program Byte 的方式。若大量的数据变动,为 加快 Program Byte 完成的速度, 可先将 (1)数据 page read 至 SRAM 中做修改 (2)将该 program flash 做 page erase (3)将 SRAM 资料写回至 program flash。 A. 为什么第一次会较快? 因为当第一次使用时,flash 在 program 前已先被 erase 为 0xFF,当 IC 内部硬件判断该地址数据 为 0xFF,在 program 时就会省略(3)Erase 的步骤。 B. 为什么第二次以后会变慢? 因为使用第二次以后,当 IC 内部硬件判断不为 0xFF,在 program 时就会做(3)Erase 的步骤。 Erase/Program/Read/Modify 测试速度: System clock (MHz) Page Erase (ms) Program Byte (us) Read Byte (us) Modify Byte (ms) Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 16 Ver B 2011/01 ISP & EEPROM 功能使用方法 25 24 22.1184 12 11.1592 13.22 13.77 14.94 27.54 29.88 112.2 116.8 126.8 233.8 253.6 3.12 3.25 3.53 6.5 7.05 68.44 71.3 77.36 142.6 156.6 Note: (1)Program Byte 即该位置原数据等于 0xFF (2)Modify Byte 即该位置原数据非 0xFF 应用说明: 如果使用 External ISP,烧录后 code flash 中的 data 如何保留?例如 Product ID、Key word 或 Menu setting … 应用方式如下: 1. 执行程序:read flash data,再将 data write to Xdata(SRAM) 2. 执行烧录:External ISP program (使用 OCD or MSM9055) 3. 执行重置:Reset MCU (不可断电) 4. 执行程序:read Xdata,再将 data write to flash,即可保存 flash 中的数据 256 512 (Byte) SRAM-->code flash 3.4 6.8 ms code flash-->SRAM 3 6 ms test with external crystal 22.1184MHz * 为保持 SRAM 中的数据正确,执行过程请勿中断电源。 * 此方法限制于内建 SRAM size,最大为 2KB。 4.2 EEPROM 相关的缓存器: Mnemonic PCON PES Description Direct Bit 7 Power Control Program Memory Page Erase Control Register 87h SMOD A1h EPE Mnemonic: PCON 7 6 SMOD MDUF PMW = 1: PMW = 0: 5 - Bit 6 Bit 5 Bit 4 EEPROM Function MDUF PMW - 4 PMW - 3 - - 2 - Bit 3 Bit 2 Bit 1 Bit 0 RESET - - STOP IDLE 00h - - - - 00h 1 STOP Address: 87h 0 Reset IDLE 00h R / W Flash Memory enable disable Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 17 Ver B 2011/01 ISP & EEPROM 功能使用方法 Mnemonic: PES 7 6 EPE - EPE=1: 5 - 4 - 3 - 2 - 1 - Address: A1h 0 Reset 00h 执行抺除 Page Erase (=512 bytes),完成后由硬件自动清 4.3 执行 EEPROM page erase 抺除程序,请参考如下: //==================================================================== //This function will erase one page(512-Byte). //SM59R16A2 64KB = 0~127 pages. //SM59R08A2 32KB = 0~ 63 pages. //==================================================================== void PMEE_PageErase(unsigned int Address) { unsigned char xdata *pAddr; PCON |=0x10; // R / W Flash Memory enable pAddr =Address; PES =0x80; // Page erase enable, after finish auto clear by hard *pAddr=0xff; // Page erase command PCON = PCON & 0xEF; // R / W Flash Memory disable } * EEPROM Erase 重要说明: * page erase为一硬件设定动作,执行程序顺序请依照以上范例 * page erase enable与command之间,絶不可插入其它程序 * page erase enable后,必须在要抺除的flash page的第一个位置写入”0xFFh”,当作 page erase command,即可抺除。 Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 18 Ver B 2011/01 ISP & EEPROM 功能使用方法 * Command address如下例表: SM59R16/08 page Erase Page Memory address First byte address of page (Command address) 0 0x0000~0x01FF 0x0000 1 0x0200~0x03FF 0x0200 2 . . . . 126 0x0400~0x05FF . . . . 0xFC00~0xFDFF 0x0400 . . . . 0xFC00 127 0xFE00~0xFFFF 0xFE00 4.4 范例程序流程图(一):EEPROM 的应用流程图: Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 19 Ver B 2011/01 ISP & EEPROM 功能使用方法 4.5 范例程序(一):EEPROM 范例程序 Description Main program 范例适用:SM59R16A2/ SM59R08A2 //==================================================================== // // S Y N C M O S T E C H N O L O G Y // //==================================================================== #include "..\h\SM59R16A2.h" #include "..\MISC\delay.h" #define PMEE_start #define PMEE_end 0X0400 0x0600 //==================================================================== Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 20 Ver B 2011/01 ISP & EEPROM 功能使用方法 //PES:Program Memory Page Erase Control Register //When enable the EPE bit,the Page Erase(Each page include 512 bytes //function can be executed by below Instructions? //==================================================================== sfr PES = 0xA1; //sbit EPE = PES^7; //==================================================================== //This function will erase one page(512-Byte). //SM59R16A2 64KB = 0~127 pages. //SM59R08A2 32KB = 0~ 63 pages. //==================================================================== void PMEE_PageErase(unsigned int Address) { unsigned char xdata *pAddr; PCON |=0x10; // R / W Flash Memory enable pAddr =Address; PES =0x80; // Page erase enable, after finish auto clear by hard *pAddr=0xff; // Page erase command PCON = PCON & 0xEF; // R / W Flash Memory disable } //==================================================================== //This function will write one byte to EEPROM. //Adderss is from 0x0000~ 0xFFFF. //==================================================================== void PMEE_ByteWrite(unsigned int Address, unsigned char Data) { unsigned char xdata *pAddr; PCON |= 0x10; // R / W Flash Memory enable pAddr = Address; // Set address *pAddr = Data; // Write data PCON = PCON & 0xEF; // R / W Flash Memory disable } //==================================================================== //This function will read one byte from EEPROM. //Adderss is from 0x0000~ 0xFFFF. //==================================================================== unsigned char PMEE_ByteRead(unsigned int Address) { unsigned char xdata *pAddr; unsigned char temp; PCON |= 0x10; // R / W Flash Memory enable pAddr = Address; // Set address Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 21 Ver B 2011/01 ISP & EEPROM 功能使用方法 temp = (*pAddr); PCON = PCON & 0xEF; return(temp); // Read data // R / W Flash Memory disable } void main(void) { unsigned int i; PMEE_PageErase(0x0400); //Erase 3rd. page (0x0400~0x05FF) for(i=PMEE_start; i<PMEE_end; i++) //EEPROM Write { PMEE_ByteWrite(i, 0x11); } while(1) { for(i=PMEE_start;i<PMEE_end;i++) //EEPROM Read { if(PMEE_ByteRead(i) == 0x11) //EEPROM Verify { P2 = 0x55; Delay1mSec(100);//Pass!! P2 = 0x66; Delay1mSec(100);//Pass!! } else { P2 = 0x77; Delay1mSec(200);//Fail Warning!! P2 = 0x88; Delay1mSec(200);//Fail Warning!! } } } } Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 22 Ver B 2011/01 ISP & EEPROM 功能使用方法 4.6 范例程序流程图(二):EEPROM + SRAM 的应用流程图: Entry SyncMOS EEPROM function < Step1. > Triger_Int1() 1. Read EEPROM 2. Write to Xdata < Step2. > Execute External ISP program < Step3. > Reset MCU (don't power down!!) < Step4. > Entry main() 1. Read Xdata 2. Write to EEPROM < Step5. > User code.... 4.7 范例程序(二):EEPROM + SRAM 使用的范例程序 Description Main program //==================================================================== // // S Y N C M O S T E C H N O L O G Y // //==================================================================== #include "..\h\SM59R16A2.h" #include "..\h\SM59R16A2_extradef.h" //#include "..\InternalEE\InternalEE.h" #include "..\Interrupt\Interrupt.h" #include "..\MISC\delay.h" #define Expanded_start #define Expanded_end 0X0600 0x0700 Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 23 Ver B 2011/01 ISP & EEPROM 功能使用方法 unsigned char xdata *Expanded_RAM; unsigned char xdata *PMEE_RWpt; //==================================================================== //This function will write one byte to eeprom. //Adderss is from 0x0000~ 0xFFFF. //==================================================================== void PMEE_ByteWrite(unsigned int Address, unsigned char Data) { //IEN0_EA = 0; // Disable all interrupt PCON |= PCON_PROGMEM_WR; // Enable eeprom write PMEE_RWpt = Address; // Set address *PMEE_RWpt = Data; // Write data PCON &= (~PCON_PROGMEM_WR); // Disable eeprom write } //==================================================================== //This function will read one byte from eeprom. //Adderss is from 0x0000~ 0xFFFF. //==================================================================== unsigned char PMEE_ByteRead(unsigned int Address) { unsigned char temp; //IEN0_EA = 0; // Disable all interrupt PCON |= PCON_PROGMEM_WR; // Enable eeprom write PMEE_RWpt = Address; // Set address temp = (*PMEE_RWpt); // Read data PCON &= (~PCON_PROGMEM_WR); // Disable eeprom write return(temp); } void Expanded_RAM_Byte_Write(unsigned int addr, unsigned char dat) { Expanded_RAM = addr; //set addr *Expanded_RAM = dat; //write Data } unsigned char Expanded_RAM_Byte_Read(unsigned int addr) { unsigned char dat; Expanded_RAM = addr; //set addr dat = *Expanded_RAM; //read Data at return dat; } Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 24 Ver B 2011/01 ISP & EEPROM 功能使用方法 //==================================================================== // Read from eeprom, Write to Xdata. We want to keep Xdata // so don't power down!! //==================================================================== void Int1ISR(void) interrupt 2 using 0 { unsigned int i; unsigned char buff=0; for(i=Expanded_start; i<Expanded_end; i++) { buff = PMEE_ByteRead(i); //Read from eeprom Expanded_RAM_Byte_Write( i , buff );//Write to Xdata } while(INT0IF)// Clear again to debounce. { INT1IF = false; Delay10mSec(1); } } void mcu_init(void) { //Initialize External INT //Int0Init( EXINT0_EN, INT0_FALLEDGE ); Int1Init( EXINT1_EN, INT1_FALLEDGE ); } void main(void) { unsigned int i; unsigned char buff=0; mcu_init(); // Read from Xdata, Write to eeprom for(i=Expanded_start; i<Expanded_end; i++) { buff = Expanded_RAM_Byte_Read(i); //Read from Xdata PMEE_ByteWrite( i , buff ); //Write to eeprom } while(1) { //user code... } } Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0188 25 Ver B 2011/01