打印
[STM8]

要么数据存不进去,要么存入的数据有问题

[复制链接]
435|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llljh|  楼主 | 2020-8-28 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用STM8L芯片、W25Q16Flash,先将要存储的扇区1数据读出放入备用扇区0,将数据修改后,再讲修改的数据和备用扇区0的数据,存回扇区1,但是存储的过程中,要么数据存不进去,要么存入的数据有问题,请各位帮忙看下是什么问题?

使用特权

评论回复
沙发
llljh|  楼主 | 2020-8-28 22:48 | 只看该作者
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);               
        }

}

使用特权

评论回复
板凳
llljh|  楼主 | 2020-8-28 22:54 | 只看该作者
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;
}  

使用特权

评论回复
地板
liuzaiy| | 2020-8-28 23:01 | 只看该作者
擦除/写入是需要时间的,可以查询状态来检查芯片是否完成了操作。

使用特权

评论回复
5
llljh|  楼主 | 2020-8-28 23:07 | 只看该作者
我上面贴的程序都有读忙检测的while(W25_Read_Busy());

使用特权

评论回复
6
llljh|  楼主 | 2020-8-28 23:11 | 只看该作者
有哪位大神知道,可能是哪里产生的问题么?

使用特权

评论回复
7
wenfen| | 2020-8-28 23:15 | 只看该作者
flash 写入数据前需要擦除

使用特权

评论回复
8
stly| | 2020-8-28 23:18 | 只看该作者
不是先擦除再写吗

使用特权

评论回复
9
llljh|  楼主 | 2020-9-1 19:20 | 只看该作者
因为定义不了4096这么大的数组,所以采用分开读取

使用特权

评论回复
10
llljh|  楼主 | 2020-9-1 19:23 | 只看该作者
但是读取完成修改数据之后怎么写入呢

使用特权

评论回复
11
yufe| | 2020-9-1 19:28 | 只看该作者
如果分开写入,写一次之后就只能擦除再写

使用特权

评论回复
12
llljh|  楼主 | 2020-9-1 19:31 | 只看该作者
那分开的数据包就会被覆盖,整体写入,定义不了那么大数组,纠结啊

使用特权

评论回复
13
dingy| | 2020-9-1 19:34 | 只看该作者
好像是一段一段的擦除

使用特权

评论回复
14
llljh|  楼主 | 2020-9-1 19:40 | 只看该作者
最少擦除4K

使用特权

评论回复
15
kangzj| | 2020-9-1 19:43 | 只看该作者
擦除 是按页擦除的
写之前 必须擦除

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

使用特权

评论回复
16
gongche| | 2020-9-1 19:46 | 只看该作者
直接写肯定不行,要擦再写。好像擦除的过程就是往里面写1.

使用特权

评论回复
17
llljh|  楼主 | 2020-9-1 19:52 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

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

本版积分规则

855

主题

11301

帖子

6

粉丝