管理提醒: 本帖被 qq2440 从 micro2440技术交流专区 移动到本区(2013-11-18)
Hi :
micro2440/NAND 128M
我根據書上與網路上執行了NAND 的Read/Erase/Write function,但發現執行完Erase/Write(可編繹過)後再用Read去檢查,發現值並無更改,
也研究了好幾天,但仍無解,所以只好請教大家,謝謝..
代碼如下:
int main()
{
int m;
unsigned int block,page;
unsgined char buffer[NAND_PAGE_SIZE+NAND_SPARE_SIZE];
unsigned char sparebuf[NAND_SPARE_SIZE];
block=500;
page=0;
NF_EraseBlock(block);
for(m=0; m<20 ;m++)
buffer[m] = m ;
for (m=0; m<64; m++)
sparebuf[m]=0xff;
NF_WritePage(block, page, buffer, sparebuf);
for(m=0; m<64 ;m++)
buffer[m] = 0 ;
NF_ReadPage(block, page, buffer, buffer+2048);
for(m=0; m<64 ;m++)
printf("%02x ",buffer);
return 0;
}
int NF_EraseBlock(unsigned int block)
{
unsigned char data;
unsigned int blockPage;
if(is_bad_block(block) && block!=0)
return 0;
nand_enable_chip();
nand_is_busy();
nand_write_cmd(0x60);
blockPage=(block<<6);
nand_write_addr(blockPage&0xff);
nand_write_addr((blockPage>>8)&0xff);
nand_write_cmd(0xd0);
nand_is_busy();
nand_write_cmd(0x70);
data=nand_read_data_byte();
if (data&0x1) {
nand_disable_chip();
printf("[ERASE_ERROR:block#=%d]\n",block);
return 0;
} else {
nand_disable_chip();
return 1;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int NF_WritePage(unsigned int block, unsigned int page, unsigned char *buffer, unsigned char *spareBuf)
{
int i;
unsigned int blockPage;
unsigned char *bufPt=buffer;
unsigned char stat;
nand_enable_chip();
nand_is_busy();
blockPage=(block<<6)+page;
nand_write_cmd(0x80);
nand_write_addr(0);
nand_write_addr(0);
nand_write_addr(blockPage&0xff);
nand_write_addr((blockPage>>8)&0xff);
for(i=0;i<2048;i++) {
nand_write_data(*bufPt++); // Write one page to NFM from buffer
}
if(spareBuf!=NULL) {
for(i=0;i<64;i++) {
nand_write_data(spareBuf);
}
}
nand_write_cmd(0x10);
nand_is_busy();
nand_write_cmd(0x70);
stat=nand_read_data_byte();
if (stat&0x1) {
nand_disable_chip();
printf("[PROGRAM_ERROR:block#=%d]\n",block);
return 0;
}
else {
nand_disable_chip();
return 1;
}
}