你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
watercici 提问时间:2019-9-20 13:57 /
W25Q16在执行了擦除之后,不能立刻写,否则会出现多次写不进,我在擦除后面加了延时,就没有问题了,这是为什么?
收藏 评论9 发布时间:2019-9-20 13:57

举报

9个回答
mylovemcu 回答时间:2019-10-10 09:19:30
执行擦除后读取忙标志没有  因为擦除需要时间的  执行完擦除指令后可以加延时  也可以等待忙标志结束  擦除完成以后才可以写数据
butterflyspring 回答时间:2019-10-11 18:02:13
半导体工艺的原因,擦除是要花一定时间的,可以参考一下手册
watercici 回答时间:2019-10-11 22:36:47
mylovemcu 发表于 2019-10-10 09:19
执行擦除后读取忙标志没有  因为擦除需要时间的  执行完擦除指令后可以加延时  也可以等待忙标志结束  擦除 ...

我的擦除函数中增加了等待忙结束的标志,可是还得加延时,不知道为什么?
mylovemcu 回答时间:2019-10-12 08:08:46
watercici 发表于 2019-10-11 22:36
我的擦除函数中增加了等待忙结束的标志,可是还得加延时,不知道为什么? ...

不能吧  忙标志写的有没有问题  确认一下  起作用了没有
我的就是等待完忙标志直接写的啊  没有问题的
废鱼 回答时间:2019-10-13 20:17:38
楼主最好把代码贴一下,这样好分析问题。
watercici 回答时间: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();

}
watercici 回答时间:2019-10-18 09:01:48
mylovemcu 发表于 2019-10-12 08:08
不能吧  忙标志写的有没有问题  确认一下  起作用了没有
我的就是等待完忙标志直接写的啊  没有问题的 ...

是这样的,代码你已贴在楼下了,你帮忙看看
废鱼 回答时间:2019-10-21 09:46:45
我的操作是先操作打开指令,然后在判断忙状态,再进行擦写,再判断忙状态,再关闭写入指令。
butterflyspring 回答时间:2019-11-1 17:41:07
我记得手册中有介绍,在擦除时会有一个标志位WIP , 用来检测擦除或者编程是否完成。建议在发送新命令之前查询一下这个标志

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版