【原创】【SPI】SPI Flash介绍

一、这是个什么玩意

首先它是个Flash,Flash是什么东西就不多说了(非易失性存储介质),分为NOR和NAND两种(NOR和NAND的区别本篇不做介绍)。SPI一种通信接口。那么严格的来说SPI Flash是一种使用SPI通信的Flash,即,可能指NOR也可能是NAND。但现在大部分情况默认下人们说的SPI Flash指的是SPI NorFlash。早期Norflash的接口是parallel的形式,即把数据线和地址线并排与IC的管脚连接。但是后来发现不同容量的Norflash不能硬件上兼容(数据线和地址线的数量不一样),并且封装比较大,占用了较大的PCB板位置,所以后来逐渐被SPI(串行接口)Norflash所取代。同时不同容量的SPI Norflash管脚也兼容封装也更小。,至于现在很多人说起NOR flash直接都以SPI flash来代称。

NorFlash根据数据传输的位数可以分为并行(Parallel,即地址线和数据线直接和处理器相连)NorFlash和串行(SPI,即通过SPI接口和处理器相连)NorFlash;区别主要就是:1、SPI NorFlash每次传输一bit位的数据,parallel连接的NorFlash每次传输多个bit位的数据(有x8和x16bit两种); 2、SPI NorFlash比parallel便宜,接口简单点,但速度慢。

NandFlash是地址数据线复用的方式,接口标准统一(x8bit和x16bit),所以不同容量再兼容性上基本没什么问题。但是目前对产品的需求越来越小型化以及成本要求也越来越高,所以SPI NandFlash渐渐成为主流,并且采用SPI NANDFlash方案,主控也可以不需要传统NAND控制器,只需要有SPI接口接口操作访问,从而降低成本。另外SPI NandFlash封装比传统的封装也小很多,故节省了PCB板的空间。

今天主要说下SPI NorFlash。

二、有毛用啊

节省成本,减小封装,存储数据。

三、怎么用啊

怎么用说白了对于Flash就是读写擦,也就是实现flash的驱动。先简单了解下spi flash的物理连接。

之前介绍SPI的时候说过,SPI接口目前的使用是多种方式(具体指的是物理连线有几种方式),Dual SPI、Qual SPI和标准的SPI接口(这种方式肯定不会出现在连接外设是SPI Flash上,这玩意没必要全双工),对于SPI Flash来说,主要就是Dual和Qual这两种方式。具体项目具体看了,理论上在CLK一定的情况下, 线数越多访问速度也越快。我们项目采用的Dual SPI方式,即两线。

当前涉及到具体的SPI flash芯片类型了,所以必须也得参考flash的datasheet手册了。我们以W25Q64JVSSIQ为例。

这是基本信息的介绍,然后看下具体IO的定义

这个是WSON封装的管脚定义,其他详细信息参考datasheet。

硬件驱动的话也是和芯片强相关的,因为读写擦都是和硬件时序相关的,所以必须得参考硬件datasheet手册。

上面的datasheet都详细说明了每个操作的时序周期发送的命令。上图中,第一列是指令名称,第二列是指令编码,第三列及以后的指令功能与对应的指令有关。带括号的字节内容为flash向主机返回的字节数据,不带括号则是主机向flash发送字节数据。

A0~A23:flash内部存储器地址;MID0~MID7:制造商ID;ID0~ID15:flash芯片ID;D0~D7:flash内部存储的数据;dummy:指任意数据。

比如获取deviceID:

表示该命令由这四个字节组成,其中dummy意为任意编码,即这三个字节必须得发数据,但这些数据是任意的,上图命令列表中带括号的字节数据表示由FLASH返回给主机的响应,可以看到deviceID命令的第5个字节为从机返回的响应,(ID7~ID0),即返回设备的ID号。

代码如下:

uint32_t Get_Flash_DeviceID(void)
{
 uint8_t deviceID= 0x00;
 spiflashReset();                                   
 spi_write( 0xAB);
 spi_write( Dummy);
 spi_write( Dummy);
 spi_write( Dummy);
 deviceID = spi_write( Dummy); 
 spi_write( Dummy);
 spiflashSet() ; 

return deviceID;
}

其实主要实现的读,写,擦。其他的接口也可以根据业务来倒逼来丰富驱动接口。:(具体其他驱动详细代码邮件咨询624801474@qq.com

四、成为大神的用法

1、吃透spi flash驱动代码

2、明白各个驱动时序操作

3、待补充



  • 55
    点赞
  • 311
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个实际上只调到了初步的PCB可运行UART可用,其它还未真正调试,但其中的设计及PCB,若有用,哥们们可参考一下 因没完全调试,源代码工程有部分多余代码,工程文件需要重新整理一下,当然如果板子有用,其实可以完全根据原理自己建工程,压缩包内有完整SCH,PCB,包括电源5V,3.3V,RS232,RS485,CAN,SPI-Flash,USB,IO电路。 主要实现的功能是一个多IO,多个232/485,一个CAN通信。 其中数字Input检测,通过两个IO检测四种状态:高,低,悬空,检测单元有问题。 该单元在SCH&PCB;目录下面有相应的Multisim仿真文件。 真值表: L1 H1 值 0 0 INX_LH1为高 0 1 检测单元问题,可能D6与D7之间断开或者INX_HL1电平 1 0 INX_HL1悬空,且检测单元OK;或者INX_HL1电平处于中值 1 1 INX_LH1为低 其它可交流方案: GPS车辆监控系统:终端原理图PCB源码整套(稳定成熟可接多个外设);平台整套源码。 LED屏:公交,出租等 原理图PCB;PC端软件等;PDA控制LED屏程序源码。 DVR:小型SD卡录像方案,可485拍照。 公交报站器,原理图PCB;PC端软件。51版,STM32版。 汽车电动台阶驱动板原理图PCB。 PDA扫描轮:条形码扫描,GPRS上传;终端原理图PCB源码整套,服务端源码 手持公交售票终端源码,可打印小票。终端价位特低。 稳定使用的固态继电器原理及PCB(光耦隔离控制双向可控硅)。 直流电机驱动板。
SPI(Serial Peripheral Interface)是一种串行通信协议,常用于连接微控制器和外部设备,如串行Flash。下面是使用SPI读写串行Flash的基本步骤: 1. 初始化SPI接口,设置SPI的模式、速率等参数。 2. 选中串行Flash,向其发送读、写命令,以及要读写的地址。 3. 发送读、写数据,接收Flash返回的数据。 4. 取消Flash的选中状态,释放SPI总线。 下面是一个读取串行Flash中数据的例子: ``` #include <SPI.h> #define FLASH_CS 10 // SPI Flash的片选引脚 #define READ_CMD 0x03 // 读取数据命令 void setup() { // 初始化SPI接口 SPI.begin(); SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(SPI_CLOCK_DIV16); pinMode(FLASH_CS, OUTPUT); digitalWrite(FLASH_CS, HIGH); // 默认不选中Flash } void loop() { byte data[256]; // 读取的数据缓存 int addr = 0; // 读取的Flash地址 digitalWrite(FLASH_CS, LOW); // 选中Flash SPI.transfer(READ_CMD); // 发送读命令 SPI.transfer(addr >> 16 & 0xFF); // 发送地址高8位 SPI.transfer(addr >> 8 & 0xFF); // 发送地址中8位 SPI.transfer(addr & 0xFF); // 发送地址低8位 for (int i = 0; i < 256; i++) { data[i] = SPI.transfer(0x00); // 读取数据 } digitalWrite(FLASH_CS, HIGH); // 取消Flash的选中状态 // 处理读取的数据 // ... } ``` 其中,READ_CMD是读取数据的命令,地址分高中低三个部分,每次读取256字节的数据。写入数据的流程类似,只需要将读取命令和数据换成写入命令和数据即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值