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 寄存器相关资料
厂家的spi flash 指令 不止以上这些, 还有其他的指令,但那些指令并不是经常使用。 各个厂家的指令代码也不尽相同。有些甚至是不支持的。 但只使用以上这些通用指令,完全可以对各个厂家的flash 进行操作。
1)编程指令 (02h)
2) 4K扇区擦除(20h)
3)块擦除(d8h)
4)全片擦除(c7h)
5)读厂家ID(9fh)
6) 读数据指令(03h)
8)写失效指令(04h)
用户常用的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。









