野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11575|回复: 6

W25Q64芯片的问题

[复制链接]
发表于 2016-1-19 10:46:56 | 显示全部楼层 |阅读模式
  那个擦除函数和写数据函数,的擦除大小,写的大小搞不懂,谁来说说,谢谢

        write_addr=60*4096;//地址为什么这样写?保证是4096的倍数吗?
       
        printf("1.f_mount_xbf res=%d\n",myres);
        myres = f_open(&myfsrc,"0:youyuan16.xbf",FA_OPEN_EXISTING | FA_READ);
        printf("2.f_open_xbf res=%d\n",myres);
       
        for(j=0;j<317;j++)  //这里擦除了317*4K=1268K内容?
        {
                SPI_FLASH_SectorErase(write_addr+j*4096);
        }
        j=0;
        while(myres == FR_OK)
        {
                myres = f_read( &myfsrc, tempbuf, 256, &mybr);
                //printf("%d.f_read_xbf res=%d\n",j,myres);
                if(myres!=FR_OK)break;               
                SPI_FLASH_PageWrite(tempbuf,write_addr,256);
                write_addr+=256;                               
                j++;
                if(mybr !=256)break;
        }
       
        f_close(&myfsrc);
       
        SPI_FLASH_BufferRead(tempbuf,60*4096,100);                        //&#182;áè&#161;êy&#190;Y£&#172;′òó&#161;&#209;é&#214;¤
        printf("readbuf_xbf\n");
        for(j=0;j<100;j++)
                printf("%X",tempbuf[j]);
        printf("\nè&#231;1&#251;tempbuf2&#187;è&#171;&#206;a FF £&#172;&#196;&#199;&#195;′&#203;μ&#195;÷×&#214;&#191;a&#191;&#189;±′3é1|£&#161;£&#161;£&#161;\n");
        LED1_ON;


回复

使用道具 举报

发表于 2016-1-19 10:55:15 | 显示全部楼层
因为spi flash最小擦除尺寸为4096,所以一般以为4K作为偏移增量
SPI_FLASH_SectorErase函数就是一次擦除4K空间的,所以是317*4K=1268K
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-19 11:12:53 | 显示全部楼层
我这个函数,地址从0开始写就正确,但是从其他地址开始写就乱码了,为什么呢?

Sd_to_Flash(4096*60,846,0,"/zm3232.bin");


void Sd_to_Flash(u32 SectorAddr, uint16_t volume_k,uint16_t volume_b,unsigned char *file_name)
{
        uint8_t buffer[1024];               
        uint16_t i=0,j=0;
        uint16_t k4=0;
       
        k4 = volume_k / 4;
        //printf("\r\n please wait...\r\n");       
        //LCD_DispStr_1632WithoutMode(0,0,(uint8_t *)"please wait...",RED,BLACK);
       
        for(i=0;i < k4+2; i++)
        {
                SPI_FLASH_SectorErase(SectorAddr + 4096*i);               
        }
        if(volume_k > 0)
        {
                for(i=0; i < volume_k ; i++)
                {
                        GetGBKCode_from_sd(buffer,1024,SectorAddr, file_name);         /* è&#161;×&#214;&#196;£êy&#190;Y */               
//                        for(j=0;j<1024;j++)
//                        printf("%c",buffer[j]);               
                        SPI_FLASH_BufferWrite(buffer, SectorAddr, 1024);       
                        SectorAddr +=1024;
                }                       
        }
        if(volume_b > 0)
        {
        GetGBKCode_from_sd(buffer,volume_b,SectorAddr, file_name);         /* è&#161;×&#214;&#196;£êy&#190;Y */                                       
        SPI_FLASH_BufferWrite(buffer, SectorAddr, volume_b);               
        }
        //        printf("\r\n OK!\r\n");       
        //LCD_DispStr_1632WithoutMode(0,0,(uint8_t *)"0k!",RED,BLACK);
       
       
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-19 11:13:49 | 显示全部楼层
亽亼 发表于 2016-1-19 10:55
因为spi flash最小擦除尺寸为4096,所以一般以为4K作为偏移增量
SPI_FLASH_SectorErase函数就是一次擦除4 ...


我这个函数,地址从0开始写就正确,但是从其他地址开始写就乱码了,为什么呢?

Sd_to_Flash(4096*60,846,0,"/zm3232.bin");


void Sd_to_Flash(u32 SectorAddr, uint16_t volume_k,uint16_t volume_b,unsigned char *file_name)
{
        uint8_t buffer[1024];               
        uint16_t i=0,j=0;
        uint16_t k4=0;
        
        k4 = volume_k / 4;
        //printf("\r\n please wait...\r\n");        
        //LCD_DispStr_1632WithoutMode(0,0,(uint8_t *)"please wait...",RED,BLACK);
        
        for(i=0;i < k4+2; i++)
        {
                SPI_FLASH_SectorErase(SectorAddr + 4096*i);               
        }
        if(volume_k > 0)
        {
                for(i=0; i < volume_k ; i++)
                {
                        GetGBKCode_from_sd(buffer,1024,SectorAddr, file_name);         /* è&#161;×&#214;&#196;£êy&#190;Y */               
//                        for(j=0;j<1024;j++)
//                        printf("%c",buffer[j]);               
                        SPI_FLASH_BufferWrite(buffer, SectorAddr, 1024);        
                        SectorAddr +=1024;
                }                        
        }
        if(volume_b > 0)
        {
        GetGBKCode_from_sd(buffer,volume_b,SectorAddr, file_name);         /* è&#161;×&#214;&#196;£êy&#190;Y */                                       
        SPI_FLASH_BufferWrite(buffer, SectorAddr, volume_b);               
        }
        //        printf("\r\n OK!\r\n");        
        //LCD_DispStr_1632WithoutMode(0,0,(uint8_t *)"0k!",RED,BLACK);
        
        
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-19 13:53:21 | 显示全部楼层
自己解决了。
回复 支持 反对

使用道具 举报

发表于 2016-1-19 18:47:27 | 显示全部楼层

怎么解决的啊?把方法告诉大家啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-20 14:07:59 | 显示全部楼层
qduwg 发表于 2016-1-19 18:47
怎么解决的啊?把方法告诉大家啊。

上面的写FLASH程序是没有错的,是我在读取数据显示函数时出错了,忘了给它加个地址的偏移量,所以读出来的数据不对应。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-28 17:46 , Processed in 0.051408 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表