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