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++; 回复【楼主位】SkyGz
-----------------------------------------------------------------------
其实有时候人品也是蛮重要的,可惜我也是初学者 高兴, 解决了... 原因是晶振低频.. 后开启XT2 16M晶振, 就可以写入了
页:
[1]