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

📄 samsungflashv11.asm

📁 使用单片机扩展三星FLASH
💻 ASM
📖 第 1 页 / 共 3 页
字号:
//--            R2 = page address (A9 - A22)
//--			R3 = data to store
//-- 返回值: R1=0: success, R1=1: failure 
//--		(only detect "1"s that are not successfully program to "0"s).
//--------------------------------------------------------------------
_SamsungWriteByte: //.proc
	push R2, R5 to [SP]
	M_SaveIoSetting_1;
	//......init port A0-A7 as output.......
	M_InitIOAOut_1;
	//......send 命令 .........
//	M_SendWriteCmd R1,R2,R3,R4;
	call MM_SendWriteCmd
	//......write data sequence..............
//	R1 = R3						//portA
	R2 = R4						//portB
	R2 &= 0x00ff
	R5 = SP + 1//2
	R3 = [R5+2]
	R5 = RE_BIT
	R5 |= R2
	[Port_IOB_Data] = R5		//WE低电平 , RE高电平 , ALE低电平 
//	R3 &= 0x00FF
	r3 = r3 lsl 4
	r3 = r3 lsl 4
	R5 |= R3 //R3 |= R1
	[Port_IOB_Data] = R5//[Port_IOA_Data] = R3
	R5 |= WE_BIT//= (RE_BIT|WE_BIT)
//	R5 |= R2
	[Port_IOB_Data] = R5
	//.......start program process...............
    M_StartProgram_1 R1,R2;
	//.......read status.........................
	R4 = (CLE_BIT|RE_BIT)	
	R4 |= R2
	[Port_IOB_Data] = R4
	R4 |= 0x7000//= 0x0070					//get status
//	R4 |= R1
	[Port_IOB_Data] = R4//[Port_IOA_Data] = R4		//WE低电平 , RE高电平 , CLE高电平 
	R4 |= WE_BIT//= (CLE_BIT|RE_BIT|WE_BIT)
	//R4 |= R2
	[Port_IOB_Data] = R4
	//........init port A0-A7 as input............
	M_InitIOAIn_1;
	//............................................
	R4 = WE_BIT
	R4 |= R2
	R5 = (WE_BIT|RE_BIT)
	R5 |= R2
?busyLp:
	[Port_IOB_Data] = R4
	R1 = [Port_IOB_Data]//[Port_IOA_Data]
	[Port_IOB_Data] = R5
	R2 = R1 & 0x4000//0x0040
	jz ?busyLp
	R1 &= 0x0001
    M_RetrieveIoSetting_1;
	pop R2, R5 from [SP]
	retf
//.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungWritePageW
//-- 语法: SamsungWritePageW(column address, page address,address of buffer,# of bytes to be stored)
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//--			R3 = address of buffer
//--			R4 = Number of bytes to be stored
//-- 返回值: 无
//--------------------------------------------------------------------
_SP_SamsungWritePageW: .proc
   PUSH BP,BP TO [SP];
	BP=SP+1
	R1 = [BP+3]
	R2 = [BP+4]
    R3 = [BP+5]
    R4 = [BP+6]   	
    
    call F_SamsungWritePageW
    POP BP,BP FROM [SP];
	retf
.endp
//--------------------------------------------------------------------
//-- Function: F_SamsungWritePageW
//-- 参数: R1 = column address (0 - 527)
//--            R2 = page address (A9 - A22)
//--			R3 = address of buffer
//--			R4 = Number of bytes to be stored (must be even)
//-- 返回值: 无
//--------------------------------------------------------------------
F_SamsungWritePageW: 
	push R3, R5 to [SP]
	M_SaveIoSetting_1;
	//......init port A0-A7 as output.......
	M_InitIOAOut_1;
	//......send 命令 .........
	//M_SendWriteCmd R1,R2,R3,R4;
	call MM_SendWriteCmd
	//......write data sequence..............
//	R1 = R3						//portA
	R2 = R4						//portB
	r2 &= 0x00ff
	R5 = SP + 1//2
	R3 = [R5+1]
	R4 = [R5+2]
?writeLp:
	R5 = RE_BIT
	R5 |= R2
	[P_IOB_Data] = R5		//WE低电平 , RE高电平 , ALE低电平 
	R1 = [R3]//R5 = [R3]             	//extract低电平 er byte
//	R5 &= 0x00FF;
	R1 = R1 lsl 4
	r1 = R1 lsl 4
	R5 |= R1
	[Port_IOB_Data] = r5//[P_IOA_Data] =  R5

	R5 |= WE_BIT// (RE_BIT|WE_BIT)
//	R5 |= R2
	[Port_IOB_Data] = R5
	R5 = RE_BIT
	R5 |= R2
	[P_IOB_Data] = R5		//WE低电平 , RE高电平 , ALE低电平 	
	R1 = [R3++]//R5 = [R3++]             //extract高电平 er byte
//	R5 = R5 lsr 4
//	R5 = R5 lsr 4
	R1 &= 0xff00
	R5 |= R1
	[Port_IOB_Data] = r5//[P_IOA_Data] = R5
	R5 |= WE_BIT//= (RE_BIT|WE_BIT)
//	R5 |= R2
	[Port_IOB_Data] = R5
	R4 -= 2
	jnz ?writeLp
	nop
	//.......start program process...............
    M_StartProgram_1 R1,R2;
    
    // Not checking status here	    
	M_RetrieveIoSetting_1;
	pop R3, R5 from [SP]
retf
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungEraseBlock
//-- 语法: SP_SamsungEraseBlock(Block address)
//-- 参数:
//--	R1 = Block address (0 - 1023).
//--	Each block contains 16 pages = 8KBytes + 256 Bytes of spare space
//-- 返回值:
//--	R1 = 0 if success, R1 = 1 if failure
//--------------------------------------------------------------------
_SP_SamsungEraseBlock: .proc
    PUSH BP,BP TO [SP];
    BP = SP + 1;
    R1 = [BP+3];
    
    call _SamsungEraseBlock

    POP BP,BP FROM [SP];
	retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SamsungEraseBlock
//-- 参数:
//--	R1 = Block address (0 - 4095).
//--	Each block contains 32 pages = 16KBytes + 512 Bytes of spare space
//-- 返回值:
//--	R1 = 0 if success, R1 = 1 if failure
//--------------------------------------------------------------------
_SamsungEraseBlock: //.proc
	push R2, R5 to [SP]
	M_SaveIoSetting_1;
	//......init port A0-A7 as output.......
	M_InitIOAOut_1;
	//......send 命令 ....................
	R5 = SP
	R3 = [R5+1]						//get the IOB statu}K
	r3 &= BASE_MASK
//	R4 = r3//[R5+2]
	R5 = (CLE_BIT|RE_BIT)
	R5 |= R3//R4
	[Port_IOB_Data] = R5
//	R5 = 0x0060 					//auto block erase setup
	r2 = 0x6000
	r2 |= r3//r4
	r5 |= r2
//	R5 |= R3
	[Port_IOB_Data] = r5//[Port_IOA_Data] = R5
	R5 |= WE_BIT//R5 = (CLE_BIT|RE_BIT|WE_BIT)
	//R5 |= r4
	[Port_IOB_Data] = R5			//WE高电平 
	R5 = (WE_BIT|ALE_BIT|RE_BIT)	//CLE低电平 , WE高电平 , ALE高电平 , RE高电平 
	R5 |= R2//R4
	[Port_IOB_Data] = R5
	//.....写地址.....................
	R4 = (ALE_BIT|RE_BIT)//R4 |= (ALE_BIT|RE_BIT)
	r4 |= r3				//add new line
	[Port_IOB_Data] = R4			//WE低电平 
	R1 = R1 LSL 4
	r1 = r1 lsl 1
	r2 = r1 lsl 4
	r2 = r2 lsl 4
	R2 &= 0xff00//= //R1 & 0x00FF
	R2 |= R4//R3
	[Port_IOB_Data] = r2//[Port_IOA_Data] = R2			//Address9 - 16
	r5 &= 0x00ff			//add new
	r5 |= r2 				//add new
	[Port_IOB_Data] = R5			//WE, ALE, RE高电平 
	[Port_IOB_Data] = R2//R4			//WE低电平 
//	R1 = R1 LSR 4
//	R1 = R1 LSR 4
	r2 = r1&0xff00
	r4 &= 0x00ff
	r2 = r2|r4
//	R1 |= R3
	[Port_IOB_Data] = r2//[Port_IOA_Data] = R1			//Address17 - 24
	r5 &= 0x00ff			//add new
	r5 |= r2 				//add new
	[Port_IOB_Data] = R5			//WE, ALE高电平 
	
	[Port_IOB_Data] = R2			//WE低电平 
	push r1 to [sp]
	r1 = [R_Addr25]//0					//Edit by xinqiang 2004.12.20 从寄存器中读高位地址
	//[Port_IOA_Data] = r1			//Address25
	r1 = r1 lsl 4
	r1 = r1 lsl 4
	r1 = r1|r4
	[Port_IOB_Data] = r1
	r5 = r5&0x00ff
	r5 |= r1
	pop r1 from [sp]
	[Port_IOB_Data] = R5			//WE, ALE高电平 
	
//	R5 = SP
//	R4 = [R5+2]
	R5 = RE_BIT
	R5 |= R3//R4
	[Port_IOB_Data] = R5			//WE低电平 , RE高电平 , ALE低电平 
	//.......开始erase.................
//	R1 = R3
//	R2 = R4
	R5 = (CLE_BIT|RE_BIT)
	R5 |= R3//R2
	[Port_IOB_Data] = R5			//WE低电平 , RE高电平 , CLE高电平 
	R4 = 0xd000//R5 = //0x00D0						//清除命令 
	R4 |= R5//R5 |= R1
	[Port_IOB_Data] = r4//[Port_IOA_Data] = R5
//	R5 = (CLE_BIT|RE_BIT|WE_BIT)
//	R5 |= R2
	r4 |= WE_BIT
	[Port_IOB_Data] = R4//R5
	//.......读status.........................
//	R4 = (CLE_BIT|RE_BIT)	
//	R4 |= R2
	r5 |= 0xd000
	[Port_IOB_Data] = R5//R4
	r5 &= 0x00ff
	R4 = r5|0x7000//0x0070						//获得status
//	R4 |= R5//R1
	[Port_IOB_Data] = R4			//WE低电平 , RE高电平 , CLE高电平 
//	R4 = (CLE_BIT|RE_BIT|WE_BIT)
//	R4 |= R2
	R4 |= WE_BIT
	[Port_IOB_Data] = R4
	//........把A0-A7初始化为输入............
	M_InitIOAIn_1;
	//............................................
	R4 = WE_BIT
	R4 |= R3//R2
	R5 = (WE_BIT|RE_BIT)
	R5 |= R3//R2
?busyLp:
	[Port_IOB_Data] = R4
	R1 = [Port_IOB_Data]//[Port_IOA_Data]
	[Port_IOB_Data] = R5
	//R2 = R1 & 0x0040
	test R1,0x4000
	jz ?busyLp
	R1 &= 0x0001
    // 在这里处理erase错误
    M_RetrieveIoSetting_1;
	pop R2, R5 from [SP]
	retf
//.endp
//--------------------------------------------------------------------
//-- 函数名: _SP_SamsungMassErase
//-- 语法: SamsungMassEraseBlock()
//-- 参数:
//--	R1 = Block address (0 - 4095).
//--	Each block contains 16 pages = 8KBytes + 256 Bytes of spare space
//-- 返回值:
//--	R1 = 0 if success, R1 >= 1 the # of block erase failures
//--------------------------------------------------------------------
_SP_SamsungMassErase: .proc
    push R2,R3 to [SP];
    R2 = C_BlockBin;    	// 全部Erase
    R3 = 0;       			// #代表失败 
?L_EraseLoop:
    R1 = R2;   
    call _SamsungEraseBlock
  
    R3+=R1;   				// #代表失败
?L_BlockEraseSuccess: 
    R2+=1;
    cmp R2, C_MaxBlock;
    jb ?L_EraseLoop;
    R1 = R3;
    pop R2,R3 from [SP];
    retf
.endp
//--------------------------------------------------------------------
//-- 宏名: MM_SendReadCmd
//-- 参数: r1=column,r2=page, r3=portA,r4=portB
//-- 发送 0x00, 0x01 or 0x50
//--------------------------------------------------------------------

MM_SendReadCmd:.proc 
	r5 = sp
	r4 = [r5+3]						//get the portB
	r4 &= BASE_MASK
	push r4 to [sp]
	r4 |= (CLE_BIT|RE_BIT)			//CLE\RE hight
	[Port_IOB_Data] = r4
	r5 = 0x0000							//read cmd 0
	cmp r1,256
	jb ?MM_NotChArea
	r1 -= 256
	r5 = 0x0100							//read cmd 1
	cmp r1,256
	jb ?MM_NotChArea
	r1 -= 256						//read cmd 2
	r5 = 0x0500
?MM_NotChArea:
	r4 |= r5						//or the cmd
	[Port_IOB_Data] = r4
	r4 |= WE_BIT					//WE高电平
	//nop
	[Port_IOB_Data] = r4
	r4 &= 0x00c0
	r4 |= (WE_BIT|ALE_BIT|RE_BIT)	//CLE低电平 , WE高电平 , ALE高电平 , RE高电平 
	[Port_IOB_Data] = r4
	//............写地址...............
	r4 &= 0xffc0
	r4 |= (ALE_BIT|RE_BIT)			//WE low
	[Port_IOB_Data] = r4
	r1 = r1 lsl 4
	r1 = r1 lsl 4
	r4 |= r1
	[Port_IOB_Data] = r4			//addr0~7
	r5 = r4|WE_BIT
	[Port_IOB_Data] = r5
//	nop										////////.....
	[Port_IOB_Data] = r4
	r1 = r2 lsl 4					//get the addr
	r1 = r1 lsl 4
	r4 &=0x00ff
	r4 |= r1
	r5 = r4|WE_BIT
	[Port_IOB_Data] = r4			//addr9~16
//	nop									/////......
	[Port_IOB_Data] = r5
//	nop
	[Port_IOB_Data] = r4
	r1 = r2&0xff00
	r4 &= 0x00ff
	r4 |= r1
	r5 = r4|WE_BIT
	[Port_IOB_Data] = r4			//Addr17~24
//	nop
	[Port_IOB_Data] = r5
//	nop									////.....
	[Port_IOB_Data] = r4
	
	r1 = [R_Addr25]
	r1 = R1 lsl 4
	r1 = r1 lsl 4
	r4 = r4 & 0x00ff
	r4 |= r1
	r5 = r4|WE_BIT
	[Port_IOB_Data] = r4
//	nop												////......
	[Port_IOB_Data] = r5
	r1 = 0xffff
	r1 = r1^ALE_BIT
	r5 &= r1
	[Port_IOB_Data] = r5
	pop r4 from [sp]
	retf
.endp

//--------------------------------------------------------------------
//-- 宏名: MM_SendWriteCmd
//-- 参数: column,page,portA,portB
//-- 发送 0x80
//--------------------------------------------------------------------
MM_SendWriteCmd: .proc
	r5 = sp
	r4 = [r5+3]						//get the portB
	r4 &= BASE_MASK
	push r4 to [sp]
	r4 |= (CLE_BIT|RE_BIT)			//CLE\RE hight
	[Port_IOB_Data] = r4
	r5 = 0x0000							//read cmd 0
	cmp r1,256
	jb ?MM_NotChArea_W
	r1 -= 256
	r5 = 0x0100							//read cmd 1
	cmp r1,256
	jb ?MM_NotChArea_W
	r1 -= 256						//read cmd 2
	r5 = 0x0500
?MM_NotChArea_W:
	r4 |= r5						//or the cmd
	[Port_IOB_Data] = r4
	r4 |= WE_BIT					//WE高电平
	[Port_IOB_Data] = r4
	r4 &= 0x00c0
	R4 |= (CLE_BIT|RE_BIT) 
	[Port_IOB_Data] = R4
	R4 |= 0x8000 					 // 连续数据输入命令 
	[Port_IOB_Data] = R4
	R4 |= WE_BIT
	[Port_IOB_Data] = R4			//WE高电平 
	r4 &= 0x00c0
	r5 = r4|(ALE_BIT|RE_BIT)
	R4 |= (WE_BIT|ALE_BIT|RE_BIT)	//CLE低电平 , WE高电平 , ALE高电平 , RE高电平 
	[Port_IOB_Data] = R4
	//.....写地址.....................
	[Port_IOB_Data] = r5//portB			//WE低电平 
	r1 = r1 lsl 4
	r1 = r1 lsl 4
	r5 |= r1
	[Port_IOB_Data] = r5//column		//Address0 - 7
	r4 |= r1
	[Port_IOB_Data] = R4			//WE, ALE, RE高电平 
	[Port_IOB_Data] = r5			//WE低电平 
	r1 = r2 lsl 4
	r1 = r1 lsl 4
	r5 &= 0x00ff
	r5 |= r1
	[Port_IOB_Data] = R5		//Address9 - 16
	r4 &= 0x00ff
	r4 |= r1
	[Port_IOB_Data] = r4			//WE, ALE高电平 
	[Port_IOB_Data] = r5			//WE低电平 
	r2 &= 0xff00
	r5 &= 0x00ff
	r5 |= r2
	[Port_IOB_Data] = r5		//Address17 - 22
	r4 &= 0x00ff
	r4 |= r2
	[Port_IOB_Data] = R4		//WE, ALE高电平 	
//for debug,no a25
	[Port_IOB_Data] = R5		//WE低电平 
	r1 = [R_Addr25]//0					//Edit by xinqiang 2004.12.20 从寄存器中读取高位地址
	r1 = r1 lsl 4
	r1 = r1 lsl 4
	r5 &= 0x00ff
	r5 |= r1
	[Port_IOB_Data] = r5			//Address25
	r4 &= 0x00ff
	r4 |= r1
	[Port_IOB_Data] = R4		//WE, ALE高电平 
//
	pop r4 from [sp]
	retf
.endp
//--------------------------------------------------------------------
//-- 函数名: _SamsungGetStatus_1		得到Flash 状态
//-- 参数: 无
//-- 返回值: R1 = Status.
//2004.12.23   Edit by xinqiang zhang  for change IO
//--------------------------------------------------------------------
_SamsungGetStatus_1: //.proc
	push R2, R5 to [SP]
    M_SaveIoSetting_1;
	//......init port A0-A7 as output.......
	M_InitIOAOut_1;
	//......send 命令 ....................
	R5 = SP
	R2 = [R5+1]					//portA
	r2 &= BASE_MASK
	r3 = r2
//	R3 = [R5+2]					//portB
	R4 = (CLE_BIT|RE_BIT)
	R4 |= R2
	[Port_IOB_Data] = R4
	R5 = 0x7000//0x0070  				//read0 命令 
	R5 |= r4//R2
//	r2 = r2|r5
	[Port_IOB_Data] = R5
	R5 |= WE_BIT
	[Port_IOB_Data] = R5		//WE高电平 
	R4 = (WE_BIT|RE_BIT)		//CLE低电平 , WE高电平 , RE高电平 
	R4 |= R2
	[Port_IOB_Data] = R4
	//.....init port A0-A7 as input..........
	M_InitIOAIn_1;
	//.......................................
	R4 = WE_BIT					//RE低电平 
	R4 |= R3
	[Port_IOB_Data] = R4
	nop
	R1 = [Port_IOB_Data]		
	R1 &= 0xff00
	r1 = r1 lsr 4
	r1 = r1 lsr 4
	M_RetrieveIoSetting_1;
	pop R2, R5 from [SP]
	retf

⌨️ 快捷键说明

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