📄 spr4096.asm
字号:
//======================================================
// 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 + -