zyp568 发表于 2012-10-13 17:09:16

NandFlash无法连续读取~~!

本帖最后由 zyp568 于 2012-10-13 17:15 编辑

实验板:TQ2440
环境:ubuntu12.04.1 + arm-linux-gcc-4.3.2
写了个Nand读取函数,想从Nand读取128KB的数据到SDRAM。
用OpenOCD + JLink调试,发现:
只有第0页的数据读取是正确的,往后所有的页的数据均不正确,全为0xFFFFFFFF,没读取成功。
求教下是咋会是呢?
代码简要如下:
Nand初始化函数:
void NF_InitDev( void )
{
      unsigned long iNFCONF;
      
      iNFCONF = NFCONF;
      iNFCONF &= 0x000F;
      iNFCONF |= ( 3 << 12 ) | ( 7 << 8 ) | ( 7 << 4 );
      NFCONF = iNFCONF;
      NFCONT = ( 1 <<4 ) | ( 1 << 1 ) | ( 1 << 0 ) ;
      
      ResetDev();
}Nand页读取函数:
inline static void WritePageAddress( unsigned int iBlock, unsigned int iPage )
{
      unsigned int iPageAddr = iBlock * NFBlockSize + iPage ;

      NFADDR = 0x00;
      NFADDR = 0x00;

      NFADDR = iPageAddr & 0xFF;
      NFADDR = ( iPageAddr >> 8 ) & 0xFF;
      NFADDR = ( iPageAddr >> 16 ) & 1;
}

int NF_ReadPage( unsigned int iBlock, unsigned int iPage, unsigned long *pTargeAddr )
{
      unsigned int i;
      
      DevON();
   
      WriteCmd( READ_1ST );
      WritePageAddress( iBlock,iPage );
      WriteCmd( READ_2ND );
      WiteForDevReady();

      for( i = 0 ; i < NFPageSize / 4 ; i++ )
      {
                pTargeAddr = NFDATA;
      }
   
      DevOFF();

      return TRUE;
}Nand读取128KB循环:
unsigned long *pTargeAddr = (unsigned long *)31000000;
   
    for( i=0; i<64; i++ )
    {
            NF_ReadPage( 1, i, pTargeAddr );
            pTargeAddr += 2048;
    }




zyp568 发表于 2012-10-13 21:00:48

本帖最后由 zyp568 于 2012-10-14 08:31 编辑

原因找到了哦~~自问自答了。
是指针赋值有错误,简单测试了一下。
unsigned long *pTest = (unsigned long *)0;
unsigned long *p = (unsigned long *)0x30000000;
#define TEST 2048
pTest += TEST;
*p = (unsigned long)pTest;
> mdw 0x30000000
0x30000000: 00002000
嗯!稀奇了。
2048 B == 2 KB
不要...B...
2048 = 2 K = 2000
0 + 2000 = 2000
GCC成功了...
OVER!

另外一个编译错误
代码:
unsigned long *pTargeAddr;
...
pTargeAddr += (unsigned long *)NFPageSize;
src/nand.c:100: error: invalid operands to binary + (have 'long unsigned int *' and 'long unsigned int *')
转到Windows用Visual C++ 2010又试了一下。
int main(void)
{
            unsigned int *pTest = 0;
            unsigned int p;
    #define TEST 2048
            pTest += TEST;
            p = (unsigned int)pTest;
            return 0;
}-   pTest      0x00002000      unsigned int *
               CXX0030: 错误: 无法计算表达式的值      
    p      8192      unsigned int
编译通过了,却提示无法计算表达式值……

难道是因为
pTest是一个指针变量,其中存放了一个指针。
这个(指针的数值)在内存中的存放形式不是 unsigned long/int 之类的结构。
所以直接相加出错?
页: [1]
查看完整版本: NandFlash无法连续读取~~!