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

📄 spr4096.asm

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 ASM
📖 第 1 页 / 共 2 页
字号:
//======================================================
//  The information contained herein is the exclusive property of
//  Sunnnorth Technology Co. And shall not be distributed, reproduced,
//  or disclosed in whole in part without prior written permission.
//  (C) COPYRIGHT 2003  SUNNORTH TECHNOLOGY CO.
//  ALL RIGHTS RESERVED
//  The entire notice above must be reproduced on all authorized copies.
//========================================================

//========================================================
//  Filename:       SerialPort.asm      
//  Programmer:     Zhifa Lee  (email: zhifa/sunnorth)    (ext: 2913)
//  Version:        1.0.0 		
//  Date:           2003-6-20
//  Applied body:   unsp serial
//  Description:    
//  Revision history:
//  ----------------------------------------------------------------------------------------
//  Version, YYYY-MM-DD-Index, File-Name: Modified By, Description
//  ----------------------------------------------------------------------------------------
//
//============================================================

//======================================================
// File Name:		SerialPort.asm
// Description:		Initial,read,program,and erase operation for spr4096
// Programmer:     	Zhifa Lee  (email: zhifa/sunnorth)    (ext: 2913)
// Applied body:	spce061
// Date:			2003-06-20
// 
// Function List:
// 					Initial SIO:  		F_InitialSerialPort 
//                  Read a byte:		F_ReadOneByteFrom4096
//					Read multi-bytes:	F_ReadDataFrom4096
//					Read a Record:		F_ReadARecordFrom4096
//					Program a byte:		F_WriteOneByteTo4096
//					Write buffer:		F_WriteBufferTo4096
//					Erase a page:		F_EraseOnePage
//					Erase whole chip:	F_EraseWholeChip
//======================================================
.include spce061a.inc
.include ConfigResource.inc

.public G_FlashTimer;
.public G_FlashStatus;
.public _G_FlashTimer;
.public _G_FlashStatus;

.public F_EraseWholeChip;
.public F_EraseOnePage;
.public F_WriteOneByteTo4096;
.public F_WriteBufferTo4096;
.public F_ReadARecordFrom4096;
.public F_ReadDataFrom4096;
.public F_ReadOneByteFrom4096;
.public F_InitialSerialPort;
.public F_WriteARecordTo4096RAM;
.public F_ReadARecordFrom4096RAM;
.public F_Clr4096RAM;

.public _SP_EraseWholeChip;
.public _SP_EraseOnePage;
.public _SP_WriteOneByteTo4096;
.public _SP_WriteBufferTo4096;
.public _SP_ReadARecordFrom4096;
.public _SP_ReadDataFrom4096;
.public _SP_ReadOneByteFrom4096;
.public _SP_InitialSerialPort;
.public _SP_WriteARecordTo4096RAM;
.public _SP_ReadARecordFrom4096RAM;
.public _SP_Clr4096RAM;

.debug
	.dw '.stabs "G_FlashStatus:G1",32,0,0,',0,0,offset G_FlashStatus,seg G_FlashStatus,0x0d,0x0a
.debug
	.dw '.stabs "G_FlashTimer:G1",32,0,0,',0,0,offset G_FlashTimer,seg G_FlashTimer,0x0d,0x0a

.IRAM
_G_FlashStatus:
G_FlashStatus:
					.dw			1;
					
_G_FlashTimer:
G_FlashTimer:
					.dw			0;

.const C_Program_Time			=60		//60us
.const C_EraseTime				=72*4		//70ms use 4096 interrupt
.const C_PageEraseTime			=25*4		//24ms use 4096 interrupt
.code

//======================================================
// Function Name:	F_InitialSerialPort
// Description:		Initial SIO.
// Input:			None
// Output:			None
// Destroy:			r1;
// Used:			r1;
// Stacks:			0;
//======================================================
_SP_InitialSerialPort:
F_InitialSerialPort:	.PROC
			r1 = [P_IOB_Dir];
			r1 |= 0x0801;						//set bit0 output for sck
			[P_IOB_Dir] = r1;
			
			r1 = [P_IOB_Attrib];
			r1 |= 0x0801;						//buffer output
			[P_IOB_Attrib] = r1;
			
			r1 = [P_IOB_Buffer];
			r1 |= 0x0001;						//output high
			[P_IOB_Data] = r1;
			retf;
			.ENDP
//======================================================
// Function Name:	F_EraseWholeChip
// Description:		Mass erase the SPR1024\4096 Flash.
// Input:			None
// Output:			None
// Destroy:			r1;
// Used:			r1,r3;
// Stacks:			0;
//======================================================
_SP_EraseWholeChip:
F_EraseWholeChip:	.PROC
		R1 = 0x0000;
		[P_SIO_Stop] = R1;
        [P_SIO_Addr_Low] = R1;
        R1 = 0x00C0;
        [P_SIO_Addr_Mid] = R1;           	//Opcode Mass Erase 0x00C0 (No address)
                                        	//Opcode Page Erase 0x0080 (No address and Page0)
        R1 = B_SIO_En+B_SIO_Write_En+C_SIO_Clk_16+C_SIO_Addr_Sel_16;
        [P_SIO_Ctrl] = R1;            		//Write mode , CPU/4, 16 bit address
        [P_SIO_Start] = R1;           		//Start transfer
        [P_SIO_Data] = R1;            		//Do'nt care
?L_WaitTransfer:
		R1 = [P_SIO_Start];
        R1 &= B_Busy;						//check transfer over
        JNE  ?L_WaitTransfer;
        [P_SIO_Stop] = R1;          		//Stop transfer
        r1 = C_EraseTime;
        [G_FlashTimer] = r1;				//wait 70ms
        retf;
        .ENDP
//======================================================
// Function Name:	F_EraseOnePage
// Description:		erase one page of the SPR1024\4096 Flash.
// Input:			Page No.
// Output:			None
// Destroy:			r1;
// Used:			r1,bp;
// Stacks:			0;
//======================================================
_SP_EraseOnePage:
F_EraseOnePage:	.PROC
		push bp to [sp];
        [P_SIO_Stop] = R1;          				//Stop transfer
		bp=sp;
		bp+=4;
		r1 = [bp];									//get page number will be erased
		r1 = r1 lsl 3;
		[P_SIO_Stop] = R1;							//stop last transfer
        [P_SIO_Addr_Low] = R1;						//set address
		r1 = [bp];									//get page number will be erased ,again
		r1 = r1 lsr 4;
		r1 = r1 lsr 1;
		r1 |= 0x80;
        [P_SIO_Addr_Mid] = R1;           			//Opcode page Erase 0x0080 (No address)
        R1 = B_SIO_En+B_SIO_Write_En+C_SIO_Clk_16+C_SIO_Addr_Sel_16;
        [P_SIO_Ctrl] = R1;            				//Write mode , CPU/16, 16 bit address
        [P_SIO_Start] = R1;           				//Start transfer
        [P_SIO_Data] = R1;            				//Do'nt care
?L_WaitTransfer:
		R1 = [P_SIO_Start];
        R1 &= B_Busy;								//check transfer over
        JNE  ?L_WaitTransfer;
        [P_SIO_Stop] = R1;          				//Stop transfer
        r1 = C_PageEraseTime;
        [G_FlashTimer] = r1;						//wait 24ms
        pop bp from [sp];
        retf;
		.ENDP

//======================================================
// Function Name:	F_ReadOneByteFrom4096
// Description:		Read one byte from the SPR1024\4096 Flash.
// Input:			Address Low,Address Mid,Address Hi
// Output:			Data->r1
// Destroy:			r1;
// Used:			r1,r3;
// Stacks:			2;
//======================================================
_SP_ReadOneByteFrom4096:
F_ReadOneByteFrom4096:	.PROC
		push bp to [sp];
		bp=sp;
		bp+=6;
		[P_SIO_Stop]=r1;									//stop last transfer
		r1=[bp--];											//get address from stack
		[P_SIO_Addr_High]=r1;
		r1=[bp--];
		[P_SIO_Addr_Mid]=r1;
		r1=[bp--];
		[P_SIO_Addr_Low]=r1;
		
		r1=B_SIO_En+C_SIO_Clk_16+C_SIO_Addr_Sel_24;
		[P_SIO_Ctrl]=r1;									//Read mode , CPU/4, 24 bit address
		[P_SIO_Start]=r1;									//Start transfer
		r1=[P_SIO_Data];									//preRead
	
?L_WaitTransfer:
		R1 = [P_SIO_Start];
        R1 &= B_Busy;										//check transfer over
        JNE  ?L_WaitTransfer;
		
		r1=[P_SIO_Data];									//Read data
?L_WaitTransfer1:
		bp = [P_SIO_Start];
        bp &= B_Busy;										//check transfer over
        JNE  ?L_WaitTransfer1;
		[P_SIO_Stop] = r1;									//Stop transfer
		r1&=0x00FF;
		pop bp from [sp];
		retf;
		.ENDP
//======================================================
// Function Name:	F_ReadDataFrom4096
// Description:		Read n byte from the SPR1024\4096 Flash.
// Input:			Address Low,Address Mid,Address Hi,Data Number,Output Buffer
// Output:			None
// Destroy:			r1;
// Used:			r1,r2,r3;
// Stacks:			0;
//======================================================
_SP_ReadDataFrom4096:
F_ReadDataFrom4096:	.PROC
		push bp to [sp];
		bp=sp+4;
		[P_SIO_Stop]=r1;									//stop last transfer
		r1=[bp++];											//get address from stack
		[P_SIO_Addr_Low]=r1;
		r1=[bp++];
		[P_SIO_Addr_Mid]=r1;
		r1=[bp++];
		[P_SIO_Addr_High]=r1;
		
		r1=B_SIO_En+C_SIO_Clk_16+C_SIO_Addr_Sel_24;
		[P_SIO_Ctrl]=r1;									//Read mode , CPU/4, 24 bit address
		[P_SIO_Start]=r1;									//Start transfer
		r1=[P_SIO_Data];									//preRead
		r2 = [bp++];										//get data number
		bp = [bp];											//get output address
		r3 = 0;												//Low byte first
?L_ReadLoop:
		cmp r2,0;											//read over?
		jz ?L_ReadOver;
?L_WaitTransfer:
		R1 = [P_SIO_Start];
        R1 &= B_Busy;										//check transfer over
        JNE  ?L_WaitTransfer;
		
		r1 = [P_SIO_Data];									//Read data
		test r3,1;											//check save position
		jnz ?L_SaveHiByte;
		r1 &= 0x00FF;
		[bp] = r1;											//save to low byte
		r2 -= 1;											//counter dec
		r3 += 1;											//save to high byte next
		jmp ?L_ReadLoop;
?L_SaveHiByte:
		r1 = r1 lsl 4;
		r1 = r1 lsl 4;
		r1 |= [bp];											//save to high byte
		[bp++] = r1;
		r2 -= 1;											//counter dec
		r3 -= r3;											//save to low byte next
		jmp ?L_ReadLoop;
?L_ReadOver:
?L_WaitTransfer1:
		r1 = [P_SIO_Start];
        r1 &= B_Busy;										//check transfer over
        JNE  ?L_WaitTransfer1;
		[P_SIO_Stop]=r1;									//Stop transfer
		pop bp from [sp];
		retf;
		.ENDP
//======================================================
// Function Name:	F_WriteOneByteTo4096
// Description:		Program a byte to the SPR1024\4096 Flash.
// Input:			Data,Address Low,Address Mid,Address Hi
// Output:			None
// Destroy:			r1;
// Used:			r1,r2,r3;
// Stacks:			0;
//======================================================
_SP_WriteOneByteTo4096:
F_WriteOneByteTo4096:	.PROC
		push bp to [sp];
		bp=sp;
		bp+=7;
		[P_SIO_Stop]=r1;							//stop last transfer
		r1=[bp--];									//get address from stack
		[P_SIO_Addr_High]=r1;
		r1=[bp--];
		[P_SIO_Addr_Mid]=r1;
		r1=[bp--];
		[P_SIO_Addr_Low]=r1;
		
		r1=B_SIO_En+B_SIO_Write_En+C_SIO_Clk_16+C_SIO_Addr_Sel_24;
		[P_SIO_Ctrl]=r1;							//Write mode , CPU/16, 24 bit address
		[P_SIO_Start]=r1;							//Start transfer
		r1=[bp];									//get data from stack
		[P_SIO_Data]=r1;							//program the data
	
?L_WaitTransfer:
		R1 = [P_SIO_Start];
        R1 &= B_Busy;								//check transfer over
        JNE  ?L_WaitTransfer;
		call F_Delay_Program_Time;					//delay 60us
		[P_SIO_Stop]=r1;							//Stop transfer
		pop bp from [sp];

⌨️ 快捷键说明

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