📄 flash.cpp
字号:
#include "includes.h"
int CheckBlank(UINT32 addr,UINT32 WordSize)
{
UINT32 i,temp;
for (i=addr;i<(addr+WordSize);i++)
{
temp=*((volatile UINT16 *)(BaseFlash+i<<1));
if(temp!=0xffff)
return 0;
}
return 1;
}
int WaitForEnd( )
{
int iWait,iResult;//超时计数
/*iWait = 500000;//超时计数
while(iWait)//检测FLASH状态,若准备好进行下一步操作则退出循环
{
iWait--;
if((iResult = iGetFlashStatus()) == 0)
{
break;
}
}*/
uchar d, t,i;
// 从任意地址读取数据
d = *(volatile ushort *)BaseFlash+0x100;
while(1)
{
t = *(volatile ushort *)BaseFlash+0x100;
if((t&0x40)==(d&0x40))
break;
else
d = t;
}
return 0;
}
int iGetFlashStatus()
{
uchar d, t,i;
// 从任意地址读取数据
d = *(volatile ushort *)BaseFlash+0x100;
i = 10;
while(i--);
// 再次读取
t = *(volatile ushort *)BaseFlash+0x100;
if (d == t)
return 0;
if ((t & 0x40) != (d & 0x40)) //DQ6
{
if (t & 0x20) //DQ5
{
return -3;//超时
}
else if ((t & 0x04) != (d & 0x04)) //DQ2
{
return -1;//忙
}
return -2;//挂起
}
else if (t & 0x80) // DQ7
{
return -2;//挂起
}
else
return -1; //忙
}
int iFlashReset(void)
{
int iWait;//超时计数
//写入复位命令
*((volatile ushort *)(BaseFlash+0x200)) = 0xF0;
/*iWait = 500000;//超时计数
while(iWait)//检测FLASH状态,若准备好进行下一步操作则退出循环
{
iWait--;
if(iGetFlashStatus() == 0)
{
break;
}
}
//判断是否正确执行操作
if(iWait > 0)
{
//操作正确完成,返回0
return 0;
}
else
{
//操作没有正确执行,返回(-1)
return (-1);
}*/
WaitForEnd();
return 0;
}
int iGetFlashID()
{
int id;
WriteFlash(0x555,0xAA);
WriteFlash(0x2AA,0x55);
WriteFlash(0x555,0x90);
// 获取ID
id = ReadFlash(0x01);
return id;
}
int WriteWord(UINT32 addr,UINT16 dat)
{
WriteFlash(0x555,0xAA);
WriteFlash(0x2AA,0x55);
WriteFlash(0x555,0xA0);
// 写数据
WriteFlash(addr,dat);
if( WaitForEnd() < 0 )
{
vUartPrintf("Write Err!\n");
return -1;
}
if( iFlashReset() < 0 )
{
vUartPrintf("Write Reset Err!\n");
return -1;
}
return 0;
}
int EraseSector(UINT32 addr)
{
WriteFlash(0x555,0xAA);
WriteFlash(0x2AA,0x55);
WriteFlash(0x555,0x80);
WriteFlash(0x555,0xAA);
WriteFlash(0x2AA,0x55);
WriteFlash(addr,0x30);
if( WaitForEnd() < 0 )
{
vUartPrintf("Erase Err!\n");
return -1;
}
//复位
if( iFlashReset() < 0 )
{
vUartPrintf("Erase Reset Err!\n");
return -1;
}
return 0;
}
void TestFlash()
{
int i;
UINT16 temp;
if( EraseSector(0x0) <0 )
{
vUartPrintf("Sector erase Err!\n");
return;
}
vUartPrintf("Sector erase Ok!\n");
for(i=0;i<256;i++)
{
if(WriteWord(i,0x55AA) == 0)
{
SLEEP(1);
}
else
{
vUartPrintf("adr=%d,Write Error\n",i);
return;
}
}
vUartPrintf("Write OK! Begin to Verify... \n");
for(i=0;i<256;i++)
{
temp = ReadFlash(i);
if(temp!= 0x55AA)
{
vUartPrintf("ADR=%4d,TEMP = %4x Verify Error!\n",i,temp);
//break;
return;
}
}
vUartPrintf("Verify OK!\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -