📄 39vf160.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 + -