打印

古道热肠你好,想请教一下AT45DB161D的问题

[复制链接]
3248|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
PackBot|  楼主 | 2010-9-25 20:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

版主,你好,我也遇到了你以前遇到的类似问题。
我用io模拟SPI接口,操作AT45DB161D,能够读取状态,也能读取ID,
但是写BUF,读BUF就会出现错误,读出的全是FF,折腾两天了没出来,希望版主帮忙,小弟不胜感激!具体代码见下面:
//*****************************************************
void Wat45_byte(unsigned char x)
{
//----这种使用循环与位运算的实现方式,速度要比直接用位寻址与顺序执行方式实现慢得多
//  ----因为它把大部分的时间花在了循环因子的递增、比较与位运行上了
  unsigned char i=0;
  for(i=0;i<8;i++)
  {
     SPI_SCL=0;
//  SPI_SI=;
   if((x&(0x80>>i)) != 0)
     SPI_SI = 1;
   else
     SPI_SI = 0;
     SPI_SCL=1;
  }
}

//******************************************************
unsigned char Rat45_byte()
{  
//----这种使用循环与位运算的实现方式,速度要比直接用位寻址与顺序执行方式实现慢得多
//----因为它把大部分的时间花在了循环因子的递增、比较与位运行上了
  unsigned char i=0,temp=0;
  SPI_SO=1;
  for(i=0;i<8;i++)
  {
   SPI_SCL=1;
   SPI_SCL=0;
   if(SPI_SO) temp|=0x80>>i;
  }
  return temp;

}
//******************************************************
unsigned char Rat45_status()
{
unsigned char status;
at45_cs = 0;  //片选打开
delayus(10);
   
Wat45_byte(0xd7); //D7H是读取状态的命令字
status = Rat45_byte(); //读取状态字节
at45_cs = 1; //片选关闭
delayus(10);
return status;   
}
//******************************************************
void Rat45_ID(void)
{
at45_cs = 0;  //片选打开
delayus(10);
   
Wat45_byte(0x9F); //9fH是读ID
buf[1] = Rat45_byte(); //读取状态字节
buf[2] = Rat45_byte(); //读取状态字节
buf[3] = Rat45_byte(); //读取状态字节
buf[4] = Rat45_byte(); //读取状态字节
at45_cs = 1; //片选关闭
delayus(10);
}  
//********************************************************
void Rat45_buf(void)
{
   unsigned int i;
   while(!(Rat45_status()& 0x80 )); //判断是否忙
   at45_cs = 0;  //片选打开
   //Wat45_byte(0xD6); //读缓冲区2指令字
   
   Wat45_byte(0xD1); //读缓冲区1指令字
   Wat45_byte(0x00);  //从0开始
   Wat45_byte(0x00);
   Wat45_byte(0x00);
   
for (i=0;i<100;i++)
{
buf = Rat45_byte();
    }
   at45_cs = 1;
   delay(1);
   }
//********************************************************
void Wat45_buf(void)
{
   unsigned int i;
   while(!(Rat45_status()& 0x80 )); //判断是否忙
   at45_cs = 0;  //片选打开
  // Wat45_byte(0x87);   //写缓冲区2指令字
   Wat45_byte(0x84); //写缓冲区1指令字
   Wat45_byte(0x00);   //从0开始
   Wat45_byte(0x00);
   Wat45_byte(0x00);
  
   for (i=0;i<100;i++)
{
Wat45_byte(buf);
    }
   at45_cs = 1; //片选关闭
   delayus(10);
}

void t_data (int temp)
{
  SBUF = temp;
  while (TI == 0)
  {}
  TI = 0;
}
int r_data()
{int temp;
  temp = SBUF;
  while(RI == 0);
  {}
  RI = 0;
  return temp;
  }
void t_buf(unsigned char count)
{
   unsigned char i;
   for(i=0;i < count;i++)
     {
      t_data(buf);
      delay(25);
      }
}

//********************************************************
void uart_init (void)
{
   IE=0x00;                                       // 禁止所有中断
  SCON=0x50;                                     // 串口工作方式1,即10位异步收发器(8位数据),波特率可变
  TMOD|=0x20;                                    // 定时器1:工作方式2(8位自动重装定时/计数器)
  PCON|=0xC0;                                    // SMOD=1,即波特率提高一倍
  TH1=0xFA;                                      // 晶振频率为11.0592MHz时,波特率为9600
  TR1=1;                                         // 启动定时器/计数器1
    }            
void main (void)
{
  unsigned char i;
  uart_init();
  //at45db_init();  
  P1M0 = 0x00;
  P1M1 = 0x00;
  delay(1000);  
  for(i=0;i<100;i++)
  {
   buf = i;
   }
   t_buf(100);
  delay(500);
  
  t_data(0x11);
  t_data(Rat45_status());
  t_data(0x11);
  delay(100);
   Rat45_ID();
   t_buf(10);
  t_data(0x22);
  t_data(Rat45_status());
  t_data(0x22);
  delay(100);
  Wat45_buf();
  t_data(0x33);
  t_data(Rat45_status());
  t_data(0x33);
  delay(100);
  Rat45_buf();
  t_buf(20);

   while(1)
   {}
   }

相关帖子

沙发
古道热肠| | 2010-9-26 20:55 | 只看该作者
印象中D版本的161和B版本的是兼容的。您可用我们在ARM上的45DB161D驱动移植到单片机上。注意初始化时要上拉,芯片SPI有两种模式的。要选对模式。

使用特权

评论回复
板凳
fuxiangbo| | 2010-9-27 12:38 | 只看该作者
哇塞,还在用艾特没的 flash  有钱人呀

使用特权

评论回复
地板
inele| | 2010-10-3 00:27 | 只看该作者
这东西也便宜啊

使用特权

评论回复
5
fuxiangbo| | 2010-10-3 18:51 | 只看该作者
不便宜了,严重缺货中

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:创新是一个民族的灵魂!

0

主题

50

帖子

1

粉丝