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

📄 at45.#3

📁 F020集成以太网接口核心模块DataFlash例程源代码
💻 #3
📖 第 1 页 / 共 2 页
字号:

	return 1;
}

//----------------------------------------------------------
//功能:将Flash第pageAddr页面的数据读出到Flash缓冲区1中
//参数:pageAddr,WORD:要读出的页面地址
//返回值:1,成功;0:失败
//----------------------------------------------------------
BYTE PageToBuffer1(WORD pageAddr)
{

	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);                // 检查器件是否准备就绪

	DF_CHIP_SELECT; 		

	SendSPIByte(PAGE_TO_B1_XFER);       
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)(pageAddr << PAGE_SHIFT[g_cFlashType]));
	SendSPIByte(0);				

	DF_CHIP_NOSELECT;

	return 1;
}
//--------------------------------------------------------
//功能:将Flash第pageAddr页面的数据读出到Flash缓冲区2中
//参数:pageAddr,WORD:要读出的页面地址
//返回值:1,成功;0:失败
//--------------------------------------------------------
BYTE PageToBuffer2(WORD pageAddr)    
{
	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);                // 检查器件是否准备就绪

	DF_CHIP_SELECT; 		           

	SendSPIByte(PAGE_TO_B2_XFER);       
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)(pageAddr << PAGE_SHIFT[g_cFlashType]));
	SendSPIByte(0);				

	DF_CHIP_NOSELECT;
	
	return 1;

}

//--------------------------------------------------------
// 功能:擦除pageAddr页面
// 参数:要擦除的页面
// 返回:1,成功;0:失败
//--------------------------------------------------------
BYTE FlashPageErase(WORD pageAddr)
{
	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);  // 检查器件是否准备就绪

	DF_CHIP_SELECT;
	SendSPIByte(PAGE_ERASE);
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)(pageAddr << PAGE_SHIFT[g_cFlashType]));
	SendSPIByte(0x00);
	DF_CHIP_NOSELECT;

	return 1;
}

//-------------------------------------------------------
// 功能:擦除blockAddr
// 参数:要擦除的block
// 返回:1:成功;0:失败
//------------------------------------------------------
BYTE FlashBlockErase(WORD blockAddr)
{
	if(blockAddr>=FLASH_BLOCK[g_cFlashType]) return 0;

	while((GetFlashStatus()&0x80)==0);

	DF_CHIP_SELECT;
	
	SendSPIByte(BLOCK_ERASE);
	SendSPIByte(blockAddr>>(8-BLOCK_SHIFT[g_cFlashType]));
	SendSPIByte(blockAddr<<BLOCK_SHIFT[g_cFlashType]);
	SendSPIByte(0);

	DF_CHIP_NOSELECT;

	return 1;
}
//--------------------------------------------------------
//功能:直接将Flash Buffer1中的数据写入到pageAddr页,不擦除
//参数:pageAddr,WORD:要写入的页面地址
//返回值:1,成功;0,失败
//--------------------------------------------------------
BYTE FlashBuffer1ProgNoErase(WORD pageAddr)
{
	
	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);  // 检查器件是否准备就绪

	DF_CHIP_SELECT;
	SendSPIByte(B1_TO_PAGE_WITHOUT_ERASE);
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)(pageAddr << PAGE_SHIFT[g_cFlashType]));
	SendSPIByte(0x00);
	DF_CHIP_NOSELECT;

	return 1;
}
//--------------------------------------------------------
//功能:直接将Flash Buffer2中的数据写入到pageAddr页,不擦除
//参数:pageAddr,WORD:要写入的页面地址
//返回值:1,成功;0,失败
//--------------------------------------------------------
BYTE FlashBuffer2ProgNoErase(WORD pageAddr)
{

	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);  // 检查器件是否准备就绪

	DF_CHIP_SELECT;
	SendSPIByte(B2_TO_PAGE_WITHOUT_ERASE);
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)(pageAddr << PAGE_SHIFT[g_cFlashType]));
	SendSPIByte(0x00);
	DF_CHIP_NOSELECT;

	return 1;
}
//擦除+缓存写主存
//--------------------------------------------------------
//功能:首先擦除指定的扇区,并将Flash的Buffer1中的数据写入到扇区中
//参数:pageAddr,BYTE:要写入的扇区
//返回值:1,成功;0,失败
//--------------------------------------------------------
BYTE FlashBuffer1ProgAutoErase(WORD pageAddr)
{

	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);  // 检查器件是否准备就绪

	DF_CHIP_SELECT;
	SendSPIByte(B1_TO_PAGE_WITH_ERASE);
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)(pageAddr << PAGE_SHIFT[g_cFlashType]));
	SendSPIByte(0x00);
	DF_CHIP_NOSELECT;

	return 1;
}

//擦除+缓存写主存
//--------------------------------------------------------
//功能:首先擦除指定的扇区,并将Flash的Buffer2中的数据写入到扇区中
//参数:pageAddr,BYTE:要写入的扇区
//返回值:1,成功;0,失败
//--------------------------------------------------------
BYTE FlashBuffer2ProgAutoErase(WORD pageAddr)
{
	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);                // 检查器件是否准备就绪

	DF_CHIP_SELECT;
	SendSPIByte(B2_TO_PAGE_WITH_ERASE);
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)(pageAddr << PAGE_SHIFT[g_cFlashType]));
	SendSPIByte(0x00);
	DF_CHIP_NOSELECT;

	return 1;
}


//--------------------------------------------------------------------------------
//功能:将缓冲区pBuffer中的长度为len的数据通过Flash的Buffer1写入到pageAddr页面中,页面自动擦除
//参数:start_addr,WORD:缓冲区内起始位置
//      len,        WORD: 数据长度
//      pBuffer,    BYTE*:数据缓冲区
//      pageAddr,   WORD: 页面
//返回值:1,成功;0:失败
//--------------------------------------------------------------------------------
BYTE FlashProgViaBuffer1(WORD start_addr, WORD len,BYTE *pBuffer,WORD pageAddr)
{
	WORD  i;
	
	if(start_addr+len>FLASH_PAGE_BYTE[g_cFlashType])
	{// 地址长度错误
		return 0;
	}

	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);  // 检查器件是否准备就绪

	DF_CHIP_SELECT;		
	
				
	SendSPIByte(PAGE_PROG_THROUGH_B1);
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)((pageAddr << PAGE_SHIFT[g_cFlashType]) + (start_addr>>8)));
	SendSPIByte((BYTE)start_addr);
	for (i=0;i<len;i++) SendSPIByte(*pBuffer++);


	DF_CHIP_NOSELECT;

	return 1;
}

//--------------------------------------------------------
//功能:将缓冲区pBuffer中的长度为len的数据通过Flash的Buffer2写入到pageAddr页面中,页面自动擦除
//参数:start_addr,WORD:缓冲区内起始位置
//      len,        WORD: 数据长度
//      pBuffer,    BYTE*:数据缓冲区
//      pageAddr,   WORD: 页面
//返回值:1,成功;0:失败
//--------------------------------------------------------
BYTE FlashProgViaBuffer2(WORD start_addr, WORD len,BYTE *pBuffer,WORD pageAddr)
{
	WORD  i;
	
	if(start_addr+len>FLASH_PAGE_BYTE[g_cFlashType])
	{// 地址长度错误
		return 0;
	}

	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);                // 检查器件是否准备就绪

	DF_CHIP_SELECT;					
	SendSPIByte(PAGE_PROG_THROUGH_B2);
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)((pageAddr << PAGE_SHIFT[g_cFlashType]) + (start_addr>>8)));
	SendSPIByte((BYTE)start_addr);
	for (i=0;i<len;i++)	SendSPIByte(*pBuffer++);
	DF_CHIP_NOSELECT;

	return 1;
}


///////////////////////////////////////////////////////////////////////
// 页面自动重写入函数
//--------------------------------------------------------
//功能:首先擦除pageAddr页面并将缓冲区pBuffer中的长度为len的数据通过Flash的Buffer1写入到pageAddr页面中
//参数:pageAddr,   WORD: 页面
//返回值:1,成功;0:失败
//--------------------------------------------------------
BYTE FlashAutoReWriteViaBuffer1(WORD pageAddr)
{
	WORD  i;

	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);                 // 检查器件是否准备就绪

	DF_CHIP_SELECT;					
	SendSPIByte(AUTO_PAGE_REWRITE_THROUGH_B1);
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)(pageAddr << PAGE_SHIFT[g_cFlashType]));
	SendSPIByte(0);

	DF_CHIP_NOSELECT;

	return 1;
}


//--------------------------------------------------------
//功能:Page中的内容通过buffer2自动进行重新写入
//参数:pageAddr,   WORD: 页面
//返回值:1,成功;0:失败
//--------------------------------------------------------
BYTE FlashAutoReWriteViaBuffer2(WORD pageAddr)
{
	WORD  i;

	if(pageAddr>=FLASH_PAGE[g_cFlashType]) return 0;  // 页面地址无效

	while((GetFlashStatus()&0x80)==0);                // 检查器件是否准备就绪

	DF_CHIP_SELECT;			
			    
	SendSPIByte(AUTO_PAGE_REWRITE_THROUGH_B2);
	SendSPIByte((BYTE)(pageAddr >> (8-PAGE_SHIFT[g_cFlashType])));
	SendSPIByte((BYTE)(pageAddr << PAGE_SHIFT[g_cFlashType]));
	SendSPIByte(0);


	DF_CHIP_NOSELECT;

	return 1;

}

⌨️ 快捷键说明

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