硬汉嵌入式论坛

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

[SPI/QSPI] STM32H7驱动SPI Flash W25Q关键知识点整理---页编程,页回卷,扇区擦除等

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2020-3-14 10:57:05 | 显示全部楼层 |阅读模式


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字节


5. SPI Flash的擦除支持扇区擦除(4KB),块擦除(32KB或者64KB)以及整个芯片擦除。对于扇区擦除和块擦除,使用的时候要注意一点,一般情况下,只需用户给出扇区或者块的首地址即可。如果给的不是扇区或者块的首地址也没有关系的,
只要此地址是在扇区或者块的范围内,此扇区或者块也可以被正确擦除。不过建议使用时给首地址,方便管理。

6. SPI Flash的读操作比较简单,只要给出读取的起始地址和需要读取的数据大小即可,但是不要超过了芯片范围。




回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 02:05 , Processed in 0.137505 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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