|
/****************************************************************************
*
*文件名:FLASH.c
*
*功 能:对和FLASH操作相关的变量、函数进行定义
*
*作 者: likyo from hellodsp
*
****************************************************************************/
#include "DSP28_Device.h"
// SST 39VF400A 部分的定义
//#define SST_ID 0x00BF /* SST Manufacturer's ID code */
//#define SST_39VF800A 0x2781 /* SST39VF400/SST39VF800A device code */
#define TimeOutErr 1
#define VerifyErr 2
#define WriteOK 0
#define EraseErr 3
#define EraseOK 0
#define SectorSize 0x800///扇区大小
#define BlockSize 0x8000//块大小
unsigned int *FlashStart = (unsigned int *)0x80000;/////外部FLASH地址
unsigned int *ExRamStart = (unsigned int *)0x100000;////外部RAM地址
Uint16 SectorErase(Uint16 SectorNum);
Uint16 BlockErase(Uint16 BlockNum);
Uint16 ChipErase(void);
Uint16 FlashWrite(Uint32 RamStart, Uint32 RomStart, Uint16 Length);
void FlashRead(Uint32 RamStart, Uint32 RomStart, Uint16 Length);
void InitExRam(Uint16 Start);
void InitExRam(Uint16 Start);
void RamRead(Uint16 Start);
/****************************************************************************
*
*名 称:SectorErase
*
*功 能:扇区擦除函数
*
*入口参数:Uint16 SectorNum
*
*出口参数:Uint16
*
****************************************************************************/
Uint16 SectorErase(Uint16 SectorNum)
{
Uint16 i,Data;
Uint32 TimeOut;
*(FlashStart + 0x5555) = 0xAA;
*(FlashStart + 0x2AAA) = 0x55;
*(FlashStart + 0x5555) = 0x80;
*(FlashStart + 0x5555) = 0xAA;
*(FlashStart + 0x2AAA) = 0x55;
*(FlashStart + SectorSize * SectorNum) = 0x30;
i = 0;
TimeOut = 0;
while(i<5)
{
Data = *(FlashStart + SectorSize * (SectorNum + 1) -1);
if (Data == 0xFFFF)
{
i++;
}
else
{
i=0;
}
if ( ++TimeOut>0x1000000)
{
return (TimeOutErr);
}
}
for (i=0;i<SectorSize;i++)
{
Data = *(FlashStart + SectorSize * SectorNum +i);
if (Data !=0xFFFF)
{
return (EraseErr);
}
}
return (EraseOK);
}
/****************************************************************************
*
*名 称:BlockErase
*
*功 能:扇区擦除函数
*
*入口参数:Uint16 BlockNum
*
*出口参数:Uint16
*
****************************************************************************/
Uint16 BlockErase(Uint16 BlockNum)
{
Uint16 i,Data;
Uint32 TimeOut;
*(FlashStart + 0x5555) = 0xAA;
*(FlashStart + 0x2AAA) = 0x55;
*(FlashStart + 0x5555) = 0x80;
*(FlashStart + 0x5555) = 0xAA;
*(FlashStart + 0x2AAA) = 0x55;
*(FlashStart + BlockSize * BlockNum + 1) = 0x50;
i = 0;
TimeOut = 0;
while(i<5)
{
Data = *(FlashStart + BlockSize * (BlockNum +1));
if(Data == 0xFFFF)
{
i++;
}
else
{
i=0;
}
if ( ++TimeOut>0x1000000)
{
return (TimeOutErr);
}
}
for(i=0;i<SectorSize;i++)
{
Data = *(FlashStart + BlockSize * BlockNum +i);
if (Data !=0xFFFF)
{
return (EraseErr);
}
}
return (EraseOK);
}
/****************************************************************************
*
*名 称:ChipErase
*
*功 能:片擦除函数
*
*入口参数:无
*
*出口参数:Uint16
*
****************************************************************************/
Uint16 ChipErase(void)
{
Uint32 i,Data; //要定义为32位
Uint32 TimeOut;
*(FlashStart + 0x5555) = 0xAAAA;
*(FlashStart + 0x2AAA) = 0x5555;
*(FlashStart + 0x5555) = 0x8080;
*(FlashStart + 0x5555) = 0xAAAA;
*(FlashStart + 0x2AAA) = 0x5555;
*(FlashStart + 0x5555) = 0x1010;
i = 0;
TimeOut = 0;
while(i<5)
{
Data = *(FlashStart + 0x3FFFF);
if(Data == 0xFFFF)
{
i++;
}
else
{
i=0;
}
if( ++TimeOut>0x1000000)
{
return (TimeOutErr);
}
}
for (i=0;i<0x80000;i++) //共256K Words
{
Data = *(FlashStart + i);
if (Data !=0xFFFF)
{
return (EraseErr);
}
}
return (EraseOK);
}
/****************************************************************************
*
*名 称:FlashWrite
*
*功 能:对Flash进行写操作函数,将RAM中指定区域的数据拷贝到FLASH的指定区域中
*
*入口参数:Uint32 RamStart, Uint32 RomStart, Uint16 Length
*
*出口参数:Uint16
*
****************************************************************************/
Uint16 FlashWrite(Uint32 RamStart, Uint32 RomStart, Uint16 Length)
{
Uint32 i,TimeOut;
Uint16 Data1,Data2,j;
for (i=0;i<Length;i++)
{
*(FlashStart + 0x5555) = 0xAA;
*(FlashStart + 0x2AAA) = 0x55;
*(FlashStart + 0x5555) = 0xA0;
*(FlashStart + RomStart + i) = *(ExRamStart + RamStart + i);
TimeOut = 0;
j=0;
while(j<5)
{
Data1 = *(FlashStart + RomStart + i);
Data2 = *(FlashStart + RomStart + i);
if(Data1 == Data2)
{
j++;
}
else
{
j=0;
}
if (++TimeOut>0x1000000)
{
return (TimeOutErr);
}
}
}
for (i=0;i<Length;i++)
{
Data1 = *(FlashStart + RomStart +i);
Data2 = *(ExRamStart + RamStart +i);
if (Data1 != Data2)
{
return (VerifyErr);
}
}
return (WriteOK);
}
/****************************************************************************
*
*名 称:FlashRead
*
*功 能:对Flash进行读操作函数,将Flash中指定区域的数据读取到Ram的指定区域中
*
*入口参数:Uint32 RamStart, Uint32 RomStart, Uint16 Length
*
*出口参数:无
*
****************************************************************************/
void FlashRead(Uint32 RamStart, Uint32 RomStart, Uint16 Length)
{
Uint32 i;
Uint16 Temp;
for(i=0;i<Length;i++)
{
Temp = *(FlashStart + RomStart +i);
*(ExRamStart + RamStart +i) = Temp;
}
}
/****************************************************************************
*
*名 称:InitExRam()
*
*功 能:往外部RAM中写数据,随地址不断加1,长度为16K
*
*入口参数:Uint16 Start 此参数规定了从外扩RAM区域的第Start个存储空间开始写数据
*
*出口参数:无
*
*****************************************************************************/
void InitExRam(Uint16 Start)
{
Uint16 i;
for(i=0;i<0x4000;i++)
{
*(ExRamStart + Start + i) = i;
}
}
/****************************************************************************
*
*名 称:InitExRam1()
*
*功 能:对外部RAM的指定区域的存储空间进行清0操作
*
*入口参数:Uint16 Start 此参数规定了从外扩RAM区域的第Start个存储空间开始清0
*
*出口参数:无
*
*****************************************************************************/
void InitExRam1(Uint16 Start)
{
Uint16 i;
for (i=0;i<0x4000;i++)
{
*(ExRamStart + Start + i) = 0;
}
}
/****************************************************************************
*
*名 称:RamRead()
*
*功 能:读取外部RAM空间的数据
*
*入口参数:Uint16 Start 此参数规定了从外扩RAM区域的第Start个存储空间开始读取
*
*出口参数:无
*
*****************************************************************************/
void RamRead(Uint16 Start)/////读取外部RAM函数
{
Uint16 i;
for (i=0;i<0x4000;i++)
{
*(ExRamStart + Start + i) = *(ExRamStart +i);
}
}
//===========================================================================
// No more.
//===========================================================================
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|