AT45DB321芯片存储数据需要先擦除?

[复制链接]
1560|16
手机看帖
扫描二维码
随时随地手机跟帖
dirtwillfly| | 2018-11-6 20:49 | 显示全部楼层
不需要的。这个器件支持单字节读写,不需要擦除,直接覆盖就可以。

使用特权

评论回复
cainiao518|  楼主 | 2018-11-8 11:38 | 显示全部楼层
dirtwillfly 发表于 2018-11-6 20:49
不需要的。这个器件支持单字节读写,不需要擦除,直接覆盖就可以。

可是,我感觉有时数据好像丢了一样呢

使用特权

评论回复
评论
dirtwillfly 2018-11-8 23:00 回复TA
写进去再读出来看看 
cainiao518|  楼主 | 2018-11-15 09:01 | 显示全部楼层
本帖最后由 cainiao518 于 2018-11-15 09:13 编辑
dirtwillfly 发表于 2018-11-6 20:49
不需要的。这个器件支持单字节读写,不需要擦除,直接覆盖就可以。

奇怪了
每次写入8字节,写入几十次,随即读出来,数据都没问题,
但连续读取十几次的数据,就会发现有些地方的数据异常
00 00 01 F8 00 3F 14 31  ( (第1页0地址)
00 0A 12 09 03 0F 14 31
00 0A 12 09 03 0F 16 31
00 0A 12 09 03 0F 16 31
00 0A 12 09 03 0F 17 31
00 0A 12 09 03 0F 18 31
00 0A 12 09 03 0F 18 31
00 0A 12 09 03 0F 19 31
00 0A 12 09 03 0F 19 31
00 0A 12 09 03 0F 1A 31

00 0A 12 09 03 0F 1A 31
00 0A 12 09 03 0F 1A 31
00 0A 12 09 03 0F 1B 31
00 0A 12 09 03 0F 1B 31
00 0A 12 09 03 0F 1C 31
00 0A 12 09 03 0F 1D 31
00 0A 12 09 03 0F 1D 31
00 0A 12 09 03 0F 24 31
00 0A 12 09 03 0F 25 31
00 0A 12 09 03 0F 26 31

00 0A 12 09 03 0F 26 31
00 0A 12 09 03 0F 27 31
00 0A 12 09 03 0F 28 31
00 0A 12 09 03 0F 29 31
00 0A 12 09 03 0F 29 31
00 0A 12 09 03 0F 2A 31
00 0A 12 09 03 0F 2A 31
00 0A 12 09 03 0F 2A 31
00 0A 12 09 03 0F 2A 31
00 0A 12 09 03 0F 2B 31

00 0A 12 09 03 0F 2B 31
00 0A 12 09 03 0F 2B 31
00 0A 12 09 03 0F 2C 31
00 0A 12 09 03 0F 2C 31
00 0A 12 09 03 0F 2D 31
00 0A 12 09 03 0F 32 31
00 0A 12 09 03 0F 33 31
00 0A 12 09 03 0F 33 31
00 0A 12 09 03 0F 33 31
00 0A 12 09 03 0F 34 31

00 0A 12 09 03 0F 34 31
00 0A 12 09 03 0F 34 31
00 0A 12 09 03 0F 34 31
00 0A 12 09 03 0F 34 31
00 0A 12 09 03 0F 35 31
00 0A 12 09 03 0F 35 31
00 0A 12 09 03 0F 35 31
00 0A 12 09 03 0F 36 31
00 0A 12 09 03 0F 36 31
00 0A 12 09 03 0F 36 31

00 0A 12 09 03 0F 36 31
00 0A 12 09 03 0F 37 31
00 0A 12 09 03 0F 37 31
00 0A 12 09 03 0F 38 31
00 0A 12 09 03 0F 38 31
00 0A 12 09 03 0F 38 31
00 0A 12 09 03 0F 38 31
00 0A 12 09 03 0F 39 31
00 0A 12 09 03 0F 39 31
00 0A 12 09 03 0F 3A 31

00 0A 12 09 03 0F 3A 31
00 0A 12 09 03 0F 3B 31
00 0A 12 09 03 0F 3B 31
00 0A 12 09 03 0F 06 31
00 01 01 F8 00 7F 14 31  (第二页0地址)
00 0A 12 09 03 0F 16 31
00 0A 12 09 03 0F 18 31
。。。。。

使用特权

评论回复
dirtwillfly| | 2018-11-15 12:30 | 显示全部楼层
cainiao518 发表于 2018-11-15 09:01
奇怪了
每次写入8字节,写入几十次,随即读出来,数据都没问题,
但连续读取十几次的数据,就会发现有些地 ...

我觉得有可能是写入或者读取的时序有问题,比如被中断打断等情况影响到。
建议观察下时序

使用特权

评论回复
cainiao518|  楼主 | 2018-11-24 10:58 | 显示全部楼层
dirtwillfly 发表于 2018-11-15 12:30
我觉得有可能是写入或者读取的时序有问题,比如被中断打断等情况影响到。
建议观察下时序 ...

如果时序有问题,为何总是一页的首地址数据出现问题呢?

使用特权

评论回复
dirtwillfly| | 2018-11-24 17:34 | 显示全部楼层
cainiao518 发表于 2018-11-24 10:58
如果时序有问题,为何总是一页的首地址数据出现问题呢?

有可能这个时候被打断了。这个问题要具体分析。建议提供下更详细的信息,比如出问题时的时序图、源代码等

使用特权

评论回复
dirtwillfly| | 2018-11-24 17:34 | 显示全部楼层
cainiao518 发表于 2018-11-24 10:58
如果时序有问题,为何总是一页的首地址数据出现问题呢?

有可能这个时候被打断了。这个问题要具体分析。建议提供下更详细的信息,比如出问题时的时序图、源代码等

使用特权

评论回复
cainiao518|  楼主 | 2018-11-24 18:11 | 显示全部楼层
dirtwillfly 发表于 2018-11-24 17:34
有可能这个时候被打断了。这个问题要具体分析。建议提供下更详细的信息,比如出问题时的时序图、源代码等 ...

这里是部分源程序
上面是读取数据,下面是写入数据
Continuous_Array_Read(adr_page_record,8,spi_buf,504);//读取504字节数据函数

TestStatus Continuous_Array_Read(unsigned int   PageAddr,  unsigned int  ByteAddr,
                                 unsigned char *DataBuffer,unsigned long ByteNum)
{
  unsigned long i;        
  if(ByteNum<=2162688)//СÓÚ 4096*528 Bytes
  {
    while(!(StatusRegisterRead()&0x80));
    SPI_CS_LOW();
    SPI_WriteByte(Continuous_Array_Read_Cmd);
    SPI_WriteByte((unsigned char)(PageAddr>>6));
    SPI_WriteByte((unsigned char)((PageAddr<<2)|(ByteAddr>>8)));
    SPI_WriteByte((unsigned char)ByteAddr);
    SPI_WriteByte(0x00); //
   
    for(i=0;i<ByteNum;i++)
    {
      DataBuffer[i] = SPI_ReadByte();
    }
    SPI_CS_HIGH();
   
    return  PASSED;
  }
  return FAILED;
}

TestStatus  DataToPage_ViaBuffer_WithErase_SecWay(unsigned char  BufferNumber,unsigned int PageAddr,unsigned int ByteAddr,
                                                   unsigned char *Data,       unsigned int ByteNum)
{
   unsigned int i;
   if((ByteNum<=(528-ByteAddr))&&(ByteNum>0))
   {
      while(!(StatusRegisterRead()&0x80));
      SPI_CS_LOW();
      switch(BufferNumber)
      {
        case 1: SPI_WriteByte(0x82);break;//
        case 2: SPI_WriteByte(0x85);break;//
      }
      SPI_WriteByte((unsigned char)( PageAddr>>6));
      SPI_WriteByte((unsigned char)((PageAddr<<2)|(ByteAddr>>8)));
      SPI_WriteByte((unsigned char)  ByteAddr);
      for(i=0;i<ByteNum;i++)
      {
         SPI_WriteByte(Data[i]);
      }
      SPI_CS_HIGH();
      return PASSED;
  }
  return FAILED;
}

使用特权

评论回复
qw507169008| | 2018-12-1 10:09 | 显示全部楼层
我有点看不懂,新手

使用特权

评论回复
cainiao518|  楼主 | 2018-12-1 11:19 | 显示全部楼层
qw507169008 发表于 2018-12-1 10:09
我有点看不懂,新手

没事,接触时间长了就熟悉了

使用特权

评论回复
cainiao518|  楼主 | 2018-12-1 11:20 | 显示全部楼层
AT45DB321D-SU.pdf (1.57 MB)

使用特权

评论回复
cainiao518|  楼主 | 2018-12-7 10:43 | 显示全部楼层
dirtwillfly 发表于 2018-11-24 17:34
有可能这个时候被打断了。这个问题要具体分析。建议提供下更详细的信息,比如出问题时的时序图、源代码等 ...

在读取数据时,就会出现错误的数据,例如一次读取64字节,地址是变化的
Continuous_Array_Read(page_addr,byte_adr,  spi_buf,64);

使用特权

评论回复
dirtwillfly| | 2018-12-7 14:23 | 显示全部楼层
cainiao518 发表于 2018-12-7 10:43
在读取数据时,就会出现错误的数据,例如一次读取64字节,地址是变化的
Continuous_Array_Read(page_addr ...

你在读取数据前关闭全局中断,读取完毕再打开
试试还有没有错误

使用特权

评论回复
dirtwillfly| | 2018-12-7 14:24 | 显示全部楼层
cainiao518 发表于 2018-12-7 10:43
在读取数据时,就会出现错误的数据,例如一次读取64字节,地址是变化的
Continuous_Array_Read(page_addr ...

还有就是用逻辑分析仪或者示波器观察一下时序图,看看没错误时和有错误时有什么区别

使用特权

评论回复
cainiao518|  楼主 | 2018-12-7 15:26 | 显示全部楼层
dirtwillfly 发表于 2018-12-7 14:24
还有就是用逻辑分析仪或者示波器观察一下时序图,看看没错误时和有错误时有什么区别 ...

好的

使用特权

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

本版积分规则

129

主题

1328

帖子

4

粉丝