SkyGz 发表于 2011-10-14 18:10:53

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

NAND Flash: NANDNAND128W3A2BN6
单片机: MSP430F5438
使用XT1 32.768

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

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

寄存器说明表,根据这说明表和寄存器返回值, 总是 P/E/R C inactive, device ready , 即无效. 要么就是 操作错误.
找不到原因是什么, 谁对NAND操作熟悉的, 能帮忙解答一下吗
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_684938XB2VYN.jpg
(原文件名:QQ截图未命名.jpg)


页写操作时序图
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_684939KSKOAS.jpg
(原文件名:QQ截图未命名.jpg)


//页写函数
// 正确返回 1,错误返回 0
int PageWrite(int nCol, unsigned long nRow, char *pBuf)
{
int nTemp = 0;
int i;
int j;
//unsignednCol_ADD1;
//unsignednCol_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;
    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={0};
char pBuf1={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;

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

lin13425329968 发表于 2011-10-15 01:28:59

回复【楼主位】SkyGz
-----------------------------------------------------------------------

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

SkyGz 发表于 2011-10-15 19:49:53

高兴, 解决了... 原因是晶振低频.. 后开启XT2 16M晶振, 就可以写入了
页: [1]
查看完整版本: MSP430F5438 操作NAND128W3A, 写数据总是失败, 找不到原因