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

[复制链接]
 楼主| 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 | 显示全部楼层
擦除/写入是需要时间的,可以查询状态来检查芯片是否完成了操作。
 楼主| llljh 发表于 2020-8-28 23:07 | 显示全部楼层
我上面贴的程序都有读忙检测的while(W25_Read_Busy());
 楼主| llljh 发表于 2020-8-28 23:11 | 显示全部楼层
有哪位大神知道,可能是哪里产生的问题么?
wenfen 发表于 2020-8-28 23:15 | 显示全部楼层
flash 写入数据前需要擦除
stly 发表于 2020-8-28 23:18 | 显示全部楼层
不是先擦除再写吗
 楼主| llljh 发表于 2020-9-1 19:20 | 显示全部楼层
因为定义不了4096这么大的数组,所以采用分开读取
 楼主| llljh 发表于 2020-9-1 19:23 | 显示全部楼层
但是读取完成修改数据之后怎么写入呢
yufe 发表于 2020-9-1 19:28 | 显示全部楼层
如果分开写入,写一次之后就只能擦除再写
 楼主| llljh 发表于 2020-9-1 19:31 | 显示全部楼层
那分开的数据包就会被覆盖,整体写入,定义不了那么大数组,纠结啊
dingy 发表于 2020-9-1 19:34 | 显示全部楼层
好像是一段一段的擦除
 楼主| llljh 发表于 2020-9-1 19:40 | 显示全部楼层
最少擦除4K
kangzj 发表于 2020-9-1 19:43 | 显示全部楼层
擦除 是按页擦除的
写之前 必须擦除

这个就是不如 EEROM 简单的地方了!
gongche 发表于 2020-9-1 19:46 | 显示全部楼层
直接写肯定不行,要擦再写。好像擦除的过程就是往里面写1.
 楼主| llljh 发表于 2020-9-1 19:52 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则

855

主题

11301

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部