📄 nandflash.c
字号:
#define __REF_NANDFLASH__
#include <stdio.h>
#include "datatype.h"
#include "MC68VZ328.h"
#include "nandflash.h"
void InitNandFlashPin(void);
UCHAR InitNandFlash(void);
void ResetNandFlash(void);
UWORD ReadID(void);
UCHAR ReadStatus(void);
UCHAR EraseBlock(ULONG);
UCHAR ProgramSector(UCHAR *, ULONG, UWORD);
void EraseNandFlash(void);
UCHAR WriteSector1(UCHAR *, ULONG , UWORD);//武东宏添加
//void WriteSector1(UCHAR *, ULONG , UWORD);//武东宏添加
UCHAR ReadSector1(UCHAR *, ULONG, UWORD);
void InitNandFlashPin(void)
{
// Initialize I/O pins
PDSEL |= 0x0F;
PDDIR = PDSEL & 0xF0 | 0x0B;
NANDFLASH_DISABLE();
CMD_LATCH_DISABLE();
ADD_LATCH_DISABLE();
}
UCHAR InitNandFlash(void)
{
UCHAR buf[512];
UCHAR Status = 0;
InitNandFlashPin();
NANDFLASH_ENABLE();
ResetNandFlash();
NANDFLASH_DISABLE();
return Status;
}
UCHAR ReadSector1(UCHAR *buf, ULONG startsector, UWORD sectornum)
{
UWORD i, j, k;
UCHAR ADD2, ADD3,t;
UCHAR Status;
ADD3 = (UCHAR)(startsector>>8);
ADD2 = (UCHAR)startsector;
NANDFLASH_ENABLE();
//ResetNandFlash();
//CMD_LATCH_ENABLE();
WRITE_CMD(READ1_CMD);
//CMD_LATCH_DISABLE();
ADD_LATCH_ENABLE();
WRITE_BYTE(0);
WRITE_BYTE(ADD2);
WRITE_BYTE(ADD3);
ADD_LATCH_DISABLE();
for(i=0; i<sectornum; i++)
{
while(!NANDFLASH_READY());
for(j=0; j<512; j++)
{
*buf++ = READ_BYTE();
}
for(k=0;k<16;k++)
{
t=READ_BYTE();
}
}
NANDFLASH_DISABLE();
return NOERR;
}
void ResetNandFlash(void) //Reset Flash
{
UWORD i;
WRITE_CMD(RESET_CMD);
while(!NANDFLASH_READY());
}
UWORD ReadID(void)
{
UWORD ID = 0;
NANDFLASH_ENABLE();
WRITE_CMD(READ_ID_CMD);
ADD_LATCH_ENABLE();
WRITE_BYTE(0);
WRITE_BYTE(0);
ADD_LATCH_DISABLE();
ID = READ_BYTE()<<8;
ID += READ_BYTE();
NANDFLASH_DISABLE();
return ID;
}
UCHAR ReadStatus(void)
{
UCHAR Status = 0;
WRITE_CMD(READ_STATUS_CMD);
Status = READ_BYTE();
return Status&0x01;
}
UCHAR EraseBlock(ULONG block)
{
UCHAR ADD3, ADD2;
ULONG startsector = block*(SECTOR_PER_BLOCK);
ADD3=(UCHAR)(startsector>>8);
ADD2=(UCHAR)startsector;
NANDFLASH_ENABLE();
WRITE_CMD(BLOCK_ERASE_CMD);
ADD_LATCH_ENABLE();
WRITE_BYTE(ADD2);
WRITE_BYTE(ADD3);
ADD_LATCH_DISABLE();
//CMD_LATCH_ENABLE();
WRITE_CMD(BLOCK_ERASE_CONFIRM_CMD);
//CMD_LATCH_DISABLE();
while(!NANDFLASH_READY());
NANDFLASH_DISABLE();
return ReadStatus();
}
UCHAR ProgramSector(UCHAR *buf, ULONG startsector, UWORD sectornum)
{
UWORD i, j;
UCHAR ADD2, ADD3;
UCHAR Status = 0;
unsigned long tep = (unsigned long)buf;
NANDFLASH_ENABLE();
for (i=0; i<sectornum; i++)
{
// ADD3 = (UCHAR)(startsector>>8);
// ADD2 = (UCHAR)startsector;
WRITE_CMD(SDATA_INPUT_CMD);
ADD_LATCH_ENABLE();
WRITE_BYTE(0);
WRITE_BYTE((UCHAR)startsector);
WRITE_BYTE((UCHAR)(startsector>>8));
startsector++;
ADD_LATCH_DISABLE();
for(j=0; j<512; j++)
{
WRITE_BYTE(*buf++);
}
/*
asm(
clr d5
move.w #512,d5
move.w tep,a5
);
top:
asm(
move.b (a1)+,0x1200060
sub.l #1,d5
bne top
);
*/
WRITE_CMD(PAGE_PROGRAM_CMD);
while(!NANDFLASH_READY());
if((Status = ReadStatus()) == PROGRAM_ERROR)
{
break;
}
}
NANDFLASH_DISABLE();
return Status;
}
/*
UCHAR ProgramSector(UCHAR *buf, ULONG startsector, UWORD sectornum)
{
UWORD i, j;
UCHAR ADD2, ADD3;
UCHAR Status = 0;
unsigned long tep = (unsigned long)buf;
NANDFLASH_ENABLE();
// for (i=0; i<sectornum; i++)
// {
asm(clr d3
clr d1
move.l sectornum,d3
move.l startsector,d1);
top1:
// ADD3 = (UCHAR)(startsector>>8);
// ADD2 = (UCHAR)startsector;
// WRITE_CMD(SDATA_INPUT_CMD);
asm(or.b #0x01,0xfffff419
move.b #0x80,0x1200060
and.b #0xfe,0xfffff419);
// ADD_LATCH_ENABLE();
asm(or.b #0x02,0xfffff419);
// WRITE_BYTE(0);
asm(move.b #0x0,0x1200060);
// WRITE_BYTE((UCHAR)startsector);
asm(move.b d1,0x1200060);
// WRITE_BYTE((UCHAR)(startsector>>8));
asm(move.l d1,d2
ror #0x08,d2
move.b d2,0x1200060);
// startsector++;
asm(add.b #1,d1);
// ADD_LATCH_DISABLE();
asm(and.b #0xfd,0x1200060);
asm(
clr d0
move.w #512,d0
move.w tep,a1
);
top:
asm(
move.b (a1)+,0x1200060
sub.l #1,d0
bne top
);
// WRITE_CMD(PAGE_PROGRAM_CMD);
asm(or.b #0x01,0xfffff419
move.b #0x10,0x1200060
and.b #0xfe,0xfffff419);
// while(!NANDFLASH_READY());
asm(
loop: move.b 0xfffff419,d0
and.b #0x04,d0
beq loop
);
asm(sub.b #0x01,d3
bne top1);
NANDFLASH_DISABLE();
return Status;
}
*/
void EraseNandFlash(void)
{
UWORD i;
for (i=0; i<BLOCK_NUM*2; i++)
{
EraseBlock(i);
}
}
UCHAR Tep_Buf1[512*32];
UCHAR Tep_Buf2[512*32];
/*UCHAR WriteSector1(UCHAR *buf, ULONG startsector, UWORD sectornum)//武东宏添加
{
ULONG blnum;
UWORD front_sector,back_secter,i;
UWORD front_block_th,back_block_th,bnum;
ULONG frontstart,backstart;
front_block_th = startsector/32;
back_block_th = (startsector+sectornum)/32;
bnum = back_block_th - front_block_th+1;
front_sector = startsector - front_block_th*32;
back_secter = (back_block_th+1)*32 - startsector - sectornum;
frontstart = startsector - front_sector;
backstart = startsector + sectornum;
ReadSector1(Tep_Buf1, frontstart, front_sector);
ReadSector1(Tep_Buf2, backstart, back_secter);
for(i=0;i<bnum;i++)
{
EraseBlock(front_block_th++);
}
ProgramSector(Tep_Buf1, frontstart, front_sector);
ProgramSector(Tep_Buf2, backstart, back_secter);
ProgramSector(buf, startsector, sectornum);
}
*/
UCHAR WriteSector1(UCHAR *buf, ULONG startsector, UWORD sectornum)//武东宏添加
{
ULONG blocknum;
UWORD front_sectornum,back_secternum,i;
UWORD begin_block,end_block;
ULONG front_startsector,back_startsector;
if(sectornum>0)
{
begin_block = startsector/32;
end_block = (startsector+sectornum-1)/32;
blocknum = end_block - begin_block+1;
front_sectornum = startsector - begin_block*32;
back_secternum = (end_block+1)*32 - startsector - sectornum;
front_startsector = startsector - front_sectornum;
back_startsector = startsector + sectornum;
if(front_sectornum>0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -