📄 nfhal.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 + -