📄 nand.c
字号:
#include "2440addr.h"
#include "nand.h"
#include "Uart.h"
void Nand_init(void) //initilaze nand flash
{
rGPACON &= ~((1<<22)|(0xf<<17));
rGPACON |= ((1<<22)|(0xf<<17));
//rNFCONF |= ((1<<12)|(2<<8)|(2<<4));
//rNFCONT &= ~((1<<12)|(7<<8)|(7<<4)|(3));
//rNFCONT |= ((1<<12)|(6<<8)|(0<<6)|(0<<5)|(1<<4)|(0<<1)|(1));
rNFCONF = ((1<<12)|(2<<8)|(2<<4));
rNFCONT = ((0<<12)|(6<<8)|(0<<6)|(0<<5)|(1<<4)|(0<<1)|(1));
}
void Test_Nand(void)
{
unsigned int i,j;
unsigned char data[512];
for(i=0;i<512;i++)
{
data[i] = i;
}
Nand_init();
Nand_checkID();
Nand_eraseBlock(4095);
Nand_writePage(4095,0,data);
Nand_readPage(4095,0,data);
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
Uart_Printf("%2x ",data[i*16+j]);
Uart_Printf("\n");
}
}
unsigned int Nand_checkID(void)
{
unsigned int tmp;
rNFCONT &= ~(1<<1); //take CE to low
rNFCMMD = 0x90; //Read ID Command
rNFADDR = 0x00; //Address. 1cycle
tmp = rNFDATA; //rNFDATA is char
Uart_Printf("the frist ID unmber is %x\n",tmp); //Read rNFDATA value
tmp = rNFDATA;
Uart_Printf("the second ID unmber is %x\n",tmp);
tmp = rNFDATA;
Uart_Printf("the third ID unmber is %x\n",tmp);
tmp = rNFDATA;
Uart_Printf("the fourth ID unmber is %x\n",tmp);
rNFCONT |= (1<<1); //take CE to high
}
unsigned int Nand_eraseBlock(unsigned int block)
{
int i;
unsigned int erase_data;
unsigned int addr;
addr = (block<<5);
rNFCONT &= ~(1<<1); //take CE to low
//rNFCONT |= (0<<1);
rNFCMMD = 0x60; //Auto Block Erase Setup Command
rNFADDR = (unsigned char)addr;
rNFADDR = (unsigned char)(addr>>8);
rNFADDR = (unsigned char)(addr>>16);
rNFCMMD = 0xd0; //Erase Command
for(i = 0; i<10; i++){}
while(!(rNFSTAT&0x01)); // RnB low to high transition
rNFCMMD = 0x70; //Read Status command
erase_data = rNFDATA;
if((erase_data&0x01) == 0x0){}
Uart_Printf("the erase unmber is %x\n",erase_data);
rNFCONT |= (1<<1); //take CE to high
}
unsigned int Nand_writePage(unsigned int block , unsigned int page ,unsigned char *buffer)
{
int i;
unsigned int write_addr;
rNFCONT &= ~(1<<1); //take CE to low
rNFCMMD = 0x80; //Sequential Data Input Command
rNFADDR = 0;
write_addr = (block<<5)|page;
rNFADDR = (unsigned char)write_addr;
rNFADDR = (unsigned char)(write_addr>>8);
rNFADDR = (unsigned char)(write_addr>>16);
for(i = 0; i<512; i++)
{
rNFDATA = *buffer; // 1 up to 512 byte data serial input
buffer++;
}
rNFCMMD = 0x10; // Program command
for(i = 0; i<10; i++){} // delay 10ns
while(!(rNFSTAT&0x01)); // RnB low to high transition
rNFCMMD = 0x70; //Read Status command
if((rNFDATA&0x01) == 0x0){}
Uart_Printf("the program unmber is %x\n",rNFDATA);
rNFCONT |= (1<<1); //take CE to high
}
unsigned int Nand_readPage(unsigned int block , unsigned int page ,unsigned char *buffer)
{
int i;
unsigned int write_addr;
write_addr = block;
rNFCONT &= ~(1<<1); //take CE to low
rNFCMMD = 0x00; //Sequential Data Input Command
rNFADDR = 0;
write_addr = (block<<5)|page;
rNFADDR = (unsigned char)write_addr;
rNFADDR = (unsigned char)(write_addr>>8);
rNFADDR = (unsigned char)(write_addr>>16);
for(i = 0; i<10; i++){}
while(!(rNFSTAT&0x01));
for(i = 0; i<512; i++)
{
*buffer=rNFDATA; // 1 up to 512 byte data serial input
buffer++;
}
rNFCONT |= (1<<1); //take CE to high
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -