ISP & EEPROM 功能使用方法

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