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

📄 4096.asm

📁 电压控制程序,符合各种设备需要,核心程序,IBm专属
💻 ASM
字号:
//======================================================
// 文件名称:	4096.asm
// 功能描述:   SPR4096的读写、擦除 
// 完成日期:   2005-10-25
//======================================================
.DEFINE		P_IOB_Data				0x7005
.DEFINE		P_IOB_Buffer			0x7006
.DEFINE		P_IOB_Dir				0x7007
.DEFINE		P_IOB_Attrib			0x7008
.DEFINE		P_SystemClock			0x7013
//	Serial	functions control registers
.DEFINE		P_SIO_Data				0x701A
.DEFINE		P_SIO_Addr_Low			0x701B
.DEFINE		P_SIO_Addr_Mid			0x701C
.DEFINE		P_SIO_Addr_High			0x701D
.DEFINE		P_SIO_Ctrl				0x701E
.DEFINE		P_SIO_Start				0x701F
.DEFINE		P_SIO_Stop				0x7020

.DEFINE 	C_SIOCLOCK           		0x0010     	// CPUCLOCK/8
.DEFINE		B_Busy						0x80

.CONST 		C_Program_Time			 	= 60		//60us
.CONST 		C_SectorErase_Time		 	= 400		//60us*400 = 24ms
.CONST 		C_MassErase_Time			= 1166		//60us*1166 = 70ms

.CODE
//======================================================
// 函数名称:	_SP_SIOInitial
// 实现功能:    SIO初始化
// 入口参数:   无
// 出口参数:   无
// 破坏寄存器:  r1
//======================================================
.PUBLIC		_SP_SIOInitial;
_SP_SIOInitial:	.PROC
		 	r1  =  0x0098;    		 			//系统时钟设定,Fosc = 49MHz 
		 	[P_SystemClock]  =  r1;
			r1  =  0x803;						//IOB0:SCK,IOB1:SDA,IOB11:CF7
			[P_IOB_Dir]  =  r1;
			[P_IOB_Attrib]  =  r1;			
			[P_IOB_Buffer]  =  r1;			
		 	retf
.ENDP

//======================================================
// 函数名称:	_SP_SIOSendAByte
// 实现功能:    往SPR4096写入一个Byte的数据
// 入口参数:   ulAddr为写入的地址,uiData为写入的数据
// 出口参数:   无
// 破坏寄存器:  r1
//======================================================
.PUBLIC _SP_SIOSendAByte;
_SP_SIOSendAByte: .PROC
F_SIOSendAByte:
		    push bp,bp to [SP];
		    bp  =  SP + 1;
			r1  =  [bp+3];
		    [P_SIO_Addr_Low] = r1;        		// FLASH低地址
		    r1 = r1 lsr 4;         		
		    r1 = r1 lsr 4;
		    [P_SIO_Addr_Mid] = r1; 				// FLASH中地址
		    r1  =  [bp+4];                
		    r1 = r1&0x0007;  					// FLASH高地址
		    [P_SIO_Addr_High] = r1;
	        r1 = 0x00C3+C_SIOCLOCK;
	        [P_SIO_Ctrl] = r1;        			// clk = CPUclk/8, 24位地址 
	        [P_SIO_Start] = r1;       			// 写模式使能
	        r1  =  [bp+5];
	        [P_SIO_Data] = r1;        			// 传输数据
L_WaitSIOSendReady:
	        r1 = [P_SIO_Start];
	        test    r1,B_Busy
	        jnz     L_WaitSIOSendReady
	        [P_SIO_Stop] = r1;            		// 禁止写模式
	        call  F_Delay_Program_Time
	        pop bp,bp from [SP];
	        retf;
.ENDP;


//======================================================
// 函数名称:	_SP_SIOReadAByte
// 实现功能:    从SPR4096读出一个Byte的数据
// 入口参数:   ulAddr为读出的地址
// 出口参数:   读出的数据
// 破坏寄存器:  r1,r2,r3
//======================================================
.PUBLIC _SP_SIOReadAByte;
_SP_SIOReadAByte: .PROC
F_SIOReadAByte:
	        push bp,bp to [SP];
	        bp  =  SP + 1;
	        r1  =  [bp+3];
	        [P_SIO_Addr_Low] = r1; 				// FLASH低地址
	        r1 = r1 lsr 4;
	        r1 = r1 lsr 4;
	        [P_SIO_Addr_Mid] = r1; 				// FLASH中地址
	        r1  =  [bp+4];                
	        r1 = r1&0x0007;  					// FLASH高地址
	        [P_SIO_Addr_High] = r1;
	        r1 = 0x0083;
	        [P_SIO_Ctrl] = r1;            		// clk = CPUclk/16, 24位地址
	        [P_SIO_Start] = r1;           		// 读模式使能
	        r2 = [P_SIO_Data];            		// 清buffer
L_WaitSIOReadReady1:
	        r1 = [P_SIO_Start];
	        test    r1,B_Busy
	        jnz     L_WaitSIOReadReady1
	        r1 = [P_SIO_Data];          		// 读数据
L_WaitSIOReadReady2:               
	        r2 = [P_SIO_Start];
	        test    r2,B_Busy
	        jnz     L_WaitSIOReadReady2
	        [P_SIO_Stop] = r2;            		// 禁止读模式
	        pop bp,bp from [SP];
	        retf;
.ENDP;

//======================================================
// 函数名称:	_SP_SIOSendAWord
// 实现功能:    往SPR4096写入一个Word的数据
// 入口参数:   ulAddr为写入的地址,uiData为写入的数据
// 出口参数:   无
// 破坏寄存器:  r1,r2,r3
//======================================================
.PUBLIC _SP_SIOSendAWord;
_SP_SIOSendAWord: .PROC
F_SIOSendAWord:
	        push bp,bp to [SP];
	        bp  =  SP + 1;
	        r1 = 0x00C3+C_SIOCLOCK;
	        [P_SIO_Ctrl] = r1;            		// clk = CPUclk/8, 24位地址
	        r1  =  [bp+3];
	        [P_SIO_Addr_Low] = r1; 				// FLASH低地址
	        r1 = r1 lsr 4;
	        r1 = r1 lsr 4;
	        [P_SIO_Addr_Mid] = r1; 				// FLASH中地址
	        r1  =  [bp+4];                
	        r1 = r1&0x0007;  					// FLASH高地址
	        [P_SIO_Addr_High] = r1;
        
	        [P_SIO_Start] = r1;           		// 写模式使能
	        r1  =  [bp+5];
	        [P_SIO_Data] = r1;            		// 传输数据,低字节
L_WaitSIOSendReadyLB:
	        r1 = [P_SIO_Start];
	        test    r1,B_Busy
	        jnz     L_WaitSIOSendReadyLB
	      
	        [P_SIO_Stop] = r1;            		// 禁止写模式
	        call  F_Delay_Program_Time 
	
	         r1  =  [bp+3];
	         r1+ = 1;
	        [P_SIO_Addr_Low] = r1; 				// FLASH低地址
	             
	        [P_SIO_Start] = r1;          	 	// 写模式使能
	        r1 = [bp+5]; 
	        r1 = r1 lsr 4;         		
	        r1 = r1 lsr 4;
	        [P_SIO_Data] = r1;            		// 传输数据,高字节
L_WaitSIOSendReadyHB:
        r1 = [P_SIO_Start];
        test    r1,B_Busy
        jnz     L_WaitSIOSendReadyHB
        [P_SIO_Stop] = r1;            			// 禁止写模式
		call  F_Delay_Program_Time 
		pop bp,bp from [SP];
        retf;
.ENDP;


//======================================================
// 函数名称:	_SP_SIOReadAWord
// 实现功能:    从SPR4096读出一个Word的数据
// 入口参数:   ulAddr为读出的地址
// 出口参数:   读出的数据
// 破坏寄存器:  r1,r2,r3,r4
//======================================================
.PUBLIC _SP_SIOReadAWord;
_SP_SIOReadAWord: .PROC
F_SIOReadAWord:
	        push bp,bp to [SP];
	        bp  =  SP + 1;
	        r4 = 0x00FF;
	        r1  =  [bp+3];
	        [P_SIO_Addr_Low] = r1; 				// FLASH低地址
	        r1 = r1 lsr 4;
	        r1 = r1 lsr 4;
	        [P_SIO_Addr_Mid] = r1; 				// FLASH中地址
	        r1  =  [bp+4];                
	        r1 = r1&0x0007;  					// FLASH高地址
	        [P_SIO_Addr_High] = r1;

	        r1 = 0x0083;  							
	        [P_SIO_Ctrl] = r1;           		// clk = CPUclk/16, 24 位地址
	        [P_SIO_Start] = r1;       			// 读模式使能
	        r2 = [P_SIO_Data];          		// 清buffer
L_WaitSIOReadReady1LB:
	        r1 = [P_SIO_Start];
	        test    r1,B_Busy
	        jnz     L_WaitSIOReadReady1LB
	        
	        r2 = r4&[P_SIO_Data];          		// 读数据,低字节
L_WaitSIOReadReady2LB:               
	        r1 = [P_SIO_Start];
	        test    r1,0x0080
	        jnz     L_WaitSIOReadReady2LB
	        
	        r3 = r4&[P_SIO_Data];          		// 读数据,高字节

L_WaitSIOReadReady2HB:               
	        r1 = [P_SIO_Start];
	        test    r1,B_Busy
	        jnz     L_WaitSIOReadReady2HB
	       
	        [P_SIO_Stop] = r1;             		// 禁止读模式
	 
	        r3 = r3 lsl 4;     			 
	        r1 = r3 lsl 4;
	        r1| = r2;         			 		// r1 存放的是读出的数据
	        pop bp,bp from [SP];
	        retf;
.ENDP;


//======================================================
// 函数名称:	_SP_SIOMassErase
// 实现功能:    擦除SPR4096的所有扇区
// 入口参数:   无
// 出口参数:   无
// 破坏寄存器:  r1
//======================================================
.PUBLIC _SP_SIOMassErase;
_SP_SIOMassErase: .PROC
F_SIOMassErase:
	        push r1,r2 to [sp];
	        r1 = 0x00C0+C_SIOCLOCK;
	        [P_SIO_Ctrl] = r1;            	// clk = CPUclk/8, 16位地址
	        r2 = 0x0000;
	        [P_SIO_Addr_Low] = r2; 			// FLASH低地址
	        r2 = 0x00C0;
	        [P_SIO_Addr_Mid] = r2; 			// FLASH中地址
	        r2 = 0x00C0;
	       	[P_SIO_Addr_High] = r2; 
	        [P_SIO_Start] = r1;           	// 写模式使能
	        r1 = 0;                       	// A7~A0  =  0
	        [P_SIO_Data] = r1;            	// 传输数据

L_WaitSIOSendReadyMass:
	        r1 = [P_SIO_Start];
	        test    r1,B_Busy
	        jnz     L_WaitSIOSendReadyMass
			[P_SIO_Stop] = r1;
	        call    F_Delay_MassErase_Time
	        pop r1,r2 from [sp];
	        retf;
.ENDP;

//======================================================
// 函数名称:	_SP_SIOSectorErase
// 实现功能:    擦除SPR4096的一个扇区
// 入口参数:   uiSector,为扇区的编号,0~255可选
// 出口参数:   无
// 破坏寄存器:  r1,r2
//======================================================
.PUBLIC _SP_SIOSectorErase;
_SP_SIOSectorErase: .PROC
SP_SIOSectorErase:
	        push bp,bp to [SP];
	        bp  =  SP + 1;
	 
	        r1  =  [bp+3];
	        r1 = r1&0x00ff;
	        r1 = r1 lsl 3;
	        r1 = r1|0x8000;
	        [P_SIO_Addr_Low] = r1; 			// FLASH低地址 ;给 A15 and A10
	        r1 = r1 lsr 4;
	        r1 = r1 lsr 4;
	        [P_SIO_Addr_Mid] = r1; 			// FLASH中地址 ;给 A16
	        r1 = 0x00C0+C_SIOCLOCK;
	        [P_SIO_Ctrl] = r1;        		// clk = CPUclk/8, 16位地址
	        [P_SIO_Start] = r1;       		// 写模式使能
	        r1 = 0;                   		// A7~A0  =  0
	        [P_SIO_Data] = r1;        		// 传输数据

L_WaitSIOSendReadyPage1:
	        r1 = [P_SIO_Start];
	        test    r1,B_Busy
	        jnz     L_WaitSIOSendReadyPage1
	        [P_SIO_Stop] = r1;        
	        call    F_Delay_SectorErase_Time
	        pop bp,bp from [SP];
	        retf;
.ENDP;



//======================================================
// 函数名称:	F_Delay_MassErase_Time
// 实现功能:    擦除全部扇区的延时
// 入口参数:   无
// 出口参数:   无
// 破坏寄存器:  r2
//======================================================
.PUBLIC F_Delay_MassErase_Time;
F_Delay_MassErase_Time:	.PROC
			r2 = C_MassErase_Time;		
?L_Wait_MassErase_Time_Over:							       
			call	F_Delay_Program_Time;
			r2- = 1;						
			jnz ?L_Wait_MassErase_Time_Over;		
			retf;						
.ENDP

//======================================================
// 函数名称:	F_Delay_SectorErase_Time
// 实现功能:    擦除一个扇区的延时
// 入口参数:   无
// 出口参数:   无
// 破坏寄存器:  r2
//======================================================
.PUBLIC F_Delay_SectorErase_Time;
F_Delay_SectorErase_Time: .PROC
			r2 = C_SectorErase_Time;				//6	
?L_Wait_SectorErase_Time_Over:							       
			call	F_Delay_Program_Time;
			r2- = 1;								//3					
			jnz ?L_Wait_SectorErase_Time_Over;		//5	
			retf;						
.ENDP

//======================================================
// 函数名称:	F_Delay_Program_Time
// 实现功能:    写入一个Byte的延时
// 入口参数:   无
// 出口参数:   无
// 破坏寄存器:  r1
//======================================================
.PUBLIC F_Delay_Program_Time;
F_Delay_Program_Time: .PROC
			r1 = C_Program_Time;					//6
?L_Wait_Program_Time_Over:							//52cycle,1us @ 49Mhz       
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			nop;									//4
			r1- = 1;								//3
			jnz ?L_Wait_Program_Time_Over;			//5
			retf;									//12
.ENDP

⌨️ 快捷键说明

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