📄 nand_flash_test.c
字号:
/*********************************************************************************************
* File: nand_flash_test.c
* Author: lirui
* Desc: nand flash test file
* History:
*********************************************************************************************/
/*------------------------------------------------------------------------------------------*/
/* include files */
/*------------------------------------------------------------------------------------------*/
#include "2410lib.h"
#define NAND_CE (0x1<<22)
#define NAND_RE (0x1<<20)
#define NAND_WE (0x1<<19)
#define NAND_ALE (0x1<<18)
#define NAND_CLE (0x1<<17)
#define Fail 0
#define OK 1
#define BUSY 0x1
#define NAND_SECTOR_SIZE 528
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
/*------------------------------------------------------------------------------------------*/
/* external varibles and functions */
/*------------------------------------------------------------------------------------------*/
static void Nand_Init(void);
static void Nand_Reset(void);
static void Wait_Idle(void);
static void Nand_Read(char * , unsigned int , unsigned int );
static int Nand_Write(char *, unsigned int , unsigned int );
static UINT8T Nand_Erase(unsigned int );
static UINT16T Read_Nand_ID(void);
UINT16T RxID;
//unsigned char *RxBuf;
char RxBuf[NAND_SECTOR_SIZE*2];
char WriteBuf[NAND_SECTOR_SIZE*2];
//unsigned char *WxBuf;
/*********************************************************************************************
* name: nand_flash_test
* func: nand_flash_test function
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
void nand_flash_test(void)
{
int i=0;
for(;i< 128;i++)
{
WriteBuf[i]=i;
}
char *mybuf="my NAND Flash test";
// uart_printf(" The words that SPI0 transmit are:\n");
Nand_Init();
RxID=Read_Nand_ID();
uart_printf(" %x\n",RxID);
Nand_Read(RxBuf, 0,0);
uart_printf(" %s\n",RxBuf);
Nand_Erase(400);
Nand_Write(WriteBuf, 400, 0);
Nand_Read(RxBuf, 400, 0);
uart_printf(" %s\n",RxBuf);
// uart_printf(" %d\n",RxData[0]);
uart_printf(" %s\n",mybuf);
}
static void Nand_Init(void)
{
rNFCONF = 0xf830;//enable NAND Flash,init ECC,nFCE=1,TACLS=0,TWRPH0=3,TWRPH1=0
Nand_Reset();
}
static void Nand_Reset(void)
{
int i=0;
rNFCONF &=(~(1<<11));
for(;i<10;i++);
rNFCMD=0xff;
Wait_Idle();
}
static void Wait_Idle(void)
{
int i=0;
while(!(rNFSTAT&BUSY));
for(;i<10;i++);
}
/* erase block */
static UINT8T Nand_Erase(unsigned int block)
{
unsigned int blockPage=(block<<5);
rNFCONF &= ~0x800; //not initial the Ecc
rNFCMD = 0x60;
rNFADDR = blockPage&0xff;
rNFADDR = (blockPage>>8)&0xff;
rNFCMD = 0xd0;
Wait_Idle();
rNFCMD = 0x70;
if(rNFDATA&0x1)
{
rNFCONF |= (1<<11);
return Fail;
}
else
{
rNFCONF |= (1<<11);
return OK;
}
}
/* read NAND Flash ID maker code=EC,device code=75*/
static UINT16T Read_Nand_ID(void)
{
UINT16T id;
rNFCONF &= (~0x800);
rNFCMD = 0x90;
rNFADDR = 0;
Wait_Idle();
id = rNFDATA;
Wait_Idle();
id = (id<<8)+rNFDATA;
rNFCONF |=0x800;
return id;
}
/* NAND Flash Read ,mode 1*/
static void Nand_Read(char *buf, unsigned int block,unsigned int page)
{
int j;
unsigned int blockPage = (block<<5)+page;
/* if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))
{
return;
}
*/
rNFCONF &= ~0x800;
rNFCMD = 0;
rNFADDR = 0;
rNFADDR = blockPage & 0xff;
rNFADDR = (blockPage>>8) & 0xff;
// rNFADDR = (i >> 25) & 0xff;
Wait_Idle();
for(j=0; j < 128;j++)
{
*buf++ = (rNFDATA & 0xff);
}
/* chip disable*/
rNFCONF |= (1<<11);
}
/* NAND Flash write */
static int Nand_Write(char *buf, unsigned int block,unsigned int page)
{
int i,j;
unsigned int blockPage = (block<<5)+page;
UINT8T *source;
source = buf;
rNFCONF &= ~0x800;
rNFCMD = 0x80;
for(i=0;i<10;i++);
rNFADDR = 0;
rNFADDR = blockPage & 0xff;
rNFADDR = (blockPage>>8) & 0xff;
// rNFADDR = (i >> 25) & 0xff;
for(i=0;i<3;i++);
for(j=0; j < 128;j++)
{
rNFDATA = (*buf);
uart_printf(" %c\n",*buf);
uart_printf(" %c\n", (rNFDATA&0xff));
buf++;
}
for(i=0;i<3;i++);
rNFCMD = 0x10;
for(i=0;i<3;i++);
Wait_Idle();
for(i=0;i<3;i++);
rNFCMD = 0x10;
for(i=0;i<3;i++);
if(rNFDATA&0x1)
{
rNFCONF |= (1<<11);
return Fail;
}
else
{
rNFCONF |= (1<<11);
return OK;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -