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

📄 39vf160.c

📁 原创
💻 C
字号:
/* meterchen 39vf160 program */
/* include: erase,program, read id*/

#include "stdafx.h"

#include <stdio.h>
#include "pin4510.h"
#include "Jtag.h"

#define FLASH_WRITE			(short)0xA0A0
#define FLASH_ERASE_CHIP	(short)0x1010
#define FLASH_ERASE_SECTOR	(short)0x3030
#define FLASH_RESET			(short)0xF0F0

/* sector address */
U32 secaddr[2*1024/4];

void S4510_Assert_nGCS(U32 addr)
{  
	if(addr<0x2000000)
		S4510_SetPin(nRCS0 ,LOW);
}

void S4510_Deassert_nGCS(U32 addr)
{
    if(addr<0x2000000)
		S4510_SetPin(nRCS0 ,HIGH);
}

/* write a half word to the address */
void NOR_WrHW(U32 addr,U16 data)
{
    S4510_SetPin(DATA0_31_CON ,LOW); 
    S4510_SetAddr(addr);
    S4510_Assert_nGCS(addr);

    S4510_SetDataHW(data);
    JTAG_ShiftDRStateNoTdo(outCellValue); //tCOS

    S4510_SetPin(nWBE0,LOW);
    JTAG_ShiftDRStateNoTdo(outCellValue); 

    S4510_SetPin(nWBE0,HIGH);
    JTAG_ShiftDRStateNoTdo(outCellValue); //tCOH

    S4510_SetPin(DATA0_31_CON ,HIGH); //nBE is deasserted here.
 
    S4510_Deassert_nGCS(addr);
    JTAG_ShiftDRStateNoTdo(outCellValue); 
}

short NOR_RdHW(U32 addr)
{
	S4510_SetPin(DATA0_31_CON ,HIGH); 

    S4510_SetAddr(addr);
    S4510_Assert_nGCS(addr);
    S4510_SetPin(nOE,LOW); 

    JTAG_ShiftDRStateNoTdo(outCellValue); 
    
    S4510_SetPin(nOE,HIGH);
    S4510_Deassert_nGCS(addr);

    JTAG_ShiftDRState(outCellValue,inCellValue); 
   // return S4510_GetDataHW();
	return S4510_GetDataByte();
}

void NOR_WAITRB(void)
{
	/*
	while(1)
	{
		JTAG_ShiftDRState(outCellValue,inCellValue);
		if( S4510_GetPin(GPF6)==HIGH)break;
	}
	*/
	
	// Check if the bit6 toggle ends.
    volatile U16 flashStatus,old;

	old = NOR_RdHW(0x0);

    while(1)
	{
	    flashStatus = NOR_RdHW(0x0);
        if( (old&0x40) == (flashStatus&0x40) )
			break;
        
		// Check bit5 fot timeout
		/*
		if( flashStatus&0x20 )
	    {
			old = NOR_RdHW(0x0);
			flashStatus = NOR_RdHW(0x0);
			if( (old&0x40) == (flashStatus&0x40) )
				return 0;
			else 
				return 1;
		}
		*/
		old = flashStatus;
	}

	return 1;
}

void NOR_Reset(void)
{
	//NOR_WrHW(0, FLASH_RESET);
}

void NOR_EraseSector(int sec)
{
	NOR_Reset();
	/* 6 write cycles */
	NOR_WrHW(0x5555, 0xAAAA);
	NOR_WrHW(0x2AAA, 0x5555);
	NOR_WrHW(0x5555, 0x8080);
	NOR_WrHW(0x5555, 0xAAAA);
	NOR_WrHW(0x2AAA, 0x5555);
	NOR_WrHW(secaddr[sec]>>1, FLASH_ERASE_SECTOR);
	
	/* wait for finishing */
	NOR_WAITRB();
	//while(!(rPDATC&0x4));	//gpc2 = r/b
	//NOR_Reset();
}

void NOR_EraseChip(void)
{
	NOR_Reset();
	/* 6 write cycles */
	NOR_WrHW(0x5555, 0xAAAA);
	NOR_WrHW(0x2AAA, 0x5555);
	NOR_WrHW(0x5555, 0x8080);
	NOR_WrHW(0x5555, 0xAAAA);
	NOR_WrHW(0x2AAA, 0x5555);
	
	NOR_WrHW(0x5555, FLASH_ERASE_CHIP);
	
	/* wait for finishing */
	NOR_WAITRB();
	//while(!(rPDATC&0x4));	//gpc2 = r/b
	//NOR_Reset();
}

void NOR_Program(U32 addr, char *data, int len)
{
	int i;

	for(i=0; i<len/2; i++)
	 {
	 	NOR_Reset();
	 	/* first 3 cycles */
		NOR_WrHW(0x5555, 0xAAAA);
	 	NOR_WrHW(0x2AAA, 0x5555);
		NOR_WrHW(0x5555, 0xA0A0);
				
		/* write begin */
	 	NOR_WrHW(addr>>1, *(short *)data);
	 	addr += 2;
	 	data += 2;
	 	
	 	/* wait for finishing */
	 	//while(!(rPDATC&0x4));	//gpc2 = r/b
		NOR_WAITRB();
	 	//NOR_Reset();
	 }
}

int NOR_ReadId(void)
{
	short vid, pid;
	
	 /* first 3 cycles */
	NOR_WrHW(0xaaa, 0xAA);
	NOR_WrHW(0x555, 0x55);
	NOR_WrHW(0xaaa, 0x90);

	vid = NOR_RdHW(0);
	pid = NOR_RdHW(2);

	/* ID exit */
//	NOR_WrHW(0x5555, 0xAAAA);
//	NOR_WrHW(0x2AAA, 0x5555);
//	NOR_WrHW(0x5555, 0xF0F0);
//	NOR_Reset();

	return((vid<<16)|pid);
}

int NOR_GetSecs(U32 size)
{
	int cnt=0;

	while(size > secaddr[cnt++]);

	return cnt-1;
}

void NOR_Init(void)
{
	int i;

	for(i=0; i<2*1024/4; i++)
		secaddr[i] = 0+i*4*1024;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -