打印
[STM8]

W25 Flash数据读写错误

[复制链接]
1501|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
爱好学习者|  楼主 | 2018-11-9 18:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用STM8L芯片、W25Q16Flash,先将要存储的扇区1数据读出放入备用扇区0,将数据修改后,再讲修改的数据和备用扇区0的数据,存回扇区1,但是存储的过程中,要么数据存不进去,要么存入的数据有问题,请各位帮忙看下是什么问题?
void Write_Admin_Passord(uc *p,uc passordNum)
{

        ui i,n;

        uc flashBuffer[256];
       
        W25q16_Erasure(0);
       
        for(n = 0;n < 16;n++)
        {
                W25Q16_Read(4096+n*256,flashBuffer,256);
               
                W25Q16_Write(n*256,flashBuffer,256);
        }

        W25q16_Erasure(1);

        W25Q16_Read(4096,flashBuffer,256);
       
        for(i = 0;i < passordNum;i++)
                flashBuffer[i] = p[i];
               
        W25Q16_Write(4096,flashBuffer,256);
       
        for(n = 1;n < 16;n++)
        {
                W25Q16_Read(n*256,flashBuffer,256);
               
                W25Q16_Write(4096+n*256,flashBuffer,256);               
        }

}
void W25Q16_Write(ul address,uc *data,ui j)
{
    ui i;
    while(W25_Read_Busy());       

        W25_Write_Enable();
       
    W25_CS_ENABLE();
       
    W25_SPI_Write(0x02);
    W25_SPI_Write(address>>16);
    W25_SPI_Write(address>>8);
    W25_SPI_Write(address);
       
    for(i = 0;i < j;i++)
    {
        W25_SPI_Write(*(data+i));
    }
       
    W25_CS_DISABLE();
}
/*===============================================================
        *功能说明:W25 读数据
        *传入参数:地址、数据、个数
        *返回参数:无
=================================================================*/
void W25Q16_Read(ul address,uc *data,ui j)
{
    ui i;
       
    while(W25_Read_Busy());
       
    W25_Write_Enable();

        W25_CS_ENABLE();
       
    W25_SPI_Write(0x03);
    W25_SPI_Write(address>>16);
    W25_SPI_Write(address>>8);
    W25_SPI_Write(address);
       
    for(i = 0;i < j;i++)
    {
        *(data+i) = W25_SPI_Read();
    }
       
    W25_CS_DISABLE();
}

void W25q16_Erasure(ul Dst_Addr)
{
        Dst_Addr *= 4096;
       
        W25_Write_Enable();       
       
        while(W25_Read_Busy());
       
        W25_CS_ENABLE();
       
        W25_SPI_Write(0x20);                 
       
        W25_SPI_Write((uc)((Dst_Addr)>>16));
        W25_SPI_Write((uc)((Dst_Addr)>>8));         
        W25_SPI_Write((uc)Dst_Addr);       
       
        W25_CS_DISABLE();
                 
        while(W25_Read_Busy());
}


ui SPI_Flash_ReadID(void)
{
        ui Temp = 0;  

        W25_Write_Enable();

        W25_CS_ENABLE();
       
        W25_SPI_Write(0x90);//发送读取ID命令   
       
        W25_SPI_Write(0x00);   
        W25_SPI_Write(0x00);   
        W25_SPI_Write(0x00);
       
        Temp |= W25_SPI_Read()<<8;  
        Temp |= W25_SPI_Read();   
       
        W25_CS_DISABLE();
       
        return Temp;
}  


沙发
jekey| | 2018-11-9 18:58 | 只看该作者
擦除/写入是需要时间的,可以查询状态来检查芯片是否完成了操作。

使用特权

评论回复
板凳
爱好学习者|  楼主 | 2018-11-9 19:00 | 只看该作者
jekey 发表于 2018-11-9 18:58
擦除/写入是需要时间的,可以查询状态来检查芯片是否完成了操作。

我上面贴的程序都有读忙检测的while(W25_Read_Busy());

使用特权

评论回复
地板
爱好学习者|  楼主 | 2018-11-10 12:27 | 只看该作者
有哪位大神知道,可能是哪里产生的问题么?

使用特权

评论回复
5
zzz3265| | 2018-11-10 17:15 | 只看该作者
flash 写入数据前需要擦除

使用特权

评论回复
6
heisexingqisi| | 2018-11-11 20:21 | 只看该作者
不是先擦除再写吗

使用特权

评论回复
7
爱好学习者|  楼主 | 2018-11-12 12:44 | 只看该作者
因为定义不了4096这么大的数组,所以采用分开读取,但是读取完成修改数据之后怎么写入呢,如果分开写入,写一次之后就只能擦除再写,那分开的数据包就会被覆盖,整体写入,定义不了那么大数组,纠结啊

使用特权

评论回复
8
磨砂| | 2018-11-12 12:59 | 只看该作者
好像是一段一段的擦除

使用特权

评论回复
9
爱好学习者|  楼主 | 2018-11-12 13:27 | 只看该作者
磨砂 发表于 2018-11-12 12:59
好像是一段一段的擦除

最少擦除4K

使用特权

评论回复
10
Diyer2015| | 2018-11-12 15:26 | 只看该作者
擦除 是按页擦除的
写之前 必须擦除

这个就是不如 EEROM 简单的地方了!

使用特权

评论回复
11
antusheng| | 2018-11-13 11:35 | 只看该作者
直接写肯定不行,要擦再写。好像擦除的过程就是往里面写1.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

73

帖子

0

粉丝