导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→sst89c58X iap模块[jinwei6092]

 *第10779篇: sst89c58X iap模块

  
楼 主:jinwei6092 2003年4月22日01:27
 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


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:各位前辈,帮帮忙.

[下一篇主题]:[求助]菜鸟问大侠