OpenEdv-开源电子网

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

w25Q128怎么会部分地址写入失败?是坏块吗?

[复制链接]

17

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2020-1-15
在线时间
39 小时
发表于 2020-2-19 21:34:24 | 显示全部楼层 |阅读模式
1金钱
用的是正点原子提供的代码

已经可以正常读写了,然而有部分地址无法写入;
代码逻辑是我先整个芯片擦除,那么里面存的就应该全部是0XFF,然后写入某个地址后立即读取,发现有部分地址无法写入
是我地址格式不对吗?各位大佬如果知道麻烦说一下,非常感谢啊!


代码比较长,简单来说就是

W25QXX_Erase_Chip();//先初始化,里面全是0xff
W25QXX_Write  (temp    ,FLASH_SIZE   ,  10   );//先写入,temp里面是123456789
  W25QXX_Read  (tempr   ,FLASH_SIZE   ,  10   );//读出,到tempr
        for(int i=0;i<len;i++)
        {
                printf(" %d ",*(tempr+i));//打印出来
        }


实测也就是如下4个地址无法写入,打印的结果在下面,很奇怪,我的格式错了吗?

W25QXX_Write  (temp    ,FLASH_SIZE   -0xFF,  10   );
W25QXX_Write  (temp    ,FLASH_SIZE   -0xFF42FF,  10   );
W25QXX_Write  (temp    ,FLASH_SIZE   -0xFF23FF,  10   );
W25QXX_Write  (temp    ,FLASH_SIZE   -0xFF00FF,  10   );
  1. u8 temp[10] ={1,2,3,4,5,6,7,8,9,10};
  2.   u8 tempr[10];
  3.   memset(tempr,0,10);
  4.   u32 FLASH_SIZE =0X1000000u;
  5.   u16 len=10;

  6.   ID=W25QXX_ReadID();
  7.   printf("\nID =%x\n",ID);

  8.   W25QXX_Erase_Chip();

  9.   printf("\n----------------------------------\n");
  10.   W25QXX_Write  (temp    ,FLASH_SIZE   ,  10   );
  11.   W25QXX_Read  (tempr   ,FLASH_SIZE   ,  10   );
  12.         for(int i=0;i<len;i++)
  13.         {
  14.                 printf(" %d ",*(tempr+i));
  15.         }

  16. printf("\n----------------------------------\n");
  17. W25QXX_Write  (temp    ,FLASH_SIZE-100   ,  10   );
  18. W25QXX_Read  (tempr   ,FLASH_SIZE-100   ,  10   );
  19.         for(int i=0;i<len;i++)
  20.         {
  21.                 printf(" %d ",*(tempr+i));
  22.         }

  23. printf("\n----------------------------------\n");
  24. W25QXX_Write  (temp    ,FLASH_SIZE   -0xFFFF,  10   );
  25. W25QXX_Read  (tempr   ,FLASH_SIZE   -0xFFFF,  10   );
  26.         for(int i=0;i<len;i++)
  27.         {
  28.                 printf(" %d ",*(tempr+i));
  29.         }

  30. printf("\n----------------------------------\n");
  31. W25QXX_Write  (temp    ,FLASH_SIZE   -0xFF00FF,  10   );
  32. W25QXX_Read  (tempr   ,FLASH_SIZE   -0xFF00FF,  10   );
  33.         for(int i=0;i<len;i++)
  34.         {
  35.                 printf(" %d ",*(tempr+i));
  36.         }

  37. printf("\n----------------------------------\n");
  38. W25QXX_Write  (temp    ,FLASH_SIZE   -0xFF23FF,  10   );
  39. W25QXX_Read  (tempr   ,FLASH_SIZE   -0xFF23FF,  10   );
  40.         for(int i=0;i<len;i++)
  41.         {
  42.                 printf(" %d ",*(tempr+i));
  43.         }

  44. printf("\n----------------------------------\n");
  45. W25QXX_Write  (temp    ,FLASH_SIZE   -0xFF42FF,  10   );
  46. W25QXX_Read  (tempr   ,FLASH_SIZE   -0xFF42FF,  10   );
  47.         for(int i=0;i<len;i++)
  48.         {
  49.                 printf(" %d ",*(tempr+i));
  50.         }

  51. printf("\n----------------------------------\n");
  52. W25QXX_Write  (temp    ,FLASH_SIZE   -0xFF,  10   );
  53. W25QXX_Read  (tempr   ,FLASH_SIZE   -0xFF,  10   );
  54.         for(int i=0;i<len;i++)
  55.         {
  56.                 printf(" %d ",*(tempr+i));
  57.         }

  58. printf("\n----------------------------------\n");
  59. W25QXX_Write  (temp    ,FLASH_SIZE   -FLASH_SIZE,  10   );
  60. W25QXX_Read  (tempr   ,FLASH_SIZE   -FLASH_SIZE,  10   );
  61.         for(int i=0;i<len;i++)
  62.         {
  63.                 printf(" %d ",*(tempr+i));
  64.         }
  65. printf("\n----------------------------------\n");
  66.   while (1)
  67.   {
  68.           ID=W25QXX_ReadID();
  69.           printf("\nID =%x\n",ID);


  70. //          printf("\n----------------[loop %d]-----------------------\n",loop++);
  71.           HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
  72.           HAL_Delay(300);
  73.           HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
  74.           HAL_Delay(300);
  75.           loop=(loop>0xffff)?0:loop;

  76. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  77. 打印结果

  78. ----------------------------------
  79. 1  2  3  4  5  6  7  8  9  10
  80. ----------------------------------
  81. 1  2  3  4  5  6  7  8  9  10
  82. ----------------------------------
  83. 255  255  255  255  255  255  255  255  255  255
  84. ----------------------------------
  85. 255  255  255  255  255  255  255  255  255  255
  86. ----------------------------------
  87. 255  255  255  255  255  255  255  255  255  255
  88. ----------------------------------
  89. 255  255  255  255  255  255  255  255  255  255
  90. ----------------------------------
  91. 1  2  3  4  5  6  7  8  9  10
  92. ----------------------------------
  93. 1  2  3  4  5  6  7  8  9  10
  94. ----------------------------------
复制代码




最佳答案

查看完整内容[请看2#楼]

自问自答了; 一开始把调试方向放在了硬件初始化上,实际上弄错了,硬件初始化没问题。 u16 W25QXX_TYPE=W25Q256; //默认是W25Q256 关键在于这里,原子哥的代码初始化会读取ID,然后赋值给W25QXX_TYPE,这里被我误删了,导致后续的地址位出错了,也就导致了某些地址位可以写入,而某些写不进。 这也就是代码习惯问题,我习惯初始化都是0,原子哥初始化给了一个TYPE值,我想当然的以为初始化是0,导致了这个错误。 以及原 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2020-1-15
在线时间
39 小时
 楼主| 发表于 2020-2-19 21:34:25 | 显示全部楼层
自问自答了;
一开始把调试方向放在了硬件初始化上,实际上弄错了,硬件初始化没问题。

u16 W25QXX_TYPE=W25Q256;        //默认是W25Q256
关键在于这里,原子哥的代码初始化会读取ID,然后赋值给W25QXX_TYPE,这里被我误删了,导致后续的地址位出错了,也就导致了某些地址位可以写入,而某些写不进。
这也就是代码习惯问题,我习惯初始化都是0,原子哥初始化给了一个TYPE值,我想当然的以为初始化是0,导致了这个错误。

以及原子哥不知为何,在SPI初始化后,又设置了一次速率,这个函数我删掉了也运行正常,用cubeIDE直接生成的初始化代码。
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
    assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性
    __HAL_SPI_DISABLE(&SPI2_Handler);            //关闭SPI
    SPI2_Handler.Instance->CR1&=0XFFC7;          //位3-5清零,用来设置波特率
    SPI2_Handler.Instance->CR1|=SPI_BaudRatePrescaler;//设置SPI速度
    __HAL_SPI_ENABLE(&SPI2_Handler);             //使能SPI
   
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-2-19 23:20:58 | 显示全部楼层
我倒是还没遇到过能读写,而出现坏块的SPI FLASH。。。。 建议你找找代码的bug
回复

使用道具 举报

17

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2020-1-15
在线时间
39 小时
 楼主| 发表于 2020-2-20 21:05:57 | 显示全部楼层
正点原子 发表于 2020-2-19 23:20
我倒是还没遇到过能读写,而出现坏块的SPI FLASH。。。。 建议你找找代码的bug

谢谢原子哥回复。
有一个初始化的值我想当然了,结果就弄错了,修改好了。非常感谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 17:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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