Пример #1
0
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 校验不成功
Пример #2
0
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 外部芯片
}
Пример #3
0
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();    
}