watercici 发表于 2019-9-20 13:57:22

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

W25Q16在执行了擦除之后,不能立刻写,否则会出现多次写不进,我在擦除后面加了延时,就没有问题了,这是为什么?

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
楼主最好把代码贴一下,这样好分析问题。

Flash_PagePro(Flash_Load_Init_Value,HeadAddr,0x10);
               
                Flash_Load_Data();
       
                Flash_Sector_Erase(WriteInitValueAddr);//如果不在这个擦除之后写延迟,那么下面的写会出现偶尔写不进去的时候

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

                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 , 用来检测擦除或者编程是否完成。建议在发送新命令之前查询一下这个标志:)
页: [1]
查看完整版本: W25Q16在执行了擦除之后,不能立刻写,否则出出现写不进...