51单片机读取不到Nand Flash ID

派大星 ヾ 2020-08-11 10:19:29
有没有大神指教一下关于51单片机读取Nand Flash ID,我下面的代码怎么都读取到ID,晶振12M,麻烦指正一下:

// 发送命令如下:
void NF_Command(unsigned char command)
{
NF_CE = 0;
NF_ALE = 0;
NF_CLE = 1;
// SIGNAL_SETUP(10);
NF_WE = 0;
NF_DATA = command;
// SIGNAL_SETUP(130);
NF_WE = 1;
while(!NF_R_B);
// SIGNAL_HOLD(65);

NF_CLE = 0;
NF_ALE = 1;
NF_CE = 1;
NF_WE = 1;
}

// 发送地址如下
void NF_AddrSet(uint addr)
{
NF_CLE = 1;
NF_CE = 1;
NF_WE = 1;
NF_ALE = 0;
NF_DATA = 0xFF;
SIGNAL_SETUP(130);

NF_CE = 0;
NF_CLE = 0;
NF_ALE = 1;
SIGNAL_SETUP(10);
NF_WE = 0;
NF_DATA = (uchar)(addr&0xff); // 输出列地址1
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(5);
NF_ALE = 1;
SIGNAL_SETUP(65);
NF_WE = 0;
NF_DATA = (uchar)((addr&0xff00)>>8); // 输出行地址1
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(5);
NF_ALE = 1;
SIGNAL_SETUP(65);
NF_WE = 0;
NF_DATA = (uchar)((addr&0xff0000)>>16); // 行地址2
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);
NF_ALE = 0;
SIGNAL_SETUP(5);
NF_ALE = 1;
SIGNAL_SETUP(65);

NF_WE = 0;
NF_DATA = (uchar)((addr&0xff000000)>>24);// 列地址2
SIGNAL_SETUP(130);
NF_WE = 1;
SIGNAL_SETUP(65);

NF_ALE = 0;
SIGNAL_SETUP(65);
}

unsigned char NF_ReadID()
{
unsigned char makerCode=0x00,deviceCode=0x00;

NF_CE = 1;
NF_CLE = 0;
NF_WE = 1;
NF_ALE = 0;
NF_RE = 1;

NF_CE = 0;
NF_CLE = 1;
NF_WE = 0;
NF_DATA = 0x90;
NF_WE = 1;
NF_CLE = 0;

NF_ALE = 1;
NF_WE = 0;
NF_DATA = 0x00;
// SIGNAL_SETUP(5);
NF_WE = 1;
// SIGNAL_SETUP(5);
NF_ALE = 0;
// SIGNAL_SETUP(5);
NF_RE = 0;
makerCode = 0xff&NF_DATA; // ADH
// SIGNAL_SETUP(5);
NF_RE = 1;

// SIGNAL_SETUP(5);
NF_RE = 0;
NF_DATA = 0xff;
deviceCode = 0xff&NF_DATA; // 76H
// SIGNAL_SETUP(5);
NF_RE = 1;
// SIGNAL_SETUP(5);

return makerCode;
}

命令时序:


地址时序:


读取ID时序:








...全文
1976 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
壶中日月小 2020-08-12
  • 打赏
  • 举报
回复
好吧,那看P0有上拉电阻没
派大星 ヾ 2020-08-12
  • 打赏
  • 举报
回复
可能不是这个问题呢,我试过了移到前面,延时也试过,都不行。后来看了一下,是接到51的P0口上的,所以,估计应该是P0口不能输出1。
壶中日月小 2020-08-12
  • 打赏
  • 举报
回复
首先,在写数据的时候,应该先准备数据,之后写使能,所以
NF_WE = 0;
NF_DATA = 0x90;
对调一下;
其次,虽然51频率很低,不过适当延时还是必要的,先根据时序要求多加点延时,
调通了再将延时改小

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧