📄 39vf400.c.bak
字号:
#include "typedef.h"
#include "f2407regs_c.h"
#include "global.h"
extern uint cfgdata[128];
extern uchar pcdata[Len];
void readOneCfg(uint loc);
uint writeOneCfg(uint loc);
uint writeOneDefaultCfg(uint loc);
uint writeAllCfg(void);
void readAllCfg(void);
uint Check_SST_39VF400A();
uint CFI_Query();
uint Erase_One_Sector (uint *Dst);
uint Erase_One_Block (uint *Dst);
uint Erase_Entire_Chip();
uint Program_One_Word (uint SrcWord, uint *Dst);
uint Program_One_Sector (uint *Src, uint *Dst);
uint Program_One_Block (uint *Src, uint *Dst);
uint Check_Toggle_Ready (uint *Dst);
uint Check_Toggle_Ready (uint *Dst);
void Check_Data_Polling (uint *Dst, uint TrueData);
void Delay_150_Nano_Seconds();
#define FALSE 0
#define TRUE 1
#define BaseAddr 0x8000
#define SECTOR_SIZE 2048 // Must be 2048 words for 39VF400A
#define BLOCK_SIZE 32768 //Must be 32K words for 39VF400A
#define SST_ID 0x00BF // SST Manufacturer's ID code
#define SST_39VF400A 0x2780 // SST39VF400A device code same device code as SST39VF400
/* 1 :success, 0: failed */
void Delay_150_Nano_Seconds()
{
}
uint Check_SST_39VF400A() // same device code as SST39VF400
{
uint *Temp;
uint *Temp1;
uint SST_id1;
uint SST_id2;
uint ReturnStatus;
cs_flash_0;
Temp1 = (uint *)(BaseAddr+0x5555); //address 5555h
*Temp1= 0xAA; // write 0xAAAA
Temp1 = (uint *)(BaseAddr+0x2AAA); //address 2AAAh
*Temp1= 0x55; // write 0x5555
Temp1 = (uint *)(BaseAddr+0x5555); //address 5555h
*Temp1= 0x90; // write 0x9090
Delay_150_Nano_Seconds(); //delay Tida
Temp = (uint *)(BaseAddr+0x0000); //address 0000h
SST_id1 = *Temp; // get first ID word
Temp1 = (uint *)(BaseAddr+0x0001); //address 0001h
SST_id2 = *Temp1; // get second ID word
if ( ((SST_id1&0xff) == SST_ID) && (SST_id2 ==SST_39VF400A))ReturnStatus = TRUE;
else ReturnStatus = FALSE;
Temp1 = (uint *)(BaseAddr+0x5555); //address 5555h
*Temp1 = 0xAAAA; // 0xAAAA
Temp1 = (uint *)(BaseAddr+0x2AAA); //address 2AAAh
*Temp1 = 0x5555; //0x5555
Temp1 = (uint *)(BaseAddr+0x5555); //address 5555h
*Temp1 = 0xF0F0; //0xF0F0
Delay_150_Nano_Seconds(); //delay Tida
cs_flash_1;
return(ReturnStatus);
}
#ifdef PROMATIC
uint CFI_Query()
{
uint *Temp1;
cs_flash_0;
Temp1 = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp1= 0xAAAA; // write data 0xAAAA to the address
Temp1 = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp1= 0x5555; // write data 0x5555 to the address
Temp1 = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp1= 0x9898; // write data 0x9898 to the address
Delay_150_Nano_Seconds(); // insert delay time = Tida
Temp1 = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp1 = 0xAAAA; // write data 0xAAAA to the address
Temp1 = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp1 = 0x5555; // write data 0x5555 to the address
Temp1 = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp1 = 0xF0F0; // write data 0xF0F0 to the address
Delay_150_Nano_Seconds(); // insert delay time = Tida
cs_flash_1;
return 1;
}
#endif
/* 1 : success; 0: failed */
uint Erase_One_Sector (uint *Dst)
{
uint *Temp;
uint flag = 1;
cs_flash_0;
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0xAAAA; // write data 0xAAAA to the address
Temp = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp = 0x5555; // write data 0x5555 to the address
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0x8080; // write data 0x8080 to the address
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0xAAAA; // write data 0xAAAA to the address
Temp = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp = 0x5555; // write data 0x5555 to the address
Temp = Dst; // set up starting address to be erased
*Temp = 0x3030; // write data 0x3030 to the address
flag = Check_Toggle_Ready(Temp);
cs_flash_1;
if(flag) return 1;
else return 0;
}
#ifdef PROMATIC
/* 1 : success; 0: failed */
uint Erase_One_Block (uint *Dst)
{
uint *Temp;
uint flag = 1;
cs_flash_0;
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0xAAAA; // write data 0xAAAA to the address
Temp = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp = 0x5555; // write data 0x5555 to the address
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0x8080; // write data 0x8080 to the address
Temp = (uint *)(BaseAddr+0x5555); //set up address to be C000:5555h
*Temp = 0xAAAA; // write data 0xAAAA to the address
Temp = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp = 0x5555; // write data 0x5555 to the address
Temp = Dst; // set up starting address to be erased
*Temp = 0x5050; // write data 0x5050 to the address
flag = Check_Toggle_Ready(Temp);
cs_flash_1;
if(flag) return 1;
else return 0;
}
#endif
#ifdef PROMATIC
/* 1 : success; 0: failed */
uint Erase_Entire_Chip()
{
uint *Temp;
uint flag = 1;
cs_flash_0;
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0xAAAA; // write data 0xAAAA to the address
Temp = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp = 0x5555; // write data 0x5555 to the address
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0x8080; // write data 0x8080 to the address
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0xAAAA; // write data 0xAAAA to the address
Temp = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp = 0x5555; // write data 0x5555 to the address
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0x1010; // write data 0x1010 to the address
flag = Check_Toggle_Ready(Temp);
cs_flash_1;
if(flag) return 1;
else return 0;
}
#endif
/* 1 : success; 0: failed */
uint Program_One_Word (uint SrcWord, uint *Dst)
{
uint *Temp;
uint *DestBuf;
uint flag = 1;
cs_flash_0;
DestBuf = Dst;
Temp = (uint *)(BaseAddr+0x5555); // address 555h
*Temp = 0xAAAA; // 0xAAAA
Temp = (uint *)(BaseAddr+0x2AAA); //address 2AAAh
*Temp = 0x5555; //0x5555
Temp = (uint *)(BaseAddr+0x5555); //address 5555h
*Temp = 0xA0A0; //0xA0A0
*DestBuf = SrcWord;
cs_flash_1;
flag = Check_Toggle_Ready(DestBuf); // wait for TOGGLE bit to get ready
if(flag) return 1;
else return 0;
}
#ifdef PROMATIC
uint Program_One_Sector (uint *Src, uint *Dst)
{
uint *Temp;
uint *SourceBuf;
uint *DestBuf;
int Index;
uint flag = 1;
SourceBuf = Src;
DestBuf = Dst;
Erase_One_Sector(Dst); // erase the sector first
for (Index = 0; Index < SECTOR_SIZE; Index++) //2048
{
cs_flash_0;
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:555h
*Temp = 0xAAAA; // write data 0xAAAA to the address
Temp = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp = 0x5555; // write data 0x5555 to the address
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0xA0A0; // write data 0xA0A0 to the address
Temp = DestBuf; // save the original Destination address
*DestBuf++ = *SourceBuf++; // transfer data from source to destination
cs_flash_1;
flag = Check_Toggle_Ready(Temp);
if(flag == 0) return 0; // failed
}
return 1; // success
}
#endif
#ifdef PROMATIC
uint Program_One_Block (uint *Src, uint *Dst)
{
uint *Temp;
uint *SourceBuf;
uint *DestBuf;
int Index;
uint flag = 1;
SourceBuf = Src;
DestBuf = Dst;
Erase_One_Block(Dst); // erase the sector first
for (Index = 0; Index < BLOCK_SIZE; Index++) //32768
{
cs_flash_0;
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:555h
*Temp = 0xAAAA; // write data 0xAAAA to the address
Temp = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh
*Temp = 0x5555; // write data 0x5555 to the address
Temp = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h
*Temp = 0xA0A0; // write data 0xA0A0 to the address
Temp = DestBuf; // save the original Destination address
*DestBuf++ = *SourceBuf++; // transfer data from source to destination
cs_flash_1;
flag = Check_Toggle_Ready(Temp);// wait for TOGGLE bit to get ready
if(flag == 0) return 0; // failed
}
return 1; // success
}
#endif
uint Check_Toggle_Ready (uint *Dst)
{
uchar Loop = TRUE;
uint PreData;
uint CurrData;
unsigned long TimeOut = 0;
cs_flash_0;
PreData = *Dst;
PreData = PreData & 0x4040;
while (Loop)
{
CurrData = *Dst;
CurrData = CurrData & 0x4040;
if (PreData == CurrData)
Loop = FALSE; /* ready to exit the while loop */
PreData = CurrData;
TimeOut++;
if(TimeOut >= 0x07FFFFFF)
{
cs_flash_1;
return 0; // failed
}
}
cs_flash_1;
return 1; // success
}
#ifdef PROMATIC
void Check_Data_Polling (uint *Dst, uint TrueData)
{
uchar Loop = TRUE;
uint CurrData;
unsigned long TimeOut = 0;
TrueData = TrueData & 0x8080;
while ((TimeOut< 0x07FFFFFF) && (Loop))
{
cs_flash_0;
feedWatchDog();
CurrData = *Dst;
CurrData = CurrData & 0x8080;
if (TrueData == CurrData)
{
cs_flash_1;
Loop = FALSE; /* ready to exit the while loop */
}
TimeOut++;
}
cs_flash_1;
}
#endif
/////////////////////////////////////////////////////
void readOneCfg(uint loc)
{
uint *temp;
uint i;
uint addr = 0x8000;
cs_flash_0;
for(i=0;i<8;i++)
{
temp = (uint *)(addr+loc*8+i);
cfgdata[loc*8+i] = *temp;
}
cs_flash_1;
}
/* 1: success, 0: failed*/
uint writeOneDefaultCfg(uint loc)
{
uint *temp;
uint i;
uint flag;
uint addr = 0x8000;
cs_flash_0;
for(i=0;i<112;i++)
{
cfgdata[i] = *( (uint *)(0x8000+i) );
} //将flash中数据cfg0~cfg13全部读出
cs_flash_1;
if(loc == 1) para1def();
else if(loc == 2) para2def();
else if(loc == 3) para3def();
else if(loc == 5) para5def();
else if(loc == 8) para8def();
else if(loc == 10) para10def();
else if(loc == 11) para11def();
else if(loc == 12) para12def();
else if(loc == 13) para13def(); //将要缺省配置的数据写进缓存
flag = Erase_One_Sector((uint*)0x8000);
if(flag == 0) return flag; //擦除一块2k字
addr = 0x8000;
for(i=0;i<112;i++)
{
flag = Program_One_Word (cfgdata[i], (uint *)addr);
if(flag == 0) return flag;
addr++;
} //对224字节编程
return 1;
}
/* 1: success, 0: failed*/
uint writeOneCfg(uint loc)
{
uint *temp;
uint i;
uint flag;
uint addr = 0x8000;
cs_flash_0;
for(i=0;i<112;i++)
{
cfgdata[i] = *( (uint *)(0x8000+i) );
} //将flash中数据cfg0~cfg13全部读出
cs_flash_1;
for(i=0;i<7;i++)cfgdata[loc*8+i] = 0;//先将要配置的数据清0
for(i=0;i<14;i++)
{
if(i%2==0)cfgdata[loc*8+i/2] |= pcdata[4+i]<<8;
else cfgdata[loc*8+i/2] |= pcdata[4+i];
} //将要改写的数据写入cfgdata
flag = Erase_One_Sector((uint*)0x8000);
if(flag == 0) return flag; //擦除一块2k字
addr = 0x8000;
for(i=0;i<112;i++)
{
flag = Program_One_Word (cfgdata[i], (uint *)addr);
if(flag == 0) return flag;
addr++;
} //对224字节编程
return 1;
}
/* 1: success, 0: failed*/
uint writeAllCfg( )
{
uint i;
uint flag;
uint addr = 0x8000;
flag = Erase_One_Sector((uint*)0x8000);
if(flag == 0) return flag; //擦除一块2k字
addr = 0x8000;
for(i=0;i<112;i++)
{
flag = Program_One_Word (cfgdata[i], (uint *)addr);
if(flag == 0) return flag;
addr++;
} //对224字节编程
return 1;
}
void readAllCfg(void)
{
uint i;
cs_flash_0;
for(i=0;i<112;i++)
{
cfgdata[i] = *( (uint*)(0x8000+i) );
}
cs_flash_1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -