📄 at45.#3
字号:
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 + -