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 各型號差異比較列表(一): addr. start addr. end ISP code size 最大限制(KB) Page size (Byte) ISP code supported ISP H/W Entry Mechanism SM59R16A5 F000h FFFFh 4K byte 256 有 有 SM59R09A5 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 Specifications subject to change without notice, contact your sales representatives for the most recent information. ISSFA-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 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-0187 25 Ver B 2011/01