微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > NANDFlashd的读写(基于s3c2440)

NANDFlashd的读写(基于s3c2440)

时间:11-20 来源:互联网 点击:

  1. 作一页
  2. for(i=0;i
  3. {
  4. control_start();//开控制
  5. nand_reset();//复位
  6. #ifdefUSE_ECC
  7. rNFESTAT0=0;//复位错误标志位
  8. ecc_main_init();
  9. ecc_main_start();//可以产生main区ECC
  10. #endif
  11. rNFCMD=NAND_CMD_READ_1st;
  12. rNFADDR=0;
  13. rNFADDR=0;
  14. rNFADDR=addr&0xff;
  15. rNFADDR=(addr>>8)&0xff;
  16. rNFADDR=(addr>>16)&0xff;
  17. rNFCMD=NAND_CMD_READ_2st;
  18. detect_nand_busy();
  19. for(p=0;p<2048;p++)
  20. {
  21. temp=temp+1;
  22. if(temp>size)
  23. {
  24. no=rNFDATA8;//多余的读出来扔掉
  25. }
  26. else
  27. {
  28. *(bu+p)=rNFDATA8;
  29. }
  30. }
  31. #ifdefUSE_ECC
  32. rNFESTAT0=0;
  33. ecc_main_end();//锁定main区ECC
  34. //delay_lhg(100,100);//
  35. ecc_spare_start();//解锁spare区ecc
  36. ecc=rNFDATA8;//从flash读出main区ECC,四个字节
  37. no=rNFDATA8;
  38. ecc|=((U32)no)<8;
  39. no=rNFDATA8;
  40. ecc|=((U32)no)<16;
  41. no=rNFDATA8;
  42. ecc|=((U32)no)<24;
  43. rNFMECCD0=((ecc&0xff00)<8)|(ecc&0xff);//硬件检验mainECC
  44. rNFMECCD1=((ecc&0xff000000)>>8)|((ecc&0xff0000)>>16);
  45. ecc_spare_end();//锁定spare区ecc
  46. //delay_lhg(100,100);//
  47. ecc=rNFDATA8;//从flash读出spare区ECC的值
  48. no=rNFDATA8;
  49. ecc|=((U32)no)<8;
  50. rNFSECCD=((ecc&0xff00)<8)|(ecc&0xff);//硬件检验spareECC
  51. //delay_lhg(100,100);//延时一会
  52. ecc=rNFESTAT0&0xffffff;//ecc只是临时用一下错误状态,并非ecc内容
  53. if(ecc!=0)//有错误
  54. {
  55. //以后再优化
  56. #ifdefNAND_DEBUG
  57. Uart_Printf("/r/nNandecccheckerror...pageaddr=0x%x,NFESTAT0=0x%x",addr,ecc);
  58. #endif
  59. nand_mask_bad_block((addr+i)/64);//登记为坏块
  60. return-1;
  61. }
  62. #endif
  63. bu=bu+2048;
  64. addr++;
  65. control_end();//关控制
  66. }
  67. return1;
  68. }
  69. intnand_random_read(U32paddr,U32offset,U8*data)//随机读数据paddr页地址,offset页内偏移地址
  70. {
  71. control_start();//开控制
  72. nand_reset();//复位
  73. rNFCMD=NAND_CMD_READ_1st;
  74. rNFADDR=0;
  75. rNFADDR=0;
  76. rNFADDR=paddr&0xff;
  77. rNFADDR=(paddr>>8)&0xff;
  78. rNFADDR=(paddr>>16)&0xff;
  79. rNFCMD=NAND_CMD_READ_2st;
  80. detect_nand_busy();
  81. rNFCMD=NAND_CMD_RANDOM_READ_1st;
  82. rNFADDR=offset&0xff;//写入页内偏移地址
  83. rNFADDR=(offset>>8)&0xff;
  84. rNFCMD=NAND_CMD_RANDOM_READ_2st;
  85. *data=rNFDATA8;
  86. control_end();
  87. return1;
  88. }
  89. intnand_random_write(U32paddr,U32offset,U8data)//随机写,paddr页地址,offset页内偏移地址
  90. {
  91. control_start();//开控制
  92. nand_reset();//复位
  93. rNFCMD=NAND_CMD_WRITE_PAGE_1st;
  94. rNFADDR=0;
  95. rNFADDR=0;
  96. rNFADDR=paddr&0xff;
  97. rNFADDR=(paddr>>8)&0xff;
  98. rNFADDR=(paddr>>16)&0xff;
  99. rNFCMD=NAND_CMD_RANDOM_WRITE;
  100. rNFADDR=offset&0xff;//写入页内偏移地址
  101. rNFADDR=(offset>>8)&0xff;
  102. rNFDATA8=data;
  103. rNFCMD=NAND_CMD_WRITE_PAGE_2st;
  104. detect_nand_busy();//检测忙
  105. rNFCMD=NAND_CMD_READ_STATUS;//读状态
  106. if(rNFDATA8&1)
  107. {
  108. #ifdefNAND_DEBUG
  109. Uart_Printf("/r/nError:nandrandomwriteerror...paddr=0x%x,offset=0x%x",paddr,offset);
  110. #endif
  111. return-1;//删除错误返回0
  112. }
  113. control_end();
  114. return1;//成功返回1
  115. }
  116. voidnand_test_bad_block(void)//测试坏块函数,并标记spare区最后一个地址,如果非0xff则为坏块
  117. {
  118. U8dest[64*2048];//一个块的main区容量
  119. U8src[64*2048];
  120. U32i,k;
  121. #ifdefNAND_DEBUG
  122. Uart_Printf("/r/ntestandmaskbadblockisbegain./r/n");
  123. #endif
  124. //main区检测
  125. for(i=0;i<64*2048;i++)
  126. {
  127. dest[i]=0xff;//初始化缓冲区
  128. src[i]=0;
  129. }
  130. //删除所有块
  131. for(i=0;i
  132. {
  133. nand_block_erase(i);
  134. }
  135. for(i=0;i
  136. {
  137. nand_page_write(i*64,src,64*2048);
  138. nand_page_read(i*64,dest,64*2048);//使用了ecc校验读出来即可登记坏块信息
  139. }
  140. for(i=0;i<64*2048;i++)
  141. {
  142. dest[i]=0;//初始化缓冲区
  143. src[i]=0xff;
  144. }
  145. //删除所有块
  146. for(i=0;i
  147. {
  148. nand_block_erase(i);
  149. }
  150. for(i=0;i
  151. {
  152. nand_page_write(i*64,src,64*2048);
  153. nand_page_read(i*64,dest,64*2048);//使用了ecc校验读出来即可登记坏块信息
  154. }
  155. //
  156. //spare区检测
  157. for(i=0;i<64;i++)
  158. {
  159. dest[i]=0xff;//初始化缓冲区
  160. src[i]=0;
  161. }
  162. //删除所有块
  163. for(i=0;i
  164. {
  165. nand_block_erase(i);
  166. }
  167. for(i=0;i
  168. {
  169. if(nand_bbi.area[i/64]==1)//如果是坏块则跳过
  170. continue;
  171. for(k=0;k<64;k++)
  172. {
  173. nand_random_write(i,2048+k,src[k]);
  174. nand_random_read(i,2048+k,&dest[k]);
  175. if(dest[k]!=src[k])//不相等则登记为坏块
  176. {
  177. nand_mask_bad_block(i/64);
  178. break;
  179. }
  180. }
  181. }
  182. for(i=0;i<64;i++)
  183. {
  184. dest[i]=0x0;//初始化缓冲区
  185. src[i]=0xff;
  186. }
  187. //删除所有块
  188. for(i=0;i
  189. {
  190. nand_block_erase(i);
  191. }
  192. for(i=0;i
  193. {
  194. if(nand_bbi.area[i/64]==1)//如果是坏块则跳过
  195. continue;
  196. for(k=0;k<64;k++)
  197. {
  198. nand_random_write(i,2048+k,src[k]);
  199. nand_random_read(i,2048+k,&dest[k]);
  200. if(dest[k]!=src[k])//不相等则登记为坏块
  201. {
  202. nand_mask_bad_block(i/64);
  203. break;
  204. }
  205. }
  206. }
  207. #ifdefNAND_DEBUG
  208. Uart_Printf("/r/ntestandma

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top