OpenEdv-开源电子网

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

关于W25X16的块区保护问题

[复制链接]

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2015-3-11
在线时间
9 小时
发表于 2015-5-22 17:33:13 | 显示全部楼层 |阅读模式
5金钱
这段时间需要用到存储这部分,使用的是存储芯片W25X16,程序的写法是照原子老师一样,对扇区操作中添加是否写入地址为0xff的判断和自动换页功能。现在有个问题是,我的一些重要的参数,如系统设置的参数需要存在前100个地址中了,这前100个数据是不能顺便删除的,后面剩余的为一些系统运行的历史记录。若是需要删除删除按键后可以把历史记录部分的数据删除   但是 但是前面的100个系统的参数不可以删除的。

所以我就使用的W25X16中所说的块区保护  "BP2 BP1 BP0"  我写状态寄存器的 后对块区31进行保护设置,但是我点击删除按键后这个写保护似乎对芯片的全部地址进行了保护,保护31块区的数据保留但是没有保护的块区0中的数据也是删除不掉的。。。让我很郁闷啊??。

程序流程:程序初始化引脚 时钟 外设 ---->读出ID码---->按键(SW4写入按键 写入内容到块区0中  地址0为起始地址,写入内容到块区31中  地址31*65536)、(按键SW5按键读数据内容,读取指定地址为起始点的指定长度的内容。读取地址0处和地址31*65536开始开始处的内容)、(SW3 删除键,在删除键按下后写状态寄存器设置块区31位保护状态,然后执行删除函数执行删除芯片操作,删除之后 重新写状态寄存器恢复为全部新片无块区保护区域)。。
 
哪位做过的看看是什么地方出了问题,,谢谢。。
void w25x16_test(void)
 {
u16 i=0;
u8 datatemp[SIZE]={0};
JTAG_Set(1);          //关闭JTAG,开启SWD,目的是为了使用SPI3管脚
  SPI_Flash_Init();     //SPI FLASH 初始化 
  key_init();

while(SPI_Flash_ReadID()!=FLASH_ID)//检测不到W25X16 
{   
i=SPI_Flash_ReadID();
printf("ID:%x \r\n",i);
printf("W25X16 Check Doing! \r\n");
delay_ms(600);
// printf("Please Check! \r\n");
delay_ms(600);
}
printf("W25X16 Check OK! \r\n");
printf("SIZE = %d\n",SIZE);
while(1)
{
   
if (SW4 == Bit_RESET) //按键SW4写入保存内容
 {
  delay_ms(10);
if (SW4 == Bit_SET) //SW4按下,写入SPI FLASH
 {
 SPI_Flash_Write((u8*)TEXT_Buffer,0,SIZE);
     SPI_Flash_Write((u8*)TEXT_Buffer,2031616,SIZE);
 printf("W25X16 Write Finished!\r\n");
      }
  }

if (SW5 == Bit_RESET) 
 {
  delay_ms(10);
if (SW5 == Bit_SET) //SW5按下,读出SPI FLASH 的数据
 {
SPI_Flash_Read(datatemp,0,SIZE);
 printf("The Data Readed end Is:%s\n",datatemp);//读块区0
Delete_array(SIZE,datatemp);                   //清除读取缓冲区中的数据内容
printf("After Delete:%s\n",datatemp);
 SPI_Flash_Read(datatemp,2031616,SIZE);         //读块区31
 printf("The Data Readed end Is:%s\n",datatemp);//提示传送完成
Delete_array(SIZE,datatemp);                   //清除读取缓冲区中的数据内容
printf("After Delete:%s\n",datatemp);
     } 
 }

if (SW3 == Bit_RESET)  //数据芯片删除按键
 {
  delay_ms(10);
if (SW3 == Bit_SET) //SW3按下,擦除数据
 {
SPI_FLASH_Write_SR(0x04); //写状态寄存器的存储保护模块,实现对块区31实现只读。
delay_ms(500);
printf("state = %x\n",SPI_Flash_ReadSR());
SPI_Flash_Erase_Chip();
printf("The chip is erased ok!\n");
SPI_FLASH_Write_SR(0x00);//恢复芯片状态使其进入全部的可编程状态
delay_ms(500);
printf("state = %x\n",SPI_Flash_ReadSR());
}

}
  }

   
   }

Relax everything is ok!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-22 19:44:29 | 显示全部楼层
建议你这100个字节单独占一个扇区得了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2015-3-11
在线时间
9 小时
 楼主| 发表于 2015-5-23 11:06:12 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子老师你说的单独占一个扇区是不是考虑到了保护一个块区就为了这100个字节不是太合适是吧,,,嗯是的有点不合适的。那摩我需要把这100个字节存储在第一个扇区,在删除这100个字节以外的数据情况是不是就要用扇区删除命令把第二个扇区之后的所有扇区删除掉,这样的方式来保护存储100个字节的第一个扇区。这种思路行不行得通、 还有没有别的方法呢?

PDF上说的这个块区保护是怎么实现的,资料说有这个块区保护的功能,为什么我的实现不了呢...肯定是有些地方忽略掉了吧?存储功能比较常用我想搞明白这是为什么实现不了呢?
Relax everything is ok!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-23 23:42:51 | 显示全部楼层
回复【3楼】gzyavr:
---------------------------------
pdf的保护,不是以字节为单位的!!
都是以扇区,至少是4K字节为单位的.

用我说的那种方式就好了,没什么难的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2015-3-11
在线时间
9 小时
 楼主| 发表于 2015-5-24 11:49:48 | 显示全部楼层
好的,谢谢谢谢
Relax everything is ok!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 01:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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