📄 w29c040.asm
字号:
M_SP_Software_Data_Protection_Dis: .MACRO
R1 = 0x0000
R5 = 0x0000
?Prot_Dis_L:
R2 = R5 + Software_Data_Protection_Dis_addr
R3 = R5 + Software_Data_Protection_Dis_data
R2 = [R2] //get address
R3 = [R3] //get data
CALL F_SP_Write_Addr_Data
R5 = R5 + 1
CMP R5,6
JNE ?Prot_Dis_L;
.ENDM
//----------------------------------------------------------------------
//--Macro:_Software_Data_Protection_Dis
//--Argument: None
//--------------------------------------------------------------------
.PUBLIC _SP_Software_chip_MassErase
.PUBLIC F_SP_Software_chip_MassErase
_SP_Software_chip_MassErase: .PROC
F_SP_Software_chip_MassErase:
R1 = 0x0000
R5 = 0x0000
?Chip_MassErase_L:
R2 = R5 + Software_Data_Protection_Dis_addr
R3 = R5 + Software_chip_erase_data
R2 = [R2] //get address
R3 = [R3] //get data
R4 = [Port_IOA_Buffer]
CALL F_SP_Write_Addr_Data
R5 = R5 + 1
CMP R5,6
JNE ?Chip_MassErase_L
RETF
.ENDP
//----------------------------------------------------------------------
//SP_page_write_Com
//--Argument: None
//--------------------------------------------------------------------
.PUBLIC _SP_page_write_Com
.PUBLIC F_SP_page_write_Com
_SP_page_write_Com: .PROC
F_SP_page_write_Com:
push bp to [sp]
R1 = 0x0000
R5 = 0x0000
?page_write_L:
R2 = R5 + Software_Data_Protection_Dis_addr
R3 = R5 + Software_data_Protection_en_data
R2 = [R2]
R3 = [R3]
R4 = [Port_IOA_Buffer]
CALL F_SP_Write_Addr_Data
R5 = R5 + 1
CMP R5,3
JNE ?page_write_L
pop bp from [sp]
RETF
.ENDP
//----------------------------------------------------------------------
//--Macro:_InitIO
//--Argument: None
//--------------------------------------------------------------------
M_InitIO: .MACRO
R1=0xFFFF
[Port_IOB_Attrib] = R1 //Set port B to output
[Port_IOB_Dir] = R1 //Set port B to output
R1 = 0x0000
[Port_IOB_Data] = R1
R1=0xFFFF
[Port_IOA_Attrib] = R1 //Set port A to output
[Port_IOA_Dir] = R1
R1 = 0x0000
[Port_IOA_Data] = R1
.ENDM
//----------------------------------------------------------------------
//--_SP_InitW29C040Flash
//--Argument: None
//--------------------------------------------------------------------
.PUBLIC _SP_InitW29C040Flash
_SP_InitW29C040Flash: .PROC
PUSH R5 TO [SP]
// R1=C_FIQ_TMA
//[R_InterruptStatus] = R1 //
//[P_INT_Ctrl] = R1
M_InitIO;
M_SP_Software_Data_Protection_Dis; //Protection_Dis
CALL F_Delay11ms //delay 10ms
CALL F_SP_Software_chip_MassErase //chip_MassErase
CALL F_Delay11ms //delay 10ms
POP R5 FROM [SP]
RETF
.ENDP
//----------------------------------------------------------------------
//--_SP_InitReadW29C040Flash
//--Argument: None
//--------------------------------------------------------------------
.public _SP_InitReadW29C040Flash
F_SP_InitReadW29C040Flash:
_SP_InitReadW29C040Flash: .proc
push bp to [sp]
M_InitIOA_8bitH_In;
pop bp from [sp]
retf
.endp
RETF
//----------------------------------------------------------------------
//--_SP_InitWriteW29C040Flash
//--Argument: None
//--------------------------------------------------------------------
.public _SP_InitWriteW29C040Flash
_SP_InitWriteW29C040Flash: .proc
push bp to [sp]
M_InitIOA_8bitH_Out;
CALL F_SP_page_write_Com;
pop bp from [sp]
retf
.endp
//----------------------------------------------------------------------
//--F_SP_Write_Address
//--Argument: None
//--------------------------------------------------------------------
.public F_SP_Write_Address;
F_SP_Write_Address: .proc
push R1,R5 to [sp]
[Port_IOB_Data] = R2 //write AddrL
R4 = [Port_IOA_Buffer];
R4 &= 0xFFE3;
R4 |= (RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //CE=1,WE=1,OE=1
[Port_IOA_Data] = R4
//---------------------------------------------------------------------
//换芯片的时候,需要改变这断代码
//---------------------------------------------------------------------
R4 &= 0xFF1F
R1 = R1 LSL 4
R1 = R1 LSL 1
R4 |= R1
[Port_IOA_Data] = R4 //wirte AddrH
R4 = [Port_IOA_Buffer];
R4 &= 0xFFE3;
R4 |= WE_BIT_DIS
[Port_IOA_Data] = R4 //CE=0,WE=0,OE=1
r4|=(RE_BIT_DIS|CE_BIT_DIS)
[Port_IOA_Data] = R4 //CE=0,WE=0,OE=1
pop R1,R5 FROM [sp]
retf
.endp
//----------------------------------------------------------------------
//--_F_SP_Write_Data
//--Argument: None
//--------------------------------------------------------------------
.public F_SP_Write_Data;
F_SP_Write_Data: .proc
push R1,R5 to [sp]
M_SaveIoSetting;
R5 = SP
R4 = [R5 + 1] //write control bit LOW
R4 |= RE_BIT_DIS
[Port_IOA_Data] = R4 //CE=0,WE=0,OE=1
POP R5 FROM [SP]
M_SaveIoSetting;
R4 &= 0x00FF //write data
R4 |= R3
[Port_IOA_Data] = R4
//write control pin HIGH
R5 = (WE_BIT_DIS|CE_BIT_DIS|RE_BIT_DIS)
R4 |= R5
[Port_IOA_Data] = R4 //WE CE OE = 1
POP R5 FROM [SP]
POP R1,R5 FROM [SP]
RETF
.endp
//----------------------------------------------------------------------
//--_F_SP_Read_Data
//--Argument: None
//--------------------------------------------------------------------
.public F_SP_Read_Data;
F_SP_Read_Data: .proc
push R1,R5 to [sp]
M_SaveIoSetting;
R5 = SP
R4 = [R5 + 1] //write control bit LOW
R4 |= WE_BIT_DIS
[Port_IOA_Data] = R4
POP R5 FROM [SP]
R1 = [Port_IOA_Data] //get data
R1 &= 0xFF00
[Read_W29C040_Byte] = R1;
M_SaveIoSetting;
R5 = SP
R4 = [R5 + 1]
R5 = (RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //CE=1,WE=1,OE=1
R4 |= R5
[Port_IOA_Data] = R4
POP R5 FROM [SP]
POP R1,R5 FROM [SP]
RETF
.ENDP
///////////////////////////////////////////////////////////////
//Function : 100us Dealy for S_Flash programming time (base on CPUCLK= 24MHz)
// Syntax: Delay100uS()
// Used register: r1,r2
///////////////////////////////////////////////////////////////
F_Delay11ms:
push r1,r1 to [sp];
//r1=17*10;
r1=20*10; // delay
L_LoopDelay11:
call F_Delay100uS;
r1-=1;
jne L_LoopDelay11
pop r1,r1 from [sp];
retf;
///////////////////////////////////////////////////////////////
//Function : 100us Dealy for S_Flash programming time (base on CPUCLK= 24MHz)
// Syntax: Delay100uS()
// Used register: r1,r2
///////////////////////////////////////////////////////////////
.public _Delay100uS;
_Delay100uS: .PROC
F_Delay100uS: //13
push r1,r1 to [sp]; //7
r1=294; //6
L_DelayLoop:
r1-=1; //3 26+19+8*294 =2400
jne L_DelayLoop; //5
pop r1,r1 from [sp]; //7
retf; //12
.ENDP;
///////////////////////////////////////////////////////////////
//Function : 100us Dealy for S_Flash programming time (base on CPUCLK= 24MHz)
// Syntax: Delay100uS()
// Used register: r1,r2
///////////////////////////////////////////////////////////////
.public F_SP_Write_Status
F_SP_Write_Status: .proc
push r1,r5 to [sp]
r1 = [_M_AddrL]
r1 &= 0xff
cmp r1,0xff
je ?check_Write_end;
pop r1,r5 from [sp]
retf
?check_Write_end:
call F_SP_InitReadW29C040Flash
nop
nop
nop
r5 = 0
continue_read:
r5= r5 + 1;
cmp r5,1000;
je exit;
r1 = [_M_AddrH]
R2 = [_M_AddrL]
call F_SP_Read_Data_Addr
R3 = [_write_data]
cmp r1,r3
jne continue_read;
exit:
pop r1,r5 from [sp]
retf
.endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -