📄 sst39vf160.c
字号:
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include "s3c4510.h"
#include "sst39vf160.h"
#include "sst28sf040.h"
int Check_SST_39VF160(void)
{
WORD SST_id1;
WORD SST_id2;
int ReturnStatus;
write_rom2( SST39_CMD_ADDRESS1, SST39_READ_ID1);
write_rom2( SST39_CMD_ADDRESS2, SST39_READ_ID2);
write_rom2( SST39_CMD_ADDRESS1, SST39_READ_ID3);
access_bus2(HOLD, SST39_CMD_ADDRESS1, SST39_READ_ID2, IP);
SST_id1 = read_rom2(0x00000000);
SST_id2 = read_rom2(0x00000001);
if ((SST_id1 == SST_ID) && (SST_id2 == SST_39VF160))
ReturnStatus = 0;
else
ReturnStatus = -1;
write_rom2( SST39_CMD_ADDRESS1, SST39_READ_ID1);
write_rom2( SST39_CMD_ADDRESS2, SST39_READ_ID2); // exit get id
write_rom2( SST39_CMD_ADDRESS1, SST39_EXIT_READ_ID);
return(ReturnStatus);
}
int Read_39VF160(FILE* stream, DWORD Src,DWORD size)
{
int i,count;
DWORD SrcReadAddress = Src;
WORD wTemp; // 16 bit access
if( NULL == stream )
return -1;
fseek( stream,0,SEEK_SET );
count = 0;
for( i = 1; i <= (int)(size/sizeof(WORD)); i++ )
{
wTemp = read_rom2( SrcReadAddress++ );
printf("%.4x ",wTemp);
if( i%8 == 0 ) printf("\n");
fwrite((char*)&wTemp,sizeof(WORD),1,stream );
}
return 0;
}
int Write_39VF160(unsigned char *Src, DWORD Dst)
{
WORD *SourceBuf;
DWORD DestBuf;
DWORD DestSector;
int Index;
int Count;
WORD SourceWord;
unsigned char Continue;
/************************************************************************************/
/* ERASE OPERATION */
/* */
/************************************************************************************/
DestSector = Dst;
Sleep(30);
write_rom2( SST39_CMD_ADDRESS1, SST39_AUTO_PG_ERASE1);
write_rom2( SST39_CMD_ADDRESS2, SST39_AUTO_PG_ERASE2);
write_rom2( SST39_CMD_ADDRESS1, SST39_AUTO_PG_ERASE3);
write_rom2( SST39_CMD_ADDRESS1, SST39_AUTO_PG_ERASE4);
write_rom2( SST39_CMD_ADDRESS2, SST39_AUTO_PG_ERASE5);
printf("Erasing the sector 0x%.8x ...",DestSector);
write_rom2( DestSector, SST39_AUTO_PG_ERASE6);
printf("Done.\n");
Count = 0;
Continue = TRUE;
/***********************************************************************************/
/* PROGRAM OPERATION */
/* */
/***********************************************************************************/
SourceBuf = (WORD*)Src;
DestBuf = Dst;
SST39Check_Toggle_Ready(DestBuf);
for (Index = 0; Index < (SST39_ROW_SIZE/sizeof(WORD)); Index++)
{
SourceWord = *SourceBuf++;
if (SourceWord != 0xFFFF) /* If the data is 0xFF, don,t program it*/
{
write_rom2(SST39_CMD_ADDRESS1, SST39_AUTO_PGRM1);
write_rom2(SST39_CMD_ADDRESS2, SST39_AUTO_PGRM2);
write_rom2(SST39_CMD_ADDRESS1, SST39_AUTO_PGRM3);
write_rom2(DestBuf,SourceWord); /* program the data */
//SST39Check_Toggle_Ready(DestBuf);
/* wait for Toggle bit ready */
//ProgrammedByte = read_rom(DestBuf); /* read back the data pragrammed */
//if (SourceByte != ProgrammedByte)
//{
// Continue = FALSE;
// break;
//}
}
DestBuf++;
}
if (!Continue)
return(TRUE); /* return with error */
else
return(FALSE); /* return with NO error */
}
void SST39Check_Toggle_Ready(DWORD Dst)
{
unsigned char Loop = TRUE;
WORD PreData;
WORD CurrData;
unsigned long TimeOut = 0;
PreData = read_rom2(Dst);
PreData = PreData & 0x4040;
while ((TimeOut< 0x7FFFFFFF) && (Loop))
{
CurrData = read_rom2(Dst);
CurrData = CurrData & 0x4040;
if (PreData == CurrData)
Loop = FALSE; /* ready to exit the while loop */
PreData = CurrData;
TimeOut++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -