电路图如下 单片机是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);
}
多谢谢 gongnn 魔法师 的指点。 问题刚刚已经解决了。我思来想去 状态字读取有时候正常有时候不正常。
可能还是电路不行。 电阻也换过,也试过好多方法。后悔是当初太懒了啊!!!因为是用洞洞板焊的,加了滤波电容我以为就没事了。
3.3V变压出来的时候没加储能电容。造成供电不稳定。
现在好了,昨天在程序上纠结了一天。电阻上也纠结了。终于纠结出来了。。。。。
-----------------------------------------------------------------------
能贴出正确的电路吗?
我这两天也在搞这个,连状态字读没有读对
-----------------------------------------------------------------------
请教魔法师,我对DB161D进行读写,状态为AC,ID为1F 26 01 00,是否有误?现在先写buffer,然后读出来,结果全是FF。观察时序是正确的,单片机的电压是3.3V。请魔法师指教!
一周热门 更多>