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

[复制链接]
970|16
 楼主 | 2018-11-6 14:25 | 显示全部楼层 |阅读模式
如题:

每页512字节,要存数据到第32字节到39字节,需要全不擦除,再写入?   
那之前保存的数据全丢了?
| 2018-11-6 20:49 | 显示全部楼层
不需要的。这个器件支持单字节读写,不需要擦除,直接覆盖就可以。
 楼主 | 2018-11-8 11:38 | 显示全部楼层
dirtwillfly 发表于 2018-11-6 20:49
不需要的。这个器件支持单字节读写,不需要擦除,直接覆盖就可以。

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

评论

dirtwillfly 2018-11-8 23:00 回复TA
写进去再读出来看看 
 楼主 | 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
。。。。。
| 2018-11-15 12:30 | 显示全部楼层
cainiao518 发表于 2018-11-15 09:01
奇怪了
每次写入8字节,写入几十次,随即读出来,数据都没问题,
但连续读取十几次的数据,就会发现有些地 ...

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

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

有可能这个时候被打断了。这个问题要具体分析。建议提供下更详细的信息,比如出问题时的时序图、源代码等
| 2018-11-24 17:34 | 显示全部楼层
cainiao518 发表于 2018-11-24 10:58
如果时序有问题,为何总是一页的首地址数据出现问题呢?

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

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

  2. TestStatus Continuous_Array_Read(unsigned int   PageAddr,  unsigned int  ByteAddr,
  3.                                  unsigned char *DataBuffer,unsigned long ByteNum)
  4. {
  5.   unsigned long i;        
  6.   if(ByteNum<=2162688)//СÓÚ 4096*528 Bytes
  7.   {
  8.     while(!(StatusRegisterRead()&0x80));
  9.     SPI_CS_LOW();
  10.     SPI_WriteByte(Continuous_Array_Read_Cmd);
  11.     SPI_WriteByte((unsigned char)(PageAddr>>6));
  12.     SPI_WriteByte((unsigned char)((PageAddr<<2)|(ByteAddr>>8)));
  13.     SPI_WriteByte((unsigned char)ByteAddr);
  14.     SPI_WriteByte(0x00); //
  15.    
  16.     for(i=0;i<ByteNum;i++)
  17.     {
  18.       DataBuffer[i] = SPI_ReadByte();
  19.     }
  20.     SPI_CS_HIGH();
  21.    
  22.     return  PASSED;
  23.   }
  24.   return FAILED;
  25. }

  26. TestStatus  DataToPage_ViaBuffer_WithErase_SecWay(unsigned char  BufferNumber,unsigned int PageAddr,unsigned int ByteAddr,
  27.                                                    unsigned char *Data,       unsigned int ByteNum)
  28. {
  29.    unsigned int i;
  30.    if((ByteNum<=(528-ByteAddr))&&(ByteNum>0))
  31.    {
  32.       while(!(StatusRegisterRead()&0x80));
  33.       SPI_CS_LOW();
  34.       switch(BufferNumber)
  35.       {
  36.         case 1: SPI_WriteByte(0x82);break;//
  37.         case 2: SPI_WriteByte(0x85);break;//
  38.       }
  39.       SPI_WriteByte((unsigned char)( PageAddr>>6));
  40.       SPI_WriteByte((unsigned char)((PageAddr<<2)|(ByteAddr>>8)));
  41.       SPI_WriteByte((unsigned char)  ByteAddr);
  42.       for(i=0;i<ByteNum;i++)
  43.       {
  44.          SPI_WriteByte(Data[i]);
  45.       }
  46.       SPI_CS_HIGH();
  47.       return PASSED;
  48.   }
  49.   return FAILED;
  50. }
复制代码
| 2018-12-1 10:09 | 显示全部楼层
我有点看不懂,新手
 楼主 | 2018-12-1 11:19 | 显示全部楼层
qw507169008 发表于 2018-12-1 10:09
我有点看不懂,新手

没事,接触时间长了就熟悉了
 楼主 | 2018-12-1 11:20 | 显示全部楼层





这是芯片资料

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

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

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

你在读取数据前关闭全局中断,读取完毕再打开
试试还有没有错误
| 2018-12-7 14:24 | 显示全部楼层
cainiao518 发表于 2018-12-7 10:43
在读取数据时,就会出现错误的数据,例如一次读取64字节,地址是变化的
Continuous_Array_Read(page_addr ...

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

好的
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

快速回复 返回顶部 返回列表