sst89c58X iap模块
;(1) 芯片擦除000_0001b:Chip_Erase 时间: 0 - 11.7ms(Chip_Erase Time)
;查询方式命令格式如下:
Chip_Erase:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFDT, #55H ;开始
MOV SFCM, #01H ;写入命令字FIE = 0,FCM[6:0] = 000_0001b: Chip_Erase
MOV A,SFST ;查询SFST.2,等待芯片擦除结束
JB ACC.2,$-2
RET
;(2) 块擦除000_1101b:Block_Erase 时间: 0 - 9.4ms(Block_Erase Time)
;查询方式命令格式如下:
Block0_Erase:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #00H ;擦除Block0
MOV SFDT, #55H ;开始
MOV SFCM, #0DH ;写入命令字FIE = 0,FCM[6:0] = 000_1101b: Block_Erase
MOV A,SFST ;;查询SFST.2,等待块擦除操作完成
JB ACC.2,$-2
RET
Block1_Erase:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #0F0H ;擦除Block1
MOV SFDT, #55H ;开始
MOV SFCM, #0DH ;写入命令字FIE = 0,FCM[6:0] = 000_1101b: Block_Erase
MOV A,SFST ;;查询SFST.2,等待块擦除操作完成
JB ACC.2,$-2
RET
;(3) 扇区擦除000_1011b:Sector_Erase 时间: 1.1 - 2.3ms(Sector_Erase Time)
; SFAH SFAL
;地址: | a15 a14 a13 a12 a11 a10 a9 a8 | a7 a6 a5 a4 a3 a2 a1 a0 |
;扇区地址: | a15 a14 a13 a12 a11 a10 a9 a8 | a7 0 0 0 0 0 0 0 | 128字节 Block0
;扇区地址: | a15 a14 a13 a12 a11 a10 a9 a8 | a7 a6 0 0 0 0 0 0 | 64字节 Block1
;查询方式命令格式如下:
Sector_Erase:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #sector_addressH
MOV SFAL, #sector_addressL
MOV SFCM, #0BH ; 写入命令字FIE = 0,FCM[6:0] = 000_1011b: Sector_Erase
MOV A,SFST ;查询SFST.2,等待扇区擦除操作完成
JB ACC.2,$-2
RET
;(4) 字节编程000_1110b: Byte_Program 时间: 0-110us(Byte_Program Time)
;在block1可以对block0编程,在block0可以对block1编程。但是每block均都不能对自己进行编程
;查询方式命令格式如下:
Byte_Program:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #byte_addressH
MOV SFAL, #byte_addressL
MOV SFDT, #program_data
MOV SFCM, #0EH ; 写入命令字FIE = 0,FCM[6:0] = 000_1110b: Byte_Program
MOV A,SFST ;查询SFST.2,等待字节编程操作完成
JB ACC.2,$-2
RET
;(5) 字节校验000_1100b: Byte_Verify 时间:50ns(Verify Command Delay Time)
;命令格式如下:
Byte_Verify:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #byte_addressH
MOV SFAL, #byte_addressL
MOV SFCM, #0CH ; 写入命令字FIE = 0,FCM[6:0] = 000_1100b: Byte_Verify
CJNE A,STDT,$+6 ;SFDT A 保存规定单元地址读出的内容
SEBT C
SJMP $+4
CLR C
RET
;(6) 加密位编程000_1111b: Byte_Program 时间: 0-110us(Byte_Program Time)
;Prog_SB1 操作指令必须在BLOCK0中。下一次复位后有效
;查询方式命令格式如下:
Prog_SB1:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #80H
MOV SFDT, #55H
MOV SFCM, #0FH ;写入命令字FIE = 0,FCM[6:0] = 000_1111b: Prog_SB1
MOV A,SFST ;查询SFST.2,等待加密位Prog_SB1编程操作完成
JB ACC.2,$-2
RET
;(7) 加密位编程000_0011b: Byte_Program 时间: 0-110us(Byte_Program Time)
;Prog_SB2 操作指令必须在BLOCK0中。下一次复位后有效
;查询方式命令格式如下:
Prog_SB2:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #80H
MOV SFDT, #55H
MOV SFCM, #03H ;写入命令字FIE = 0,FCM[6:0] = 000_0011b: Prog_SB2
MOV A,SFST ;查询SFST.2,等待加密位Prog_SB2编程操作完成
JB ACC.2,$-2
RET
;(8) 加密位编程000_0101b: Byte_Program 时间: 0-110us(Byte_Program Time)
;Prog_SB3 操作指令必须在BLOCK0中。下一次复位后有效
;查询方式命令格式如下:
Prog_SB3:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #80H
MOV SFDT, #55H
MOV SFCM, #05H ;写入命令字FIE = 0,FCM[6:0] = 000_0101b: Prog_SB3
MOV A,SFST ;查询SFST.2,等待加密位Prog_SB3编程操作完成
JB ACC.2,$-2
RET
;RE-MAP[1:0]注1 Map-En[1:0]注2,注3 注释
; 11 00 不映射,程序內存为正常配置。0000-7FFFH,F000-FFFFH
; 10 01 1K內存被映射,F000H-F3FFH被映射为0000H-03FFH
; 01 10 2K內存被映射,F000H-F7FFH被映射为0000H-07FFH
; 00 11 4K內存被映射,F000H-FFFFH被映射为0000H-0FFFH
;注1:Map-En[1:0]为FLASH位。系统复位时检查RE-MAP[1:0]位。片擦除时RE-MAP[1:0]=1
;注2:系统复位时Map-En[1:0]位按编程的RE-MAP[1:0]位进行初始化,Map-En[1:0]=!RE-MAP[1:0]
;注3:Map-En[1:0]位在STCF寄存器中,它可以确定內存的映射关系。在程序运行时可以修改。
;(9) Re-Map位0编程000_1000b: Byte_Program 时间: 0-110us(Byte_Program Time)
;Prog_RB0 操作指令必须在BLOCK0中。编程后RB0=0(Map-En[0]=1),下一次复位后有效。
;查询方式命令格式如下:
Prog_RB0:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #80H
MOV SFDT, #55H
MOV SFCM, #08H ;写入命令字FIE = 0,FCM[6:0] = 000_0011b: Prog_SB2
MOV A,SFST ;查询SFST.2,等待加密位Prog_SB2编程操作完成
JB ACC.2,$-2
RET
;(10) Re-Map位1编程000_1001b: Byte_Program 时间: 0-110us(Byte_Program Time)
;Prog_RB1 操作指令必须在BLOCK0中。编程后RB1=0(Map-En[1]=1),下一次复位后有效。
;查询方式命令格式如下:
Prog_RB1:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV SFAH, #80H
MOV SFDT, #55H
MOV SFCM, #09H ;写入命令字FIE = 0,FCM[6:0] = 000_0101b: Prog_SB3
MOV A,SFST ;查询SFST.2,等待加密位Prog_SB3编程操作完成
JB ACC.2,$-2
RET
;(11) 页面编程000_0110b: Burst_Program 时间:页面编程 45 μs*
;
;
; SFAH SFAL
;地址: | a15 a14 a13 a12 a11 a10 a9 a8 | a7 a6 a5 a4 a3 a2 a1 a0 |
;页面地址: | a15 a14 a13 a12 a11 a10 a9 a8 | a7 a6 字 节 地 址 | 64字节 Block0
;页面地址: | a15 a14 a13 a12 a11 a10 a9 a8 | a7 a6 a5 字 节 地 址 | 32字节 Block1
;查询方式格式如下:
Burst_Block0_Program:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV B,#64
Burst_Block0_Program1:
MOV SFAH, DPH
MOV SFAL, DPL
MOV SFDT, #program_data
MOV SFCM, #06H ;写入命令字FIE = 0,FCM[6:0] = 000_1110b: Byte_Program
MOV A,SFST ;查询SFST.3,等待页面字节编程操作完成
JB ACC.3,$-2
INC DPTR
DJNZ B,Burst_Block0_Program1
MOV A,SFST ;查询SFST.2,等待编程操作完成
JB ACC.2,$-2
RET
Burst_Block1_Program:
ORL SFCF, #01000000B ;置IAPEN = 1,启动IAP
MOV B,#32
Burst_Block1_Program1:
MOV SFAH, DPH
MOV SFAL, DPL
MOV SFDT, #program_data
MOV SFCM, #06H ;写入命令字FIE = 0,FCM[6:0] = 000_1110b: Byte_Program
MOV A,SFST ;查询SFST.3,等待页面字节编程操作完成
JB ACC.3,$-2
INC DPTR
DJNZ B,Burst_Block1_Program1
MOV A,SFST ;查询SFST.2,等待编程操作完成
JB ACC.2,$-2
RET
发表时间:2003年4月22日1:27:04