51读写AT45DB161D出现问题,ID和状态字都能读出来。路过的大哥请指教

2020-01-26 13:01发布

电路图如下 单片机是5V的 at45用的是3.3V供电口 数据线中间串了1K电阻  数据输出加了个10K的上拉电阴 如下图所示


(原文件名:未命名.jpg)

状态字和ID读出来都没有错,状态字连续多读几次的话出来也是FF。中间也有延时的。

现在可能写数据和读数据都是有问题的。读数据读出来的全都是FF还有一些不确定的值 。


我试着先写一下缓冲区  再把缓冲区中的数据读出来。读出来前面一段是对的 比如说读出来前 n位(n值不确定 一般都 n<15)是对的 ,到后面就全是FF了。

我现在怀疑是不是中间串的电阻有问题啊,要不然连续读状态字会出现不稳定现象。

忘记贴上程序了  程序太长了也没人人愿意看  我简化了一下 大哥们帮小弟看一下


unsigned char  xdata buf[528];        //定义一个缓冲区


//******************************************************
unsigned char Rat45_status()          //读取状态字
{
unsigned char status;
at45_cs = 0;  //片选打开
   
Wat45_byte(0xd7); //D7H是读取状态的命令字

status = Rat45_byte(); //读取状态字节

at45_cs = 1; //片选关闭

return status;   
}
//******************************************************
void Rat45_page(unsigned int page)              //页读取  页内基地址从 0 开始
{
unsigned int i;

while(!(Rat45_status()&0x80)); //判断是否忙
at45_cs = 0;  //片选打开
   
Wat45_byte(0xe8); //E8H 连续读取命令字

Wat45_byte((unsigned char)(page >> 6));
Wat45_byte((unsigned char)(page << 2));

Wat45_byte(0x00);                  //页内基地址         从0开始

   Wat45_byte(0x00);          //4个无关字节
   Wat45_byte(0x00);
   Wat45_byte(0x00);
   Wat45_byte(0x00);
      
      for (i=0;i<528;i++)  buf = Rat45_byte();
  
at45_cs = 1; //片选关闭
delay(1);

}
//********************************************************
void Wat45_buf(void)                       //写缓冲区 2
{
unsigned int i;

while(!(Rat45_status()& 0x80 )); //判断是否忙

at45_cs = 0;  //片选打开
   
Wat45_byte(0x87); //写缓冲区2指令字

   Wat45_byte(0x00);  //从0开始
   Wat45_byte(0x00);
   Wat45_byte(0x00);
  
          for (i=0;i<528;i++)        Wat45_byte(i);

at45_cs = 1; //片选关闭
delay(1);

}
//********************************************************
void Rat45_buf(void)                 //读缓冲区2  调试时 验证是不是将数据写到缓冲区
{
unsigned int i;

while(!(Rat45_status()& 0x80 )); //判断是否忙

at45_cs = 0;  //片选打开
  Wat45_byte(0xd6); //写缓冲区2指令字
   Wat45_byte(0x00);  //从0开始
   Wat45_byte(0x00);
   Wat45_byte(0x00);
   Wat45_byte(0x00);
          
        for (i=0;i<528;i++)        buf = Rat45_byte();

  at45_cs = 1;
  delay(1);
}

//********************************************************
void Wat45_buftopag(unsigned int page)     //缓冲区2 写到页的操作
{
//unsigned int i;

   Wat45_buf();
        delay(100);
while(!(Rat45_status()&0x80)); //判断是否忙

at45_cs = 0;  //片选打开
   
Wat45_byte(0x86); //将缓冲区2中的数据写入页
Wat45_byte((unsigned char)(page >> 6));
Wat45_byte((unsigned char)(page << 2));
Wat45_byte(0x00);                  //无关位

at45_cs = 1; //片选关闭
delay(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
27条回答
ljy0421
1楼-- · 2020-01-27 10:21
我用的89C52单片机,我定义的是 unsigned char  xdata buf[528];外部扩展RAM, 不知道可不可行啊?

但是我定义一个小一点的数组 比   unsigned char  buf[128]; 这个肯定没有超过,但是好像读出来的后面的也是乱的。

现在还有一个问题是  读一下 状态字  开始读出来的都是正常的是 1010 1100。 我隔一秒再读一次,这样反复多读几次之后

就是 1111 1111  感觉比较奇怪????
gongnn
2楼-- · 2020-01-27 12:23
延时再长些试试吧
undeadhuman
3楼-- · 2020-01-27 13:18
 精彩回答 2  元偷偷看……
ljy0421
4楼-- · 2020-01-27 13:40
一秒钟应该是足够长了吧。因为写数据到AT45DB中的话 要先写到缓冲区中,这次操作要一个判忙。接着又要缓冲区到页的操作,这时候也要一个判忙。两次判忙不应该要这么长时间吧?
gongnn
5楼-- · 2020-01-27 14:10
太长了吧
ljy0421
6楼-- · 2020-01-27 19:33
多谢谢  gongnn 魔法师  的指点。  问题刚刚已经解决了。我思来想去 状态字读取有时候正常有时候不正常。

可能还是电路不行。 电阻也换过,也试过好多方法。后悔是当初太懒了啊!!!因为是用洞洞板焊的,加了滤波电容我以为就没事了。

3.3V变压出来的时候没加储能电容。造成供电不稳定。

现在好了,昨天在程序上纠结了一天。电阻上也纠结了。终于纠结出来了。。。。。

一周热门 更多>