硬汉嵌入式论坛

 找回密码
 立即注册
查看: 13264|回复: 10
收起左侧

[客户分享] SpiFlash使用注意事项(W25Q系列)以及速度测试记录

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2015-9-13 12:40:59 | 显示全部楼层 |阅读模式
测试使用芯片:W25Q128FV
MCU:STM32F103ZET6,使用SPI1,频率设置为18MHz。
======================================================
1.png

1. SPI Flash仅支持页编程(页大小256字节),所有其它大批量数据的写入都是以页为单位。
    这里注意所说的页编程含义,页编程分为以下三步:

    bsp_spiWrite1(0x02);                                                   ----------第1步发送页编程命令        
    bsp_spiWrite1((_uiWriteAddr & 0xFF0000) >> 16);    ----------第2步发送地址   
    bsp_spiWrite1((_uiWriteAddr & 0xFF00) >> 8);   
    bsp_spiWrite1(_uiWriteAddr & 0xFF);               

    for (i = 0; i < _usSize; i++)
    {
        bsp_spiWrite1(*_pBuf++);                                       ----------第3步写数据,此时就可以连续写入数据了,
                                                                                                       不需要再重新设置地址,地址会自增。这样可以大大加快写入速度   
    }
页编程的含义恰恰就体现在第3步了,如果用户设置的  “起始地址+数据长度”  所确定的地址范围超过了此起始地址所在的页,
地址自增不会超过页范围,而是重新回到了此页的首地进行编写。这一点要特别的注意。
     如果用户不需要使用地址自增效果,那么直接指定地址进行编写即可。可以任意指定地址进行编写,编写前一定要进行擦除。
===================================================
比如下面就是页内操作(使用前已经进行的了扇区擦除,每次擦除最少擦除一个扇区4KB):

uint8_t tempbuf[10] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00};
uint8_t temp1 = 0x10, temp2 = 0x29, temp3 = 0x48;
1. 从250地址开始写入10个字节数据  PageWrite(tempbuf,   250,   10);
   (因为一旦写入超过地址255,就会从0地址开始重新写)
2. 向地址20写入1个字节数据。    PageWrite(&temp1,  20,  1);
3. 向地址30写入1个字节数据。    PageWrite(&temp2,  30,  1);
4. 向地址510写入1个字节数据。PageWrite(&temp3,  510,  1);
   (这里已经是写到下一页了)
下面是将从0地址到511地址读取出来的512个字节数据,一行32字节
1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
 楼主| 发表于 2015-9-13 13:08:52 | 显示全部楼层
2.  SPI Flash的擦除支持扇区擦除(4KB),块擦除(32KB或者64KB)以及整个芯片擦除。
     对于扇区擦除和块擦除,使用的时候要注意一点,一般情况下,只需用户给出扇区或者块的首地址即可。
如果给的不是扇区或者块的首地址也没有关系的,只要此地址是在扇区或者块的范围内,此扇区或者块也可
以被正确擦除。不过建议使用时给首地址,方便管理。
3.  SPI Flash的读操作比较简单,只要给出读取的起始地址和需要读取的数据大小即可,但是不要超过了芯片范围。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
 楼主| 发表于 2015-9-13 17:22:02 | 显示全部楼层
通过下面的测试可以发现,Fast Read命令并没有什么效果,至少使用SPI是这样的。也许用QUAD SPI会不一样。
1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
 楼主| 发表于 2015-9-13 17:24:17 | 显示全部楼层
官方给的速度测试参数:
2.png
回复

使用道具 举报

4

主题

16

回帖

28

积分

新手上路

积分
28
发表于 2017-7-27 16:12:13 | 显示全部楼层
学习
回复

使用道具 举报

4

主题

16

回帖

28

积分

新手上路

积分
28
发表于 2017-7-27 17:04:58 | 显示全部楼层
楼主,您好,一个月历史数据存放在FLASH里的,在显示屏上设定时间段直接查询显示数据,现在想也可以通过USB导出这些历史数据,怎么去实现,刚刚接触这块,,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
 楼主| 发表于 2017-7-28 01:33:24 | 显示全部楼层

回 tinawang 的帖子

tinawang:楼主,您好,一个月历史数据存放在FLASH里的,在显示屏上设定时间段直接查询显示数据,现在想也可以通过USB导出这些历史数据,怎么去实现,刚刚接触这块,,&#160;(2017-07-27 17:04)&#160;
SPI Flash模拟U盘,参考这个例子:
基于V5板子的SPI Flash文件系统+SPI Flash虚拟U盘例子下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=14894
回复

使用道具 举报

0

主题

2

回帖

0

积分

新手上路

积分
0
发表于 2017-8-31 10:05:47 | 显示全部楼层
[s:151]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
 楼主| 发表于 2019-2-15 12:21:50 | 显示全部楼层
顶一下这个帖子,最近有一些网友咨询到这方面的问题,方便大家可以看到。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-2-18 08:58:59 | 显示全部楼层
上周带新人的时候,时钟频率我描述的很虚,想请教一下。

文中的18MHz,是72M的直接分频得来的吗?  这个跟IO输出的 2 、10、50MHz有什么关联没?

ps:之前输出一个PWM,老是算错数,最终时实测模糊调整数值实现,望赐教。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
 楼主| 发表于 2019-2-18 12:33:52 | 显示全部楼层
廷润 发表于 2019-2-18 08:58
上周带新人的时候,时钟频率我描述的很虚,想请教一下。

文中的18MHz,是72M的直接分频得来的吗?  这个 ...

是的,跟IO时钟没有关系。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 21:06 , Processed in 0.377335 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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