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

📄 nfhal.asm

📁 该软件为在sunplus的61单片机上实现的mp3播放器.里面有完整的源代码.
💻 ASM
字号:
.include ..\spce061\061reg.inc

.public	_F_InitWriteNF
.public _F_InitReadNF
.public _F_ReadNF
.public _F_ReadSectorNF
.public _F_WriteCmdToNF
.public _F_WriteAddrToNF
.public _F_WriteDataToNF
.public _F_WriteSectorToNF

.public _F_DMA_NFtoD12_64B
.public _F_DMA_D12toNF_64B
NFtoD12_8BYTE:	.macro
//  < --- BYTE 0 --- >
//  --\_
	r1&=r2;
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];

//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;

//  < --- BYTE 1 --- >
//  --\_
	r1&=r2;	
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];

//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;
	
//  < --- BYTE 2 --- >
//  --\_
	r1&=r2;	
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];

//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;
	
//  < --- BYTE 3 --- >
//  --\_
	r1&=r2;	
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];

//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;
	
//  < --- BYTE 4 --- >
//  --\_
	r1&=r2;	
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];

//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;

//  < --- BYTE 5 --- >
//  --\_
	r1&=r2;	
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];

//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;
	
//  < --- BYTE 6 --- >
//  --\_
	r1&=r2;	
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];

//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;
	
//  < --- BYTE 7 --- >
//  --\_
	r1&=r2;	
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];

//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;
				.endm
D12toNF_8BYTE:	.macro
//  <-- BYTE0 -->
//  --\_
	r1&=r2;
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];	
	
//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;

//  <-- BYTE1 -->
//  --\_
	r1&=r2;
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];	
	
//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;

//  <-- BYTE2 -->
//  --\_
	r1&=r2;
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];	
	
//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;

//  <-- BYTE3 -->
//  --\_
	r1&=r2;
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];	
	
//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;
	
//  <-- BYTE4 -->
//  --\_
	r1&=r2;
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];	
	
//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;

//  <-- BYTE5 -->
//  --\_
	r1&=r2;
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];	
	
//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;

//  <-- BYTE6 -->
//  --\_
	r1&=r2;
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];	
	
//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;

//  <-- BYTE7 -->
//  --\_
	r1&=r2;
	[P_IOA_Data]=r1;
		
//  --<Data>--
	r1=[P_IOA_Data];	
	
//      _/-- 	
	r1|=r3;
	[P_IOA_Data]=r1;
				.endm				
.code
//====================================================================
// 函  数:    	F_InitWriteNF()
// 语  法:    	void F_TurnOffFirstLed(void)
// 描  述:   	初始化写PDIUSBNF
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_InitWriteNF: .proc
		push r1,r1 to [sp];
		
		r1=[P_IOB_Buffer];	
		r1|=0x00b0; 		
		r1&=0xffef; 			//NF_CE=0	NF_CE=1  LCD_CE=1					           
	    [P_IOB_Buffer]=r1;  
	    		
		r1=[P_IOA_Dir];
		r1|=0xff00; 
		[P_IOA_Dir]=r1;
		
		r1=[P_IOA_Attrib];
		r1|=0xff00;				//DB7(A.15)~DB0(A.8),NF_WE(A.7),NF_RE(A.6)->OutputPort 
		[P_IOA_Attrib]=r1;
		
		r1=[P_IOA_Buffer];
		r1|=0x00c0;	
					
		[P_IOA_Buffer]=r1; 		//RE=1 WE=1
	   
        pop r1,r1 from [sp];
        retf ;
        .endp
        
//====================================================================
// 函  数:    	F_InitReadNF()
// 语  法:    	void F_InitReadNF(void)
// 描  述:   	初始化NandFlash
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_InitReadNF:          .PROC
		push r1,r1 to [sp];
		
		r1=[P_IOB_Buffer];	
		r1|=0x00b0; 		
		r1&=0xffef; 			//NF_CE=0	NF_CE=1 LCD_CE=1			          
	    [P_IOB_Buffer]=r1;  
	    		
		r1=[P_IOA_Dir];
		r1&=0x00ff; 
		[P_IOA_Dir]=r1;
		
		r1=[P_IOA_Attrib];
//		r1&=0x00ff;				//DB7(A.15)~DB0(A.8),NF_WE(A.7),NF_RE(A.6)->OutputPort 
		r1|=0xff00;
		[P_IOA_Attrib]=r1;
		
		r1=[P_IOA_Buffer];
		r1|=0x00c0;				
		[P_IOA_Buffer]=r1; 		//RE=1 WE=1
		   	    
        pop r1,r1 from [sp]; 
        retf ;
        .ENDP
        
//====================================================================
// 函  数:    	F_ReadSectorNF()
// 语  法:    	void F_ReadSectorNF(UINT Addr)
// 描  述:   	从NandFlash读数据
// 参  数:   	None
// 返回值:   	r1
//=====================================================================
_F_ReadSectorNF:      .PROC
	push bp to [sp];
	bp=sp+1;
	push r1,r5 to [sp]
	bp=[bp+3];		//Get Address of the Transfer Data 
	
	r3=512;
	r2=[P_IOA_Buffer];	
	r2&=0xffbf;	
	r4= r2|0x0040;
F_ReadSectorNFrep:		                   		
//		r2=[P_IOA_Buffer];	
//		r2&=0xffbf;
		
		[P_IOA_Buffer]=r2;			//NF_RE=0						

        r1 = [P_IOA_Data];       	// Get data
        r1 = r1 lsr 4;           	// Prepare high 8 bits Addr. to low 8 bits
        r1 = r1 lsr 4;           	// Get low byte data        
        
//		r2=[P_IOA_Buffer];	
//		r2|=0x0040;
		[P_IOA_Buffer]=r4;			//NF_RE=1       
		
		[bp++]=r1;		
					
	r3-=1;	
	jnz  F_ReadSectorNFrep
	
//  Dummy Read 16 Byte
//	r3=16;
//F_ReadSectorNFrep1:		                   		

//		r2=[P_IOA_Buffer];	
//		r2&=0xffbf;
//		[P_IOA_Buffer]=r2;			//NF_RE=0						

//        r1 = [P_IOA_Data];       	// Get data
//        r1 = r1 lsr 4;           	// Prepare high 8 bits Addr. to low 8 bits
//        r1 = r1 lsr 4;           	// Get low byte data        
        
//		r2=[P_IOA_Buffer];	
//		r2|=0x0040;
//		[P_IOA_Buffer]=r2;			//NF_RE=1       		
		
//		[bp++]=r1;				
		
//	r3-=1;	
//	jnz  F_ReadSectorNFrep1
		
    pop r1,r5 from [sp] ;
    pop bp from [sp] ;   
	retf;		                						
    .ENDP
            
//====================================================================
// 函  数:    	F_ReadNF()
// 语  法:    	unsigned int F_ReadNF()
// 描  述:   	从NandFlash读数据
// 参  数:   	None
// 返回值:   	r1
//=====================================================================
_F_ReadNF:      .PROC
        push r2,r2 to [sp];             
        		
		r2=[P_IOA_Buffer];	
		r2&=0xffbf;
		[P_IOA_Buffer]=r2;			//NF_RE=0						

//      nop;
        r1 = [P_IOA_Data];       	// Get data
        r1 = r1 lsr 4;           	// Prepare high 8 bits Addr. to low 8 bits
        r1 = r1 lsr 4;           	// Get low byte data        
        
		r2=[P_IOA_Buffer];	
		r2|=0x0040;
		[P_IOA_Buffer]=r2;			//NF_RE=1       
        		                						
        pop r2,r2 from [sp] ;
        retf ;						//Data Return in R1
        .ENDP
           
//===================================================================================================
// 函  数:    	F_WriteDataToNF()
// 语  法:    	void F_WriteDataToNF(unsigned int Data)
// 描  述:   	向NandFlash写数据
// 参  数:   	Data_or_Command:数据参数
// 返回值:   	无
//===================================================================================================
_F_WriteDataToNF: .PROC
		push bp to [sp];
        bp = sp + 1; 		
        push r1,r2 to [sp] ;

        r1=[bp+3];					//Get First Parament
        		        
        r1 = r1 lsl 4;           	// Prepare high 8 bits Addr. to low 8 bits
        r1 = r1 lsl 4;           	// Get low byte data
        
		r2=[P_IOA_Buffer];       
        r2&=0x00ff;
        r2|=r1;
        [P_IOA_Buffer]=r2;         	// Send Data  			
        
//		r2=[P_IOA_Buffer];	
        r2&=0xff7f;
		[P_IOA_Buffer]=r2;			//NF_WE=0	
		        	
		r2|=0x0080;
		[P_IOA_Buffer]=r2;			//NF_WE=1  
				
        pop r1,r2 from [sp] ;
        pop bp from [sp] ;        
        retf ;
        .ENDP
//===================================================================================================
// 函  数:    	F_WriteDataToNF()
// 语  法:    	void F_WriteSectorToNF(unsigned int &Addr)
// 描  述:   	向NandFlash写数据
// 参  数:   	Data_or_Command:数据参数
// 返回值:   	无
//===================================================================================================
_F_WriteSectorToNF: .PROC
	push bp to [sp];
	bp=sp+1;
	push r1,r5 to [sp]
	bp=[bp+3];		//Get Address of the Transfer Data 
		
	r3=512;
	
F_WriteSectorToNFrep:
        r1=[bp++];					//Get First Parament
        		        
        r1 = r1 lsl 4;           	// Prepare high 8 bits Addr. to low 8 bits
        r1 = r1 lsl 4;           	// Get low byte data
        
		r2=[P_IOA_Buffer];       
        r2&=0x00ff;
        r2|=r1;
        [P_IOA_Buffer]=r2;         	// Send Data  			
        
//		r2=[P_IOA_Buffer];	
        r2&=0xff7f;
		[P_IOA_Buffer]=r2;			//NF_WE=0	
		        	
		r2|=0x0080;
		[P_IOA_Buffer]=r2;			//NF_WE=1  
		
	r3-=1;	
	jnz  F_WriteSectorToNFrep
					
    pop r1,r5 from [sp] ;
    pop bp from [sp] ;   
	retf;		
    .ENDP
    
//===================================================================================================
// 函  数:    	F_WriteCmdToNF()
// 语  法:    	void F_WriteCmdToNF(unsigned int command)
// 描  述:   	向NandFlash写命令
// 参  数:   	Command:命令参数
// 返回值:   	无
//===================================================================================================
_F_WriteCmdToNF: .PROC
		push bp to [sp];
        bp = sp + 1; 		
        push r1,r2 to [sp] ;

        r1=[bp+3];					//Get First Parament
		        
		r2=[P_IOA_Buffer];
		
        r1 = r1 lsl 4;           	// Prepare high 8 bits Addr. to low 8 bits
        r1 = r1 lsl 4;          	// Get low byte data
        
        r2|=0x0010;					//NF_CLE=1(Select Command)
        r2&=0x00ff;
        r2|=r1;
        [P_IOA_Buffer]=r2;         	// Send Data  			
        
//		r2=[P_IOA_Buffer];	
        r2&=0xff7f;
		[P_IOA_Buffer]=r2;			//NF_WE=0	
		        	
		r2|=0x0080;
		[P_IOA_Buffer]=r2;			//NF_WE=1  

		r2&=0xffef;
		[P_IOA_Buffer]=r2;			//NF_CLE=0
							
        pop r1,r2 from [sp] ;
        pop bp from [sp] ;        
        retf ;
        .ENDP
        
//===================================================================================================
// 函  数:    	F_WriteCmdToNF()
// 语  法:    	void F_WriteCmdToNF(unsigned int Address)
// 描  述:   	向NandFlash写数据地址
// 参  数:   	Address
// 返回值:   	无
//===================================================================================================
_F_WriteAddrToNF: .PROC
		push bp to [sp];
        bp = sp + 1; 		
        push r1,r2 to [sp] ;

        r1=[bp+3];					//Get First Parament
		        
		r2=[P_IOA_Buffer];
		
        r1 = r1 lsl 4;           	// Prepare high 8 bits Addr. to low 8 bits
        r1 = r1 lsl 4;          	// Get low byte data
        
        r2|=0x0020;					//NF_ALE=1(Select Address)
        r2&=0x00ff;
        r2|=r1;
        [P_IOA_Buffer]=r2;         	// Send Data  			
        
//		r2=[P_IOA_Buffer];	
        r2&=0xff7f;
		[P_IOA_Buffer]=r2;			//NF_WE=0	
		        	
		r2|=0x0080;
		[P_IOA_Buffer]=r2;			//NF_WE=1  
		
		r2&=0xffdf;					//NF_ALE=0		
		[P_IOA_Buffer]=r2;			//NF_WE=1  		
		
		pop r1,r2 from [sp] ;
        pop bp from [sp] ;        
        retf ;
        .ENDP
    
    
//  Function:
//	void F_DMA_NFtoD12_64B(void)        
_F_DMA_NFtoD12_64B:	.proc
	push r1,r3 to [sp]
	
	r1=[P_IOA_Dir];
	r1&=0x00ff;
	[P_IOA_Dir]=r1;
		
	r1=[P_IOA_Attrib];
	r1&=0x00ff;
	[P_IOA_Attrib]=r1;
		
	r1=[P_IOA_Data];
	r1|=0xffc0;				
	[P_IOA_Data]=r1; 		//RE=1 WE=1
			
//  CS D12 & NF	
	r1=[P_IOB_Buffer];	
	r1|=0x0090; 		
	r1&=0xffcf; 			//D12_CE=0	NF_CE=0  LCD_CE=1			          
	[P_IOB_Buffer]=r1;  
		
	r1=[P_IOA_Data];
	r2=0x00bd;
	r3=0x0040;
//  NFtoD12 Write 64 BYTE
	NFtoD12_8BYTE	
	NFtoD12_8BYTE	
	NFtoD12_8BYTE			
	NFtoD12_8BYTE					
	NFtoD12_8BYTE	
	NFtoD12_8BYTE	
	NFtoD12_8BYTE			
	NFtoD12_8BYTE				
//  Exit
	pop r1,r3 from [sp]
	retf
	.endp        
	    		
//  Function
//  void F_DMA_D12toNF_64B(void)	
_F_DMA_D12toNF_64B:	.proc
	push r1,r3 to [sp]
	
	r1=[P_IOA_Dir];
	r1&=0x00ff;
	[P_IOA_Dir]=r1;
		
	r1=[P_IOA_Attrib];
	r1&=0x00ff;
	[P_IOA_Attrib]=r1;
		
	r1=[P_IOA_Data];
	r1|=0xffc0;				
	[P_IOA_Data]=r1; 		//RE=1 WE=1
			
//  CS D12 & NF	
	r1=[P_IOB_Buffer];	
	r1|=0x0090; 		
	r1&=0xffcf; 			//D12_CE=0	NF_CE=0  LCD_CE=1			          
	[P_IOB_Buffer]=r1;  
		
	r1=[P_IOA_Data];
	r2=0x007d;
	r3=0x0080;
//  D12toNF Write 64 Byte		
	D12toNF_8BYTE
	D12toNF_8BYTE	
	D12toNF_8BYTE
	D12toNF_8BYTE
	D12toNF_8BYTE
	D12toNF_8BYTE	
	D12toNF_8BYTE
	D12toNF_8BYTE	
//  Exit						
	pop r1,r3 from [sp]
	retf
	.endp   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -