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

📄 nandflash.c

📁 一个linux下的usb接口源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -