天嵌 ARM开发社区

 找回密码
 注册
查看: 2335|回复: 1

NandFlash无法连续读取~~!

[复制链接]
zyp568 发表于 2012-10-13 17:09:16 | 显示全部楼层 |阅读模式
本帖最后由 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初始化函数:
  1. void NF_InitDev( void )
  2. {
  3.         unsigned long iNFCONF;
  4.         
  5.         iNFCONF = NFCONF;
  6.         iNFCONF &= 0x000F;
  7.         iNFCONF |= ( 3 << 12 ) | ( 7 << 8 ) | ( 7 << 4 );
  8.         NFCONF = iNFCONF;
  9.         NFCONT = ( 1 <<  4 ) | ( 1 << 1 ) | ( 1 << 0 ) ;
  10.         
  11.         ResetDev();
  12. }
复制代码
Nand页读取函数:
  1. inline static void WritePageAddress( unsigned int iBlock, unsigned int iPage )
  2. {
  3.         unsigned int iPageAddr = iBlock * NFBlockSize + iPage ;

  4.         NFADDR = 0x00;
  5.         NFADDR = 0x00;

  6.         NFADDR = iPageAddr & 0xFF;
  7.         NFADDR = ( iPageAddr >> 8 ) & 0xFF;
  8.         NFADDR = ( iPageAddr >> 16 ) & 1;
  9. }

  10. int NF_ReadPage( unsigned int iBlock, unsigned int iPage, unsigned long *pTargeAddr )
  11. {
  12.         unsigned int i;
  13.         
  14.         DevON();
  15.    
  16.         WriteCmd( READ_1ST );
  17.         WritePageAddress( iBlock,  iPage );
  18.         WriteCmd( READ_2ND );
  19.         WiteForDevReady();

  20.         for( i = 0 ; i < NFPageSize / 4 ; i++ )
  21.         {
  22.                 pTargeAddr[i] = NFDATA;
  23.         }
  24.    
  25.         DevOFF();

  26.         return TRUE;
  27. }
复制代码
Nand读取128KB循环:
  1. unsigned long *pTargeAddr = (unsigned long *)31000000;
  2.    
  3.     for( i=0; i<64; i++ )
  4.     {
  5.             NF_ReadPage( 1, i, pTargeAddr );
  6.             pTargeAddr += 2048;
  7.     }
复制代码





 楼主| zyp568 发表于 2012-10-13 21:00:48 | 显示全部楼层
本帖最后由 zyp568 于 2012-10-14 08:31 编辑

原因找到了哦~~自问自答了。
是指针赋值有错误,简单测试了一下。
  1. unsigned long *pTest = (unsigned long *)0;
  2. unsigned long *p = (unsigned long *)0x30000000;
  3. #define TEST 2048
  4. pTest += TEST;
  5. *p = (unsigned long)pTest;
复制代码
  1. > mdw 0x30000000
  2. 0x30000000: 00002000
复制代码

嗯!稀奇了。
2048 B == 2 KB
不要...B...
2048 = 2 K = 2000
0 + 2000 = 2000
GCC成功了...
OVER!

另外一个编译错误
代码:
  1. unsigned long *pTargeAddr;
  2. ...
  3. pTargeAddr += (unsigned long *)NFPageSize;
复制代码
  1. src/nand.c:100: error: invalid operands to binary + (have 'long unsigned int *' and 'long unsigned int *')
复制代码

转到Windows用Visual C++ 2010又试了一下。
  1. int main(void)
  2. {
  3.             unsigned int *pTest = 0;
  4.             unsigned int p;
  5.     #define TEST 2048
  6.             pTest += TEST;
  7.             p = (unsigned int)pTest;
  8.             return 0;
  9. }
复制代码
  1. -   pTest        0x00002000        unsigned int *
  2.                CXX0030: 错误: 无法计算表达式的值        
  3.     p        8192        unsigned int
复制代码
编译通过了,却提示无法计算表达式值……

难道是因为
pTest是一个指针变量,其中存放了一个指针。
这个(指针的数值)在内存中的存放形式不是 unsigned long/int 之类的结构。
所以直接相加出错?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-6 08:58 , Processed in 1.046881 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表