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

📄 samsungflashv11.asm

📁 使用单片机扩展三星FLASH
💻 ASM
📖 第 1 页 / 共 3 页
字号:
//======================================================
// 文件名称:	SamsungflashV12.asm
// 功能描述:   K9F1208的读写、擦除 
// 使用方法:
//    建议使用以下顺序
//    初始化过程:
//     InitSamsungFlash()     
//    写过程: 
//     InitWriteSamsungFlash() -> FillSamsungFlash(Data) -> ... -> StopWriteSamsungFlash()
//    读过程:
//     InitReadSamsungFlash()  -> ExtractSamsungFlash()  -> ...-> StopReadSamsungFlash()
//    流控制:
//     GetColAddr()
//     GetPage()
//     GetBlock()
//
//    Note: 
//    1. 注意每次读/写操作都要调用初始化和结束函数  
//    2. 为了避免错误,请不要交迭使用读/写操作
//    3. 当program/erase错误发生的时候, 用户必须根据自己的文件系统自行处理 
//       请参考_SP_FillSamsungFlash和_SamsungEraseBlock,这里假定没有错误产生 
// 完成日期:   2004-4-12
// V12修改日期:2004-12-25    Edit By Xinqiang Zhang  xinqiang@sunnorth.com.cn  Tel:010-62981668-2916
//========================================================================================
.INCLUDE hardware.inc;

.PUBLIC _SP_InitSamsungFlash
.PUBLIC _SP_FillSamsungFlash
.PUBLIC _SP_ExtractSamsungFlash
.PUBLIC _SP_InitReadSamsungFlash
.PUBLIC _SP_InitWriteSamsungFlash
.PUBLIC _SP_StopWriteSamsungFlash
.PUBLIC _SP_StopReadSamsungFlash
.PUBLIC _SP_SamsungEraseBlock
.PUBLIC _SP_SamsungMassErase
.PUBLIC _SP_GetColAddr
.PUBLIC _SP_GetPage
.PUBLIC _SP_GetBlock
.PUBLIC _SP_SamsungReadByte
.PUBLIC _SP_SamsungWriteByte
.PUBLIC _SP_SamsungReadPageW
.PUBLIC _SP_SamsungWritePageW

.public _SP_SamsungReadWord						//Add by xinqiang 2004.12.24
.public _SP_SamsungReadWord_1
.public _SP_SamsungWriteWord					//Add by xinqiang 2004.12.24
.PUBLIC _SP_InitReadSamsungFlash_1
// Flash 控制信号 
.DEFINE RE_BIT  0x04//0x02//0x01	          	
.DEFINE WE_BIT  0x02//0x20//0x02		
.DEFINE CE_BIT  0x04		
.DEFINE ALE_BIT 0x20//0x10//0x08		
.DEFINE CLE_BIT 0x10//0x08//0x10		
.DEFINE BASE_CONF 0x003e//0x003a//e
.define BASE_MASK 0x00c1//4					//用来MASKIOB口中没有用到的IO位

// K9F1208的地址边界
.define C_Flash_EN	0xff7f					//Add by xinqiang 2004.12.24
.define C_Flash_UN	0x0080					//Add by xinqiang 2004.12.24

.DEFINE C_PageBin   0x0000        
.DEFINE C_PageEnd   0x1FFFF      
.DEFINE C_BlockBin  0x0000      
.DEFINE C_MaxBlock  0x0FFF      // 4096 block

.DEFINE Port_IOA_Attrib     P_IOA_Attrib
.DEFINE Port_IOA_Dir 	    P_IOA_Dir
.DEFINE Port_IOA_Data       P_IOA_Data
.DEFINE Port_IOA_Buffer     P_IOA_Buffer
.DEFINE Port_IOB_Attrib     P_IOB_Attrib
.DEFINE Port_IOB_Dir        P_IOB_Dir
.DEFINE Port_IOB_Data       P_IOB_Data
.DEFINE Port_IOB_Buffer     P_IOB_Buffer
.DEFINE Port_TimeBaseSetup  P_TimeBase_Setup        
.DEFINE Port_Watchdog_Clear P_Watchdog_Clear      
.DEFINE Port_SystemClock    P_SystemClock         

// 数据Buffer
.DEFINE C_PageSize 0x200  			// 512  bytes
.DEFINE C_MaxPageBufferBytes 0x80 	// 128  bytes 2*C_MaxPageBuffer
.DEFINE C_MaxPageBuffer 0x40 		// 64   words

.IRAM
.VAR R_CurrAddr = 0 
.VAR R_CurrPage = C_PageBin 
.VAR R_WriteIndex = 0
.VAR R_ReadIndex  = C_MaxPageBuffer

.var R_ReadIndex_First				//第一次要读的数据个数 word
.var R_ReadIndex_Secon				//第二次要读的数据个数

.var R_Addr25 = 0					//Edit by xinqiang 2004.12.20 增加高位的地址寄存器
.var R_PageBin = C_PageBin

.RAM
T_PageBuffer: .DW C_MaxPageBuffer dup(0)
.TEXT
.public _InitSignalLine
_InitSignalLine: .proc
	r1 = RE_BIT|WE_BIT//CE_BIT|RE_BIT|WE_BIT;
	[Port_IOB_Buffer]=r1;
	.endp

//--------------------------------------------------------------------
//-- 宏名: M_SaveIoSetting for IOA & IOB   M_SaveIOSetting_1 for IOB
//-- 参数: 无
//-- 把IO设置保存到堆栈
//--------------------------------------------------------------------
M_SaveIoSetting: .MACRO
    R5 = [Port_IOB_Buffer];
    R5 &= 0xFFD0
    push R5 to [SP]
	R5 = [Port_IOA_Buffer];
	R5 &= 0xFF00
	push R5 to [SP]
.ENDM

M_SaveIoSetting_1:.MACRO
	r5 = [Port_IOA_Buffer]
	r5 &= C_Flash_EN
	[Port_IOA_Data] = r5
	r5 = [Port_IOB_Buffer];
	r5 &= BASE_CONF//0x00d0
	push r5 to [sp]
.endm
//--------------------------------------------------------------------
//-- 宏名: M_RetrieveIoSetting for IOA & IOB   M_RetrieveIoSetting_1 for IOB  
//-- 参数: 无
//-- 从堆栈恢复IO设置
//--------------------------------------------------------------------
M_RetrieveIoSetting: .MACRO
	pop R5 from [SP]
	[Port_IOA_Data] = R5
	pop R5 from [SP]
	R5 |= CE_BIT
	[Port_IOB_Data] = R5
.ENDM
M_RetrieveIoSetting_1: .MACRO
	pop R5 from [SP]
//	R5 |= CE_BIT
	[Port_IOB_Data] = R5
	r5 = [Port_IOA_Buffer]
	r5 |= C_Flash_UN
	[Port_IOA_Data] = r5
.ENDM
//--------------------------------------------------------------------
//-- 宏名: M_InitIOAOut for IOA & IOB   M_InitIOAOut_1 for IOB
//-- 参数: 无
//--------------------------------------------------------------------
M_InitIOAOut: .MACRO
	R5 = [Port_IOA_Attrib]
	R5 |= 0x00FF
	[Port_IOA_Attrib] = R5
	R5 = [Port_IOA_Dir]
	R5 |= 0x00FF
	[Port_IOA_Dir] = R5
.ENDM
M_InitIOAOut_1: .MACRO
	R5 = [Port_IOB_Attrib]
	R5 |= 0xff00
	[Port_IOB_Attrib] = R5
	R5 = [Port_IOB_Dir]
	R5 |= 0xff00
	[Port_IOB_Dir] = R5
.ENDM
//--------------------------------------------------------------------
//-- 宏名: M_InitIOAIn for IOA & IOB   M_InitIOAIn_1 for IOB
//-- 参数: 无
//--------------------------------------------------------------------
M_InitIOAIn: .MACRO
	R5 = [P_IOA_Attrib]
	R5 &= 0xFF00
	[P_IOA_Attrib] = R5
	R5 = [P_IOA_Dir]
	R5 &= 0xFF00
	[P_IOA_Dir] = R5
.ENDM
M_InitIOAIn_1: .MACRO
	R5 = [P_IOB_Attrib]
	R5 &= 0x00ff
	[P_IOB_Attrib] = R5
	R5 = [P_IOB_Dir]
	R5 &= 0x00ff
	[P_IOB_Dir] = R5
.ENDM
//--------------------------------------------------------------------
//-- 宏名: M_SendReadCmd
//-- 参数: column,page,portA,portB
//-- 发送 0x00, 0x01 or 0x50
//--------------------------------------------------------------------
M_SendReadCmd: .MACRO column,page,portA,portB
	R5 = SP
	portA = [R5+1]		
	portB = [R5+2]		
	R5 = (CLE_BIT|RE_BIT)
	R5 |= portB
	[Port_IOB_Data] = R5
	R5 = 0x0000						//read0 命令 
	cmp column, 256
	jb ?NotChArea
	column -= 256
	R5 = 0x0001  					//read1 命令 
	cmp column, 256
	jb ?NotChArea
	column -= 256
	R5 = 0x0050  					//read2 命令 
?NotChArea:
	R5 |= portA
	[Port_IOA_Data] = R5
	R5 = (CLE_BIT|RE_BIT|WE_BIT)
	R5 |= portB
	[Port_IOB_Data] = R5			//WE高电平 
	R5 = (WE_BIT|ALE_BIT|RE_BIT)	//CLE低电平 , WE高电平 , ALE高电平 , RE高电平 
	R5 |= portB
	[Port_IOB_Data] = R5
	//.....写地址.....................
	portB |= (ALE_BIT|RE_BIT)
	[Port_IOB_Data] = portB			//WE低电平 
	column |= portA
	[Port_IOA_Data] = column		//Address0 - 7
	[Port_IOB_Data] = R5			//WE, ALE, RE高电平 
	[Port_IOB_Data] = portB			//WE低电平 
	column = page & 0x00FF
	column |= portA
	[Port_IOA_Data] = column		//Address9 - 16
	[Port_IOB_Data] = R5			//WE, ALE高电平 
	[Port_IOB_Data] = portB			//WE低电平 
	page = page LSR 4
	page = page LSR 4
	page |= portA
	[Port_IOA_Data] = page			//Address17 - 22
	[Port_IOB_Data] = R5			//WE, ALE高电平 

	[Port_IOB_Data] = portB			//WE低电平 
	push r1 to [sp]
	r1 = [R_Addr25]//0					//Edit by xinqiang 2004.12.20 从寄存器地址中读取高位地址
	[Port_IOA_Data] = r1			//Address25
	pop r1 from [sp]
	[Port_IOB_Data] = R5			//WE, ALE高电平 

	R5 = SP
	portB = [R5+2]
	R5 = (WE_BIT|RE_BIT)
	R5 |= portB
	[Port_IOB_Data] = R5			//WE高电平 , RE高电平 , ALE低电平 	
.ENDM

//--------------------------------------------------------------------
//-- 宏名: M_SendWriteCmd
//-- 参数: column,page,portA,portB
//-- 发送 0x80
//--------------------------------------------------------------------
M_SendWriteCmd: .MACRO column,page,portA,portB
	R5 = SP
	portA = [R5+1]		
	portB = [R5+2]	
	R5 = (CLE_BIT|RE_BIT)
	R5 |= portB
	[Port_IOB_Data] = R5
	R5 = 0x0000
	cmp column, 256
	jb ?NotChArea
	column -= 256
	R5 = 0x0001
	cmp column, 256
	jb ?NotChArea
	column -= 256
	R5 = 0x0050
?NotChArea:
	R5 |= portA
	[Port_IOA_Data] = R5
	R5 = (CLE_BIT|RE_BIT|WE_BIT)
	R5 |= portB
	[Port_IOB_Data] = R5
	R5 = (CLE_BIT|RE_BIT) 
	R5 |= portB
	[Port_IOB_Data] = R5
	R5 = 0x0080 					 // 连续数据输入命令 
	R5 |= portA
	[Port_IOA_Data] = R5
	R5 = (CLE_BIT|RE_BIT|WE_BIT)
	R5 |= portB
	[Port_IOB_Data] = R5			//WE高电平 
	R5 = (WE_BIT|ALE_BIT|RE_BIT)	//CLE低电平 , WE高电平 , ALE高电平 , RE高电平 
	R5 |= portB
	[Port_IOB_Data] = R5
	//.....写地址.....................
	portB |= (ALE_BIT|RE_BIT)
	[Port_IOB_Data] = portB			//WE低电平 
	column |= portA
	[Port_IOA_Data] = column		//Address0 - 7
	[Port_IOB_Data] = R5			//WE, ALE, RE高电平 
	[Port_IOB_Data] = portB			//WE低电平 
	column = page & 0x00FF
	column |= portA
	[Port_IOA_Data] = column		//Address9 - 16
	[Port_IOB_Data] = R5			//WE, ALE高电平 
	[Port_IOB_Data] = portB			//WE低电平 
	page = page LSR 4
	page = page LSR 4
	page |= portA
	[Port_IOA_Data] = page		//Address17 - 22
	[Port_IOB_Data] = R5		//WE, ALE高电平 	

//for debug,no a25
	[Port_IOB_Data] = R4		//WE低电平 
	push r1 to [sp]
	r1 = [R_Addr25]//0					//Edit by xinqiang 2004.12.20 从寄存器中读取高位地址
	[Port_IOA_Data] = r1			//Address25
	pop r1 from [sp]
	[Port_IOB_Data] = R5		//WE, ALE高电平 
//

	R5 = SP
	portB = [R5+2]
.ENDM

//--------------------------------------------------------------------
//-- 宏名: M_StartProgram
//-- 参数: portA,portB
//-- Send 0x10 
//--------------------------------------------------------------------
M_StartProgram: .MACRO portA,portB
	R5 = (CLE_BIT|RE_BIT)
	R5 |= portB
	[Port_IOB_Data] = R5		//WE低电平 , RE高电平 , CLE高电平 

	R5 = 0x0010					//program 命令 
	R5 |= portA
	[Port_IOA_Data] = R5		//WE低电平 , RE高电平 , CLE高电平 
	R5 = (CLE_BIT|RE_BIT|WE_BIT)
	R5 |= portB
	[Port_IOB_Data] = R5
.ENDM
M_StartProgram_1: .MACRO portA,portB
	R5 = (CLE_BIT|RE_BIT)
	R5 |= portB
	[Port_IOB_Data] = R5		//WE低电平 , RE高电平 , CLE高电平 
	r5 &= 0x00ff
	R5 |= 0x1000					//program 命令 
	[Port_IOB_Data] = R5		//WE低电平 , RE高电平 , CLE高电平 
	R5 |= WE_BIT//(CLE_BIT|RE_BIT|WE_BIT)
	[Port_IOB_Data] = R5
.ENDM
//--------------------------------------------------------------------
//-- 函数名: _SP_InitSamsungFlash
//-- 参数: 无
//-- 返回值: 无
//2004.12.23  Edit by xinqiang Zhang for change the IO
//--------------------------------------------------------------------
_SP_InitSamsungFlash: .proc
_InitSamsungFlash:
	push R1 to [SP]
	R1 = 0 
	[Port_TimeBaseSetup] = R1
//	[Port_SystemClock] = R1
//	R1 = 0x01
//	[Port_Watchdog_Clear] = R1
//	R1 = [Port_IOA_Attrib]
//	R1 |= C_Flash_UN//0xFF00
//	[Port_IOA_Attrib] = R1
//	R1 = [Port_IOA_Dir]
//	R1 |= C_Flash_UN//0xFF00
//	[Port_IOA_Dir] = R1
	
	R1 = [Port_IOB_Attrib]
	R1 &= BASE_MASK//0x00c0//0xFFD0
	R1 |= BASE_CONF
	[Port_IOB_Attrib] = R1
	R1 = [Port_IOB_Dir]
	R1 &= BASE_MASK//0x00c0//0xFFD0
	R1 |= BASE_CONF
	[Port_IOB_Dir] = R1
//	R1 = [Port_IOB_Buffer]
//	R1 |= CE_BIT					//////note that for next time will change it to IOA
//	[Port_IOB_Data] = R1
	pop R1 from [SP]
	retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_InitWriteSamsungFlash
//-- 语法: InitWriteSamsungFlash()
//-- 参数: 无
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_InitWriteSamsungFlash: .proc
	
	PUSH R1,R5 TO [SP];					//Edit by xinqiang 2004.12.20
	r5 = sp+8							//....
//	r3 = [r5++]
	r1 = [r5++]							//page number
	r2 = [r5]							//block number 
//	[R_CurrAddr]=R3;
    R3 = 0;
    [R_WriteIndex]=R3;
    [R_CurrAddr]=R3;
    r2 = r2 rol 4
    r2 = r2 rol 1
    r3 = r2&0xffe0
    r2 = r2 rol 4
    r2 = r2&0x0001
    r1 = r1|r3
 //   R1 = C_PageBin;
    [R_CurrPage]=R1;  
    [R_PageBin]=r1;				//Edit by xinqiang
     
    [R_Addr25]=r2; 
	POP R1,R5 FROM [SP];
	retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_StopWriteSamsungFlash
//-- 语法: SP_StopWriteSamsungFlash()
//-- 参数: 无
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_StopWriteSamsungFlash: .proc

	PUSH R1,R4 TO [SP];
    R2=0;
    R5=[R_CurrAddr];
    cmp R5, C_MaxPageBufferBytes;
    jb ?L_LowerPage;
    R2=C_MaxPageBufferBytes;
?L_LowerPage:
    R1 = R2;
    R2 = [R_CurrPage];    
    R3 = T_PageBuffer;
    R4 = [R_WriteIndex];
    R4 = R4 lsl 1

	call F_SamsungWritePageW;
	
    R1 = 0;
    [R_WriteIndex]=R1;
    [R_CurrAddr]=R1;   
    R1 = [R_PageBin];//C_PageBin;
    [R_CurrPage]=R1;    
	POP R1,R4 FROM [SP];
	retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_InitReadSamsungFlash
//-- 语法: SP_InitReadSamsungFlash()
//-- 参数: 无
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_InitReadSamsungFlash: .proc

	PUSH R1,R5 TO [SP];						//Edit By xinqiang 2004.12.20
	r5 = sp+8
	r1 = [r5++]								//get the page number
	r2 = [r5]								//get the block number
    R3=C_MaxPageBuffer;
    [R_ReadIndex]=R3;
 //   R1=C_PageBin;   
    r2 = r2 rol 4
    r2 = r2 rol 1
    r3 = r2&0xffe0
    r2 = r2 rol 4
    r2 = r2&0x0001
    r1 = r1|r3
    [R_CurrPage]=R1; 
 //   [R_PageBin] = r1				//Edit by xinqiang
    [R_Addr25] = r2
    R1=0;
    [R_CurrAddr]=R1;
    
    R1 = 64
    [R_ReadIndex_First] = R1
    [R_ReadIndex_Secon] = R1	
	POP R1,R5 FROM [SP];
	retf
.endp

//--------------------------------------------------------------------
//-- 函数名: _SP_InitReadSamsungFlash_1
//-- 语法: SP_InitReadSamsungFlash_1()
//-- 参数: r1 page number r2 block number r3 clraddr
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_InitReadSamsungFlash_1: .proc

	PUSH R1,R5 TO [SP];						//Edit By xinqiang 2004.12.20
	r5 = sp+8
	r3 = [r5++]
	r1 = [r5++]								//get the page number
	r2 = [r5]								//get the block number
	[R_CurrAddr]=R3;						//Get the currAddr
?InitRead_2:
	cmp r3,64
	jb ?InitRead_1
	r3 -= 64
	jmp ?InitRead_2	
?InitRead_1:
	r4 = 64
	r4 -= r3
	[R_ReadIndex_First] = r4
	[R_ReadIndex_Secon] = r4
  //  R3=C_MaxPageBuffer;
    [R_ReadIndex]=R4//R3;
 //   R1=C_PageBin;   
    r2 = r2 rol 4
    r2 = r2 rol 1
    r3 = r2&0xffe0
    r2 = r2 rol 4
    r2 = r2&0x0001
    r1 = r1|r3
    [R_CurrPage]=R1; 

⌨️ 快捷键说明

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