⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w29c040.asm

📁 给出了W29C040的驱动子程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:

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 + -