Menu Close

SPI 通讯协议(3)SPI FLASH 介绍

SPI  协议中, 其中一种应用就是驱动SPI FLASH , 当然, spi 协议也是可以用于其他设备通讯的, 比如video switch, 无线模块, lcd 显示屏等等。 在嵌入式系统中, 因为 spi flash 使用pin 比较少 (通常4pin ),速率又比较高 (很多spi flash 单线能达到133M bit/s),容量(相对于eerpom) 也比较大,所以经常使用spi flash 作为程序存储使用。

参考文章:

SPI 通讯协议 及 SPI 相关工程 详解

在参考文章最后列出几种常用的spi flash 手册。以及相关的工程代码(zip)

 

SPI FLASH 有很多生产厂家, 向 micron, winbond, Macronix,Microchip,ST 等等很多厂家。这些厂家的SPI FLASH 各有不同, 但也有很多相同的地方。基本上都是通过SPI  发送相应的命令,发送数据, 或者是发送相应的命令 ,接收数据。由于各个厂家生产的芯片容量,性能,电压标准的不同,所有会有不同的spi 命令。 总结下来,有一些标准的命令, 各个生产厂家都是共同遵循的。

通用命令

flash command

02H    page program         编程指令,

    命令格式: 02,  addr,  data0,data1,data2,data3。。。。
20H    subsector erase      4k 扇区擦除,

    命令格式: 20,  addr
D8H   sector erase            64k 扇区擦除,

    命令格式: D8,  addr
C7H    chip erase               全芯片擦除,

    命令格式: C7
9FH    read ID                    读JEDEC-ID , 读取厂家ID。

    命令格式: 9F,8clock,8clock, 8clock 。。。。 发送9F, 然后连续发送时钟, 等待spi flash 芯片返回 数据。
03H    read                         读数据,

    命令格式: 03,addr,  8clock,8clock, 8clock 。。。。 发送03,  芯片地址,  然后连续发送时钟, 等待spi flash 芯片返回 数据。
06H    write enable           写有效指令,

    命令格式: 06。 主要用于对芯片写相关的操作,包括擦除,编程指令等等。
04H    write disable          写失效指令,

    命令格式: 04。 退出写有效状态,
05H    read status register 读状态寄存器

    命令格式: 05,  8clock 。。。    当对芯片有相关的写操作, 擦除,编程等等指令, 都需要使用这个指令来验证是否写入成功。下图为 status 寄存器相关资料

%title插图%num

厂家的spi flash 指令 不止以上这些, 还有其他的指令,但那些指令并不是经常使用。 各个厂家的指令代码也不尽相同。有些甚至是不支持的。 但只使用以上这些通用指令,完全可以对各个厂家的flash 进行操作。

1)编程指令 (02h)

%title插图%num

 

2) 4K扇区擦除(20h)

%title插图%num

3)块擦除(d8h)

%title插图%num

4)全片擦除(c7h)

%title插图%num

5)读厂家ID(9fh)

%title插图%num

6) 读数据指令(03h)

%title插图%num

7)写有效指令(06h)
%title插图%num

8)写失效指令(04h)

%title插图%num

9) 读状态寄存器(05h)
%title插图%num

用户常用的flash操作

作为用户(fpga ,或者软件开发者),通常的操作有 :

1)全片擦除

2)扇区擦除,只有当前扇区被擦除后, 才能进行编程。

3)地址编程(写数据到flash)

4)读数据 (从某个地址开始, 连续读出相应的flash 中的数据)

5)读厂家ID (确定是那个厂家的芯片, 确定芯片容量,性能, 电压等等)

 

SPI flash 操作流程

全片擦除

1)发送 : 06;    写操作有效

2)发送 : c7;    全片擦除指令

3)发送:05 + 8clock ; 查看返回的数据(状态寄存器)

4) 如果返回数据(状态寄存器)的最低位 == 0 , 跳转 5; 否则跳转 3

5)发送: 04;   写操作失效指令(很多芯片不执行这个指令也是可以的),作用: 屏蔽所有和写,擦除,编程相关的操作。防止其他命令误写

注: 除了第4条, 其他每一条都是完整的指令,即: 开始有 片选有效, 结束后设置 片选无效。

扇区擦除

1)发送 : 06;    写操作有效

2)发送 : d8/20 + addr[23:16] + addr[15:08] + addr[07:00] ;    擦除地址对应的扇区

3)发送:05 + 8clock ; 查看返回的数据(状态寄存器)

4) 如果返回数据(状态寄存器)的最低位 == 0 , 跳转 5; 否则跳转 3

5)发送: 04;   写操作失效指令(很多芯片不执行这个指令也是可以的),作用: 屏蔽所有和写,擦除,编程相关的操作。防止其他命令误写

注: 除了第4条, 其他每一条都是完整的指令,即: 开始有 片选有效, 结束后设置 片选无效。

地址编程(写数据到flash)

1)发送 : 06;    写操作有效

2)发送 : 02+ addr[23:16] + addr[15:08] + addr[07:00] + data_0 + data_1 + data_2 + data_3  。。。;    对地址进行编程,从当前地址开始连续编程,一般最多可连续写入256 bytes

3)发送:05 + 8clock ; 查看返回的数据(状态寄存器)

4) 如果返回数据(状态寄存器)的最低位 == 0 , 跳转 5; 否则跳转 3

5)发送: 04;   写操作失效指令(很多芯片不执行这个指令也是可以的),作用: 屏蔽所有和写,擦除,编程相关的操作。防止其他命令误写

注: 除了第4条, 其他每一条都是完整的指令,即: 开始有 片选有效, 结束后设置 片选无效。

 

读数据 (从某个地址开始, 连续读出相应的flash 中的数据)

1)发送 : 03+ addr[23:16] + addr[15:08] + addr[07:00] + 8clock + 8clock + 8clock + 8clock  。。。;    从当前地址开始连续读取数据,一般没有读取数量限制,可以一直读数据。

 

读厂家ID (确定是那个厂家的芯片, 确定芯片容量,性能, 电压等等)

1)发送 : 9f  + 8clock + 8clock + 8clock + 8clock  。。。;    读取当前所使用的芯片的厂家ID ,读取 3 bytes  —  nbyes。 一般不会小于 3 bytes。

 

 

 

Posted in FPGA, FPGA, IP开发, RISC-V, RISC-V IPcore设计, RISC-V 教案, 元器件, 存储器, 教材与教案, 文章, 资料区

发表评论

相关链接