OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 114|回复: 7

W25N01读取时发现总是读的最后一次存储的数据

[复制链接]

6

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-8-10
在线时间
20 小时
发表于 2024-11-12 10:25:24 | 显示全部楼层 |阅读模式
5金钱
W25N01读取时发现总是读的最后一次存储的数据,比如W25Nx_Buf_Write_Nx_Data( cun1,  0, 0,  0,  5);                W25Nx_Buf_Write_Nx_Data( cun2,  2, 2,  0,  5);       

        W25_Read(shou1,0,1,0,5);
        W25_Read(shou2,2,2,0,5);
然后shou1,shou2这两个数组读取出来的全是cun2的数据,明明不同块也不同页,地址在仿真里看的也没啥问题啊


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2024-11-12 21:41:24 | 显示全部楼层
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4584
金钱
4584
注册时间
2015-1-10
在线时间
573 小时
发表于 2024-11-13 10:36:35 | 显示全部楼层
示波器逻辑分析仪看看信号先
回复

使用道具 举报

4

主题

881

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4195
金钱
4195
注册时间
2019-9-4
在线时间
881 小时
发表于 2024-11-13 12:16:52 | 显示全部楼层
底层驱动较大概率问题。试下同块不同页能不能正常。你这个芯片不怎么了解,W25QXX系列的芯片,是有超出地址范围就会重头开始的机制的,就是地址范围1~1024,你写1025地址实际上写的是1地址
回复

使用道具 举报

6

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-8-10
在线时间
20 小时
 楼主| 发表于 2024-11-13 16:15:42 | 显示全部楼层

我试了好几种修改方式,然后发现偶尔把读取的那句函数和存储的函数放在一起(while循环里分页存储然后读取)读取的是正确的,其他方式都不行,这种是写有问题还是读有问题啊
回复

使用道具 举报

6

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-8-10
在线时间
20 小时
 楼主| 发表于 2024-11-13 16:17:56 | 显示全部楼层
A571157242 发表于 2024-11-13 12:16
底层驱动较大概率问题。试下同块不同页能不能正常。你这个芯片不怎么了解,W25QXX系列的芯片,是有超出地址 ...

最奇葩的是不同块不同页竟然也是一样的,这种是不是写有问题啊,我该多加点延时?
回复

使用道具 举报

6

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-8-10
在线时间
20 小时
 楼主| 发表于 2024-11-13 16:19:56 | 显示全部楼层
阿侑kevin 发表于 2024-11-13 10:36
示波器逻辑分析仪看看信号先

咋看?我现在在仿真里看着每次要存的时候的那个数组里面字节内容是不同的,很奇怪读出来就一样了
回复

使用道具 举报

6

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-8-10
在线时间
20 小时
 楼主| 发表于 2024-11-13 16:46:23 | 显示全部楼层
  1. //写入起始地址为:块地址BlockAddr(0~1023),页地址PageAddr(0~63),具体字节地址BytesAddr(0~2047)的连续Size个数据,数据个数(0~65535)
  2. w25n_status_t W25Nx_Buf_Write_Nx_Data(uint8_t *pData, uint16_t BlockAddr, uint8_t PageAddr, uint16_t BytesAddr, uint16_t Size)
  3. {
  4.         uint8_t cmd[7];
  5.         uint16_t i;

  6.         uint8_t Page_data[i];
  7.         /* Configure the command */
  8.         cmd[0] = WRITE_DATA_CMD;   //0x02                             //数据装入缓冲区命令
  9.         cmd[1] = (uint8_t)((BytesAddr >> 8) & 0x07);
  10.         cmd[2] = (uint8_t)(BytesAddr & 0xFF);
  11.        
  12.         cmd[3] = WRITE_INPUT_PAGE_ADDR_CMD;   //0x10                  //程序执行,写入主存区命令
  13.         cmd[4] = Dummy_Byte;
  14.         cmd[5] = (uint8_t)((BlockAddr >> 2) & 0xFF);           //主存区页地址
  15.         cmd[6] = (uint8_t)(((BlockAddr << 6)+PageAddr) & 0xFF);
  16.        

  17.        
  18.         //先赋三个命令在开头
  19.                 for(i=0;i<3;i++)         
  20.                 {
  21.                         Page_data[i] = cmd[i];
  22.                 }
  23.                 md_delay_1ms(10);
  24.                 for(i=3;i<(Size + 3);i++)          //存储页数据
  25.                 {
  26.                         Page_data[i] = *pData;
  27.                         pData++;               
  28.                 }
  29.                
  30.                
  31.                 W25Q32_CS_CLR();
  32.                 if(ald_spi_send_byte_fast(&h_spi, WRITE_ENABLE_CMD) != OK)
  33.                 {
  34.                         W25Q32_CS_SET();
  35.                         return W25N_ERROR;
  36.                 }
  37.                 W25Q32_CS_SET();
  38.                 md_delay_1ms(10);
  39.                 //md_delay_us(100);
  40.                 W25Q32_CS_CLR();
  41.                 for(i=0;i<(Size + 3);i++)
  42.                 {
  43.                         if (ald_spi_send_byte_fast(&h_spi, Page_data[i]) != OK)
  44.                         {
  45.                                 W25Q32_CS_SET();
  46.                                 return W25N_ERROR;
  47.                         }
  48.                 }
  49.                 W25Q32_CS_SET();
  50.                 //        md_delay_us(100);
  51.                 md_delay_1ms(10);
  52.                 W25Q32_CS_CLR();
  53.                 for(i=3;i<7;i++)//写剩余指令
  54.                 {
  55.                         if (ald_spi_send_byte_fast(&h_spi, cmd[i]) != OK)
  56.                                 {
  57.                                         W25Q32_CS_SET();
  58.                                 }
  59.                 }


  60.                 W25_Wait_Busy();
  61.         W25Q32_CS_SET();
  62.                 return W25N_OK;

  63.        
  64.        
  65. }

  66. /***********************************************************************************************
  67. **     name: W25_PageDataRead
  68. ** function: 读取指定页地址的数据,并移动到缓冲区
  69. **parameter: BlockAddr 写入的块地址(0-1023)
  70.              PageAddr  写入的页地址(0-63)  
  71. **   return: void

  72. ************************************************************************************************/

  73. void W25_PageDataRead(uint16_t BlockAddr,uint8_t PageAddr)
  74.         {
  75.                 uint16_t i = 0;

  76.                 uint8_t cmd[4];
  77.        

  78.         cmd[0] = PAGE_READ_CMD;                                           //主存区页数据传至缓冲区
  79.         cmd[1] = Dummy_Byte;
  80.         cmd[2] = (uint8_t)((BlockAddr >> 2) & 0xFF);                      //页地址
  81.         cmd[3] = (uint8_t)(((BlockAddr << 6)|PageAddr) & 0xFF);        
  82.         W25Q32_CS_CLR();   
  83.                 if (ald_spi_send_byte_fast(&h_spi, PAGE_READ_CMD) != OK) {
  84.                 W25Q32_CS_SET();       
  85.         }
  86.             for (i = 0; i < 4; i++)
  87.         {
  88.                 if (ald_spi_send_byte_fast(&h_spi, cmd[i]) != OK) {
  89.                         W25Q32_CS_SET();
  90.                 }
  91.         }                           
  92.         W25Q32_CS_SET();       
  93.                 W25_Wait_Busy();
  94. }
  95.         /***********************************************************************************************
  96. **     name: W25_Read
  97. ** function: 读取SPI FLASH,在指定地址开始读取指定长度的数据
  98. **parameter: pBuffer 数据存储区
  99.              BytesAddr 写入的具体字节地址(0-1023)
  100.                                                  BlockAddr 写入的块地址(0-1023)
  101.              PageAddr  写入的页地址(0-63)
  102.              NumByteToWrite 要写入的数据个数(0-65535),该数不应该超过该页的剩余字节数!!!
  103. **   return: void
  104. 需要改造,和W25N.C文件里可以写多页的函数整合
  105. ************************************************************************************************/
  106. void W25_Read(uint8_t* pBuffer,uint16_t BlockAddr,uint8_t PageAddr,uint16_t BytesAddr,uint16_t NumByteToRead)
  107.         {
  108.        
  109.         uint16_t i = 0;
  110.                 uint8_t cmd[4];
  111.        
  112. int r_flag = 0;
  113.         cmd[0] = READ_CMD;                                                //读出缓冲区数据
  114.         cmd[1] = (uint8_t)((BytesAddr >> 8) & 0x07);
  115.         cmd[2] = (uint8_t)(BytesAddr & 0xFF);
  116.         cmd[3] = Dummy_Byte;
  117.        
  118.         W25_PageDataRead(BlockAddr,PageAddr);                  //先读取页地址数据,送到缓冲区
  119.                 md_delay_1ms(10);
  120.        
  121.                 W25Q32_CS_CLR();                                              //使能器件  
  122.          for (i = 0; i < 4; i++)
  123.         {
  124.                 if (ald_spi_send_byte_fast(&h_spi, cmd[i]) != OK) {
  125.                         W25Q32_CS_SET();
  126.                 }
  127.         }
  128.         for(i = 0; i < NumByteToRead; i++){  
  129.                 pBuffer[i] = ald_spi_recv_byte_fast(&h_spi, &r_flag);                  //循环读数  
  130.        
  131.         if (r_flag != OK) {
  132.                         W25Q32_CS_SET();
  133.                        
  134.                 }
  135.         }
  136.        
  137.                 W25Q32_CS_SET();                                         
  138. }  
复制代码


这是读写的函数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 01:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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