搜索
查看: 3372|回复: 9

[求助] W25Q16在执行了擦除之后,不能立刻写,否则出出现写不进...

[复制链接]

该用户从未签到

54

主题

344

帖子

33

蝴蝶豆

金牌会员

最后登录
2021-8-19
发表于 2019-9-20 13:57:22 | 显示全部楼层 |阅读模式
W25Q16在执行了擦除之后,不能立刻写,否则会出现多次写不进,我在擦除后面加了延时,就没有问题了,这是为什么?
回复

使用道具 举报

该用户从未签到

14

主题

736

帖子

256

蝴蝶豆

论坛元老

最后登录
2021-4-20
发表于 2019-10-10 09:19:30 | 显示全部楼层
执行擦除后读取忙标志没有  因为擦除需要时间的  执行完擦除指令后可以加延时  也可以等待忙标志结束  擦除完成以后才可以写数据
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2019-10-11 18:02:13 | 显示全部楼层
半导体工艺的原因,擦除是要花一定时间的,可以参考一下手册
回复 支持 反对

使用道具 举报

该用户从未签到

54

主题

344

帖子

33

蝴蝶豆

金牌会员

最后登录
2021-8-19
 楼主| 发表于 2019-10-11 22:36:47 | 显示全部楼层
mylovemcu 发表于 2019-10-10 09:19
执行擦除后读取忙标志没有  因为擦除需要时间的  执行完擦除指令后可以加延时  也可以等待忙标志结束  擦除 ...

我的擦除函数中增加了等待忙结束的标志,可是还得加延时,不知道为什么?
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

736

帖子

256

蝴蝶豆

论坛元老

最后登录
2021-4-20
发表于 2019-10-12 08:08:46 | 显示全部楼层
watercici 发表于 2019-10-11 22:36
我的擦除函数中增加了等待忙结束的标志,可是还得加延时,不知道为什么? ...

不能吧  忙标志写的有没有问题  确认一下  起作用了没有
我的就是等待完忙标志直接写的啊  没有问题的
回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2019-10-13 20:17:38 | 显示全部楼层
楼主最好把代码贴一下,这样好分析问题。
回复 支持 反对

使用道具 举报

该用户从未签到

54

主题

344

帖子

33

蝴蝶豆

金牌会员

最后登录
2021-8-19
 楼主| 发表于 2019-10-18 09:01:17 | 显示全部楼层
安 发表于 2019-10-13 20:17
楼主最好把代码贴一下,这样好分析问题。
  1. Flash_PagePro(Flash_Load_Init_Value,HeadAddr,0x10);
  2.                
  3.                 Flash_Load_Data();
  4.        
  5.                 Flash_Sector_Erase(WriteInitValueAddr);//如果不在这个擦除之后写延迟,那么下面的写会出现偶尔写不进去的时候

  6.                 Flash_PagePro(Flash_Init_Value,WriteInitValueAddr,0x02);//

  7.                 Flash_Read_Data(WriteInitValueAddr,0x02,Flash_Read_Init_Value);
复制代码


void Flash_Sector_Erase(u32 addr)
{
        u8 sadr1,sadr2,sadr3;
        sadr1 = (addr & 0xff0000)>>16;
        sadr2 = (addr & 0xff00)>>8;
        sadr3 = addr & 0xff;
       
        Flash_WaitforWriteEnd();
        Flash_Write_EnorDis(ENABLE);//0x06
       
        SPI2_Flash_CS_LOW();
        SPI_FLASH_SendByte(SECTOR_ERASE);
       
        SPI_FLASH_SendByte(sadr1);
        SPI_FLASH_SendByte(sadr2);
        SPI_FLASH_SendByte(sadr3);
        SPI2_Flash_CS_HIGH();
       
  Flash_WaitforWriteEnd();
       
       
}

void Flash_PagePro(u8 *Pdat,u32 addr,u16 Len)
{
  u8 padr1,padr2,padr3;
        u8 i;
        padr1 = (addr & 0xff0000)>>16;
        padr2 = (addr & 0xff00)>>8;
        padr3 = addr & 0xff;
       
        Flash_WaitforWriteEnd();
       
        Flash_Write_EnorDis(ENABLE);
       
        SPI2_Flash_CS_LOW();
        SPI_FLASH_SendByte(PAGE_PROGRAM);//Ò³±à³Ì0x02
        SPI_FLASH_SendByte(padr1);
        SPI_FLASH_SendByte(padr2);
        SPI_FLASH_SendByte(padr3);
       
        for(i=0;i<Len;i++)
        {
                SPI_FLASH_SendByte(Pdat);
        }       
         SPI2_Flash_CS_HIGH();
       
         Flash_WaitforWriteEnd();

}
回复 支持 反对

使用道具 举报

该用户从未签到

54

主题

344

帖子

33

蝴蝶豆

金牌会员

最后登录
2021-8-19
 楼主| 发表于 2019-10-18 09:01:48 | 显示全部楼层
mylovemcu 发表于 2019-10-12 08:08
不能吧  忙标志写的有没有问题  确认一下  起作用了没有
我的就是等待完忙标志直接写的啊  没有问题的 ...

是这样的,代码你已贴在楼下了,你帮忙看看
回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2019-10-21 09:46:45 | 显示全部楼层
我的操作是先操作打开指令,然后在判断忙状态,再进行擦写,再判断忙状态,再关闭写入指令。
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2019-11-1 17:41:07 | 显示全部楼层
我记得手册中有介绍,在擦除时会有一个标志位WIP , 用来检测擦除或者编程是否完成。建议在发送新命令之前查询一下这个标志
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 03:55 , Processed in 0.184177 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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