OpenEdv-开源电子网

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

SPI Flash擦除操作问题

[复制链接]

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2013-12-8 22:48:29 | 显示全部楼层 |阅读模式
今天调试SPI程序,终于可以读写了,刚才看到帖子有人说重复往一个扇区写内容要先擦除,然后我就试了下往我刚才写的地址写个新的字符串,在写之前加入了扇区擦除函数,但是读出数据时不对了,如果往其他地址写内容则读出正确,说明擦除部分有问题,帮我看看哪里错了?主函数相关代码:
while(1)
  {
KeyVal=KEY_Scan(0);
if(KeyVal==1)
{
Flash_SectorErase(FLASH_SIZE-4096);//写之前先擦除写过的扇区
LCD_ShowString(50,180,200,16,16,"Start Write W25Q64...");
Write_Flash((u8*)Test_Buff,FLASH_SIZE-50,SIZE);
}
if(KeyVal==3)
{
LCD_ShowString(50,180,200,16,16,"Start Read W25Q64...");
Read_Flash(temp,FLASH_SIZE-50,SIZE);
LCD_ShowString(50,220,200,16,16,temp);
LCD_ShowString(50,250,200,16,16,"Read W25Q64 Finished!");
}
  }
我想问的是擦除函数的入口地址是要擦除的扇区的首地址吗?如果我要往最后一个扇区重写内容,是不是Flash_SectorErase(FLASH_SIZE-4096)?
扇区擦除函数
void Flash_SectorErase(u32 S_ADD)
{
F_CS=0;
Wait_Flash_Busy();
SPI_ReadWriteByte(W25X_WriteEnable);
SPI_ReadWriteByte(W25X_SectorErase);
SPI_ReadWriteByte((u8)(S_ADD>>16));
SPI_ReadWriteByte((u8)(S_ADD>>8));
SPI_ReadWriteByte((u8)S_ADD);
Wait_Flash_Busy();
F_CS=1;
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
 楼主| 发表于 2013-12-8 22:50:52 | 显示全部楼层
这个写函数Write_Flash()函数是参照原子哥的程序自己写的,可以换页写,但是没有检查擦除功能,所以重写之前要先擦除扇区
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-8 23:27:58 | 显示全部楼层
我们有另外一个函数,是带擦除的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
 楼主| 发表于 2013-12-9 10:00:41 | 显示全部楼层
恩,我知道,我是想问如果单独用这个擦除函数,Flash_SectorErase();这里面的参数是擦除扇区的首地址吗?比如擦除最后一个扇区是FLASH_SIZE-4096吗?还是这个扇区内的任一地址,都能擦除整个扇区?为什么这样擦除不对呢,读出来的不是完整的字符串
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-9 10:18:04 | 显示全部楼层
回复【4楼】hechao3225:
---------------------------------
这个函数是擦除扇区,他的入库口参数,必须是扇区首地址.注意函数里面是乘了4096的!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-9 11:11:56 | 显示全部楼层
回复【4楼】hechao3225:
---------------------------------
楼主可以看下FLASH数据手册里面关于擦除的说明,擦除最小都是4K
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
 楼主| 发表于 2013-12-9 11:23:44 | 显示全部楼层
找到问题了。。擦除函数写的有问题,写使能后要关闭片选,判忙后再打开片选。或者把前三行写成子函数SPI_FLASH_Write_Enable();判忙后再开启片选,我试了发送写使能后不关闭片选直接判忙就不行。不明白为什么要这样。。
F_CS=0;
SPI_ReadWriteByte(W25X_WriteEnable);
F_CS=1;
                          //SPI_FLASH_Write_Enable();
Wait_Flash_Busy();
F_CS=0;
SPI_ReadWriteByte(W25X_SectorErase);
SPI_ReadWriteByte((u8)(S_ADD>>16));
SPI_ReadWriteByte((u8)(S_ADD>>8));
SPI_ReadWriteByte((u8)S_ADD);
F_CS=1;
        Wait_Flash_Busy();
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
 楼主| 发表于 2013-12-9 11:24:40 | 显示全部楼层
谢谢原子哥和Space的回答,虽然问题找出来了,感觉还是好坑爹
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-10 13:03:19 | 显示全部楼层
回复【8楼】hechao3225:
---------------------------------
你仔细看下数据手册上面给出的操作时序图和说明文字你就明白了,我的理解是这样的,不知道对不对

因为你是在向flash发送数据,这时候你的片选是低电平(选中芯片),但是在发送完成之后你的片选没有取消,这时芯片还是认为你在发送数据,所以当你在读取忙信号的时候所发送的命令字节就当数据处理了,如果你发完数据之后取消片选然后在读取判忙的话,这是你发过去的命令字节就有效

可以做个实验验证一下的,但是我没做过,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
 楼主| 发表于 2013-12-10 16:31:50 | 显示全部楼层




确实啊,没有认真看到手册的说明,发完写使能和擦除命令后要拉高片选,而且拉高片选后最好判忙再处理,以后要多注意认真看手册了!






  谢谢!!
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
 楼主| 发表于 2013-12-10 16:34:33 | 显示全部楼层
我还查了相关资料,这款flash写使能后有15Ms的状态时间,所以拉高片选后必须判忙。。长教训了,以后要仔细一点。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 16:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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