⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sst39vf160.c

📁 s3c4510B开发板使用JTAG接口对Flash编程的VC6• 0源代码
💻 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 + -