擦除后用U-BOOT (nand bad)看没有一个坏块,但只要写一点数据(不管是用U-BOOT写还是用ADS),写的那一块就被标记为坏块了。cpu为2440,nand为K9F1208 下面是我写FLASH的代码,大家看看有没有什么问题:
int nand_write_PAGE(U32 ADDR) { ??int i=0; ??int j=0; ??int k=0; ??int s=0; ??int blocksize=512; ??int buf[512]; ??int oobbuf[16]; ?? ??oobbuf[5]=0xff; ?? ??for(i=0;i<blocksize;i++) ??{ ?? ? buf=i; ??} ?? ?? ??NAND_ENABLE_CE(0); ?? ?? ?? WRITE_NAND_COMMAND(0x00); ///写00命令,定位到前半区 ?? WRITE_NAND_COMMAND(0x80); ///写80命令 ??? ?? WRITE_NAND_ADDRESS(ADDR); ?? WRITE_NAND_ADDRESS(((ADDR>>9)&0xff)); ?? WRITE_NAND_ADDRESS(((ADDR>>17)&0xff)); ?? WRITE_NAND_ADDRESS(((ADDR>>25)&0xff));
??? ??for(j=0;j<blocksize;j++) ?? { ?? ? ?WRITE_NAND(buf[j]); ?? } ??? ?for(k=0;k<16;k++) ?? ?{ ?? ? ? ?WRITE_NAND(oobbuf[k],0);//写OOB区,第6位为ff ?? ? } ?? ?? ?? WRITE_NAND_COMMAND(0x10,0); ///写10命令 ??? ?? for(s=0;s<10;s++); ?//tWB=100ns; ?? ?? NAND_WAIT_READY(0); ??? ??? ?? if(READ_NAND()&0x1) ? ? //write error ?? ?{ ?? ? ? ?pp=1000; ? // 出错设个标记位,方便ADS调试的时候看。 ?? ? ? ? NAND_DISABLE_CE(0); ?? ? ? ?return 0; ?? ?}else{ ?? ? ? ? ?NAND_DISABLE_CE(0); ?? ? ? ?return 1; ?? ?} |