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 手册。

 

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 寄存器相关资料

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

1)编程指令 (02h)

 

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

3)扇区擦除(d8h)

4)全片擦除(c7h)

5)读厂家ID(9fh)

6) 读数据指令(03h)

7)写有效指令(06h)

8)写失效指令(04h)

9) 读状态寄存器(05h)

用户常用的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 教材教案, IC, RISC-V 教材教案, Verilog, 开发语言, 教材与教案, 文章

发表评论

您的电子邮箱地址不会被公开。

Leave the field below empty!

相关链接