WORD NF_ReadPage(WORD block,WORD page,BYTE* buffer) { int i; WORD blockPage = (block << 5) + page; BYTE* bufPt = buffer; BYTE ECCbuf[6]; NF_RSTECC(); // 复位 ECC NF_MainECCUnlock(); // 解锁本页 main 区域的 ECC 校验,允许生成 ECC 校验码 NF_nFCE_L(); NF_CLEAR_RB(); // 清 RnB 信号 NF_CMD( NF_CMD_RD1 ); // 从本页的上半部分开始读 NF_ADDR( 0 ); // 从本页的第一个列(字节)开始读 NF_ADDR( blockPage & 0xff ); // 这三行代码指明页号 NF_ADDR( ( blockPage >> 8 ) & 0xff ); NF_ADDR( ( blockPage >> 16 ) & 0xff ); NF_WAIT_RB(); // 往本页的 main 区里写入 buffer 里的内容 for(i=0 ; i<NF_MAINSIZE ; i++) { buffer[i] = NF_RDDATA8(); } NF_MainECCLock(); // 锁定 main 区域的 ECC 校验码 NF_SpareECCUnlock(); // 解锁本页 spare 区域的 ECC 校验 // 读 spare 区域的前4个字节,即 main 区域的 ECC 校验码部分 for(i=0 ; i<4 ; i++) { ECCbuf[i] = NF_RDDATA8(); } NF_SpareECCLock(); // 锁定 spare 区域的 ECC 校验码 // 读 spare 区域的第5,第6个字节,即 spare 区域的 ECC 校验码部分 for(i=4 ; i<6 ; i++) { ECCbuf[i] = NF_RDDATA8(); } /* 下面就是验证 ECC 校验码了 */ if(( ECCbuf[0] == (NFMECCD0 & 0xff)) && ( ECCbuf[1] == ((NFMECCD0 >> 16) & 0xff)) && ( ECCbuf[2] == (NFMECCD1 & 0xff)) && ( ECCbuf[3] == ((NFMECCD1 >> 16) & 0xff)) && ( ECCbuf[4] == (NFSECCD & 0xff)) && ( ECCbuf[5] == ((NFSECCD >> 16) & 0xff))) { // ECC 校验全部成功 NF_nFCE_H(); return 1; } else { // ECC 校验不成功
void NF_init() { //得到 TACLK,TWRPH0,TWRPH1 NF_TACLS = 1; NF_TWRPH0 = 0; NF_TWRPH1 = 0; NFCONF = (NF_TACLS << 12) | (NF_TWRPH0 << 8) | (NF_TWRPH1 << 4) | (0 << 0); // 第0位清零,即8位IO NFCONT = NFCONT_Val; NF_RSTECC(); //复位 ECC NF_Reset(); //复位 Nand Flash 外部芯片 }
void ReadOneSectorInfo(PBYTE RawSectorInfoBuf) ///< Read One SectorInfo by sizeof(SectorInfo) { int i; // Initialize MECC Module NF_RSTECC(); NF_MECC_UnLock(); for(i =0 ; i< 6; i++){ // Except Reserved2. Reserved2 area can vary RawSectorInfoBuf[i] = NF_RDDATA_BYTE(); } NF_MECC_Lock(); RawSectorInfoBuf[6] = NF_RDDATA_BYTE(); RawSectorInfoBuf[7] = NF_RDDATA_BYTE(); }