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

📄 sst25vf016bdrv.c

📁 LM3S8962的SPI接口访问SST25VF016B软件包
💻 C
📖 第 1 页 / 共 2 页
字号:

		CE_Low();			
		Send_Byte(0x02); 						// 发送字节数据烧写命令
		Send_Byte((((Dst+i) & 0xFFFFFF) >> 16));// 发送3个字节的地址信息 
		Send_Byte((((Dst+i) & 0xFFFF) >> 8));
		Send_Byte((Dst+i) & 0xFF);
		Send_Byte(SndbufPt[i]);					// 发送被烧写的数据
		CE_High();			

		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);					// 发送读状态寄存器命令
			StatRgVal = Get_Byte();				// 保存读得的状态寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);				// 一直等待,直到芯片空闲
	}

	CE_Low();			
	Send_Byte(0x06);							// 发送写使能命令
	CE_High();			

	CE_Low();			
	Send_Byte(0x50);							// 使状态寄存器可写
	CE_High();			
	CE_Low();			
	Send_Byte(0x01);							// 发送写状态寄存器指令
	Send_Byte(temp);							// 恢复状态寄存器设置信息 
	CE_High();

	return (OK);		
}

/************************************************************************
** 函数名称:SSTF016B_Erase												
** 函数功能:根据指定的扇区号选取最高效的算法擦除								
** 入口参数:
**			uint32 sec1:起始扇区号,范围(0~499)
**			uint32 sec2:终止扇区号,范围(0~499)
** 出口参数:操作成功则返回OK,失败则返回ERROR		
************************************************************************/
uint8 SSTF016B_Erase(uint32 sec1, uint32 sec2)
{
	uint8  temp1 = 0,temp2 = 0,StatRgVal = 0;
    uint32 SecnHdAddr = 0;	  			
	uint32 no_SecsToEr = 0;				   			// 要擦除的扇区数目
	uint32 CurSecToEr = 0;	  						// 当前要擦除的扇区号
	
	/*  检查入口参数 */
	if ((sec1 > SEC_MAX)||(sec2 > SEC_MAX))	
	{
		return (ERROR);	
	}
   	
   	CE_Low();			 
	Send_Byte(0x05);								// 发送读状态寄存器命令
	temp1 = Get_Byte();								// 保存读得的状态寄存器值
	CE_High();								

	CE_Low();			
	Send_Byte(0x50);								// 使状态寄存器可写
	CE_High();			
	CE_Low();								  	
	Send_Byte(0x01);								// 发送写状态寄存器指令
	Send_Byte(0);									// 清0BPx位,使Flash芯片全区可写 
	CE_High();
	
	CE_Low();			
	Send_Byte(0x06);								// 发送写使能命令
	CE_High();			

	/* 如果用户输入的起始扇区号大于终止扇区号,则在内部作出调整 */
	if (sec1 > sec2)
	{
	   temp2 = sec1;
	   sec1  = sec2;
	   sec2  = temp2;
	} 
	/* 若起止扇区号相等则擦除单个扇区 */
	if (sec1 == sec2)	
	{
	    SecnHdAddr = SEC_SIZE * sec1;				// 计算扇区的起始地址
	    CE_Low();	
    	Send_Byte(0x20);							// 发送扇区擦除指令
	    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 发送3个字节的地址信息
   		Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
   		Send_Byte(SecnHdAddr & 0xFF);
  		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 发送读状态寄存器命令
			StatRgVal = Get_Byte();					// 保存读得的状态寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空闲
		return (OK);			
	}
	
/* 		根据起始扇区和终止扇区间距调用最快速的擦除功能 							*/	
	
	if (sec2 - sec1 == SEC_MAX)	
	{
		CE_Low();			
		Send_Byte(0x60);							// 发送芯片擦除指令(60h or C7h)
		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 发送读状态寄存器命令
			StatRgVal = Get_Byte();					// 保存读得的状态寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空闲
   		return (OK);
	}
	
	no_SecsToEr = sec2 - sec1 +1;					// 获取要擦除的扇区数目
	CurSecToEr  = sec1;								// 从起始扇区开始擦除
	
	/* 若两个扇区之间的间隔够大,则采取16扇区擦除算法 */
	while (no_SecsToEr >= 16)
	{
	    SecnHdAddr = SEC_SIZE * CurSecToEr;			// 计算扇区的起始地址
	    CE_Low();	
	    Send_Byte(0xD8);							// 发送64KB块擦除指令
	    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 发送3个字节的地址信息
   		Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
   		Send_Byte(SecnHdAddr & 0xFF);
  		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 发送读状态寄存器命令
			StatRgVal = Get_Byte();					// 保存读得的状态寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空闲
		CurSecToEr  += 16;							// 计算擦除了16个扇区后,和擦除区域相邻的待擦除扇区号
		no_SecsToEr -=  16;							// 对需擦除的扇区总数作出调整
	}
	/* 若两个扇区之间的间隔够大,则采取8扇区擦除算法 */
	while (no_SecsToEr >= 8)
	{
	    SecnHdAddr = SEC_SIZE * CurSecToEr;			// 计算扇区的起始地址
	    CE_Low();	
	    Send_Byte(0x52);							// 发送32KB擦除指令
	    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 发送3个字节的地址信息
   		Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
   		Send_Byte(SecnHdAddr & 0xFF);
  		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 发送读状态寄存器命令
			StatRgVal = Get_Byte();					// 保存读得的状态寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空闲	
		CurSecToEr  += 8;
		no_SecsToEr -=  8;
	}
	/* 采用扇区擦除算法擦除剩余的扇区 */
	while (no_SecsToEr >= 1)
	{
	    SecnHdAddr = SEC_SIZE * CurSecToEr;			// 计算扇区的起始地址
	    CE_Low();	
    	Send_Byte(0x20);							// 发送扇区擦除指令
	    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 发送3个字节的地址信息
   		Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
   		Send_Byte(SecnHdAddr & 0xFF);
  		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 发送读状态寄存器命令
			StatRgVal = Get_Byte();					// 保存读得的状态寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空闲
		CurSecToEr  += 1;
		no_SecsToEr -=  1;
	}
/*				擦除结束,恢复状态寄存器信息							*/
	CE_Low();			
	Send_Byte(0x06);								// 发送写使能命令
	CE_High();			

	CE_Low();			
	Send_Byte(0x50);								// 使状态寄存器可写
	CE_High();			
	CE_Low();			
	Send_Byte(0x01);								// 发送写状态寄存器指令
	Send_Byte(temp1);								// 恢复状态寄存器设置信息 
	CE_High();    
	return (OK);
}



























⌨️ 快捷键说明

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