初级会员

- 积分
- 67
- 金钱
- 67
- 注册时间
- 2015-3-11
- 在线时间
- 9 小时
|
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());
}
}
}
}
|
|