搜索
bottom↓
回复: 2

MSP430F5438 操作NAND128W3A, 写数据总是失败, 找不到原因

[复制链接]

出0入70汤圆

发表于 2011-10-14 18:10:53 | 显示全部楼层 |阅读模式
NAND Flash: NANDNAND128W3A2BN6
单片机: MSP430F5438
使用XT1 32.768

擦除和读取都正常, 相关函数就不贴出来了

按页写总是不成功,写入的数据要么全是0, 总之写入的数据不对,
寄存器返回 0xE0(换算为二进制为11100000) 或者 0x81(换算为二进制为10000001)

寄存器说明表,  根据这说明表和寄存器返回值, 总是 P/E/R C inactive, device ready , 即无效. 要么就是 操作错误.
找不到原因是什么, 谁对NAND操作熟悉的, 能帮忙解答一下吗

(原文件名:QQ截图未命名.jpg)


页写操作时序图

(原文件名:QQ截图未命名.jpg)


//页写函数
// 正确返回 1,错误返回 0
int PageWrite(int nCol, unsigned long nRow, char *pBuf)
{
  int nTemp = 0;
  int i;
  int j;
  //unsigned  nCol_ADD1;
  //unsigned  nCol_ADD2;
  unsigned char nADD1;
  unsigned char nADD2;
  unsigned char nADD3;
  
  //nCol_ADD1 = nCol & 0x00ff;
  //nCol_ADD2 = (nCol >> 8) & 0x001f;
  //处理最高地址的时候必须注意的是其余没有用的位必须是0
  nADD1 = (unsigned char)((nRow & 0x000000FF) >> 0);
  nADD2 = (unsigned char)((nRow & 0x0000FF00) >> 8);
  nADD3 = (unsigned char)((nRow & 0x00010000) >> 16);
  
  CE_Enable(); //片选
  P1DIR = 0xFF; //设置P1口为输出方向
  
  CLE_Enable(); //命令, 高电平
  WE_Enable(); //写使能, 低电平
  P1OUT = 0x80; //页写命令
  WE_Disable(); //写使能, 高电平
  CLE_Disable(); //命令, 低电平
  
  ALE_Enable(); //地址, 高电平
  WE_Enable();
  P1OUT = (unsigned char)(nCol); //行的起始地址
  WE_Disable();
  
  //发送行地址第一字节
  WE_Enable();
  P1OUT = nADD1;
  WE_Disable();
  
  //发送行地址第二字节
  WE_Enable();
  P1OUT = nADD2;
  WE_Disable();
  
  //发送行地址第三字节
  WE_Enable();
  P1OUT = nADD3;
  WE_Disable();  
  ALE_Disable(); //地址, 低电平
  
  // 写入数据
  for(j = 0; j < 528; j++)
  {
    WE_Enable();
    P1OUT = pBuf[j];
    WE_Disable();
  }
  
  CLE_Enable();
  WE_Enable();
  P1OUT = 0x10; //写操作确认命令
  WE_Disable();
  CLE_Disable();
  
  //等待R/B低电平
  while ((P2IN & BIT1) != 0);
  
  CLE_Enable();
  WE_Enable();
  P1OUT = 0x70;
  WE_Disable();
  CLE_Disable();
  
  P1DIR = 0; //设置P1口为输入方向
  //读状态寄存器
  for(j = 0; j < 528; j++)
  {
    RE_Enable(); //读使能, 低电平
    nTemp = P1IN;
    RE_Disable(); //读使能, 高电平
    if(nTemp == 0xC0) break;
  }
  
  if(nTemp == 0xC0) return 1;
  else return 0;
}

//-----------------------------------------
//测试代码
  int n;
  int nCount_ERR = 0;
  char pBuf0[528]={0};
  char pBuf1[528]={0};


  //擦除
  if (BlockErase(0)==0)
    nCount_ERR++;  
  
  for(j = 1000; j > 0; j--); //延迟一会再读

  //读一页
  if (PageRead(00pBuf1)==0)
    nCount_ERR++;

  //给pBuf0数组测试数据
  for (n=0; n<528; n++) pBuf0[n] = n;

  //在第一块, 第一页写入pBuf0
  if (PageWrite(0,0,pBuf0)==0)
    nCount_ERR++;

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-10-15 01:28:59 | 显示全部楼层
回复【楼主位】SkyGz  
-----------------------------------------------------------------------

其实有时候人品也是蛮重要的,可惜我也是初学者

出0入70汤圆

 楼主| 发表于 2011-10-15 19:49:53 | 显示全部楼层
高兴, 解决了... 原因是晶振低频.. 后开启XT2 16M晶振, 就可以写入了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-6 10:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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