http://www.z-linear.com
前言
大家好,我是ZLinear的硬件工程师。
在数据采集系统中,SPI Flash是一种被广泛使用的非易失性存储方案。无论是存储固件代码、字库数据,还是作为历史数据的本地存储介质,SPI Flash都以其大容量、低成本、小体积的优势,成为工业数据采集卡中的"数据仓库"。
但很多工程师在SPI Flash电路设计中会遇到不少坑:忘记处理写保护引脚导致无法写入、忽略了去耦电容导致读写不稳定、没有处理好片选信号导致多设备冲突、擦除时序不对导致数据丢失......这些问题看似基础,却可能成为产品可靠性的隐患。
今天,我们就从 SPI Flash存储芯片的基本原理 出发,结合 ZLinear系列数据采集卡 (以 DABL_G511 和 DABT-PT509 为例)的硬件设计,深度拆解SPI Flash存储电路的选型要点、硬件设计、PCB布局和软件配合。
一、SPI Flash的核心特性
1.1 什么是SPI Flash?
SPI Flash是一种通过 串行外设接口(SPI) 进行读写的闪存存储器。它属于 NOR Flash 架构,具有随机读取快、支持XiP(就地执行)的特点。
根据W25Q256JV规格书的描述:
The W25Q256JV (256M-bit) Serial Flash memory provides a storage solution for systems with limited space, pins and power. The 25Q series offers flexibility and performance well beyond ordinary Serial Flash devices.
1.2 SPI Flash vs 并行Flash
| 特性 | SPI Flash | 并行NOR Flash |
|---|---|---|
| 引脚数量 | 6~8个(CLK, CS, DI, DO, /WP, /HOLD) | 数十个(地址线+数据线+控制线) |
| PCB空间 | 极小,适合紧凑设计 | 大,布线复杂 |
| 读取速度 | 单线~133MHz,Quad模式可达532MHz | 高(但占用大量IO) |
| 写入速度 | 较慢(需先擦除后写入) | 同理 |
| 典型容量 | 1Mb~256Mb(常见) | 可达1Gb以上 |
| 成本 | 低 | 相对较高 |
| 典型应用 | 代码存储、参数存储、日志记录 | 大容量固件、XiP执行 |
1.3 SPI Flash的核心操作原则
写入前必须先擦除:这是Flash存储器最根本的特性。Flash只能将1写成0(编程),但不能将0写成1。要将0恢复为1,必须通过擦除操作将整个扇区或块复位到全1(0xFF)状态。
根据《STM32Cube高效开发教程》中的描述:
数据读写的原则:Flash存储器写入数据时,必须先擦除后写入,而且擦除的最小单位是扇区(Sector),W25Q128的扇区大小为4KB。
在《DABL7689核心代码解析》中也明确提到:
- Flash只能从1写到0,不能从0写到1
- 要把0变回1,必须擦除整个4KB扇区
- 擦除后整个扇区变为0xFF
二、SPI Flash芯片引脚功能详解
以ZLinear系列产品中最常用的 W25Q256JVEIQ(Winbond,256M-bit / 32M-byte)为例:
| 引脚名称 | 类型 | 功能描述 |
|---|---|---|
| /CS | 输入 | 片选信号,低电平有效 |
| DI (IO0) | 输入/输出 | 数据输入(标准SPI);双向数据IO0(Dual/Quad SPI) |
| DO (IO1) | 输出/输入 | 数据输出(标准SPI);双向数据IO1(Dual/Quad SPI) |
| /WP (IO2) | 输入/输出 | 写保护(低电平有效);Quad SPI时作为IO2 |
| /HOLD (IO3) | 输入/输出 | 保持输入(低电平有效);Quad SPI时作为IO3 |
| CLK | 输入 | 串行时钟输入 |
| VCC | 电源 | 供电电源(2.7V~3.6V) |
| GND | 地 | 地 |
关键引脚设计要点:
根据W25Q256JV规格书(4. PIN DESCRIPTIONS):
- /WP(写保护) :当QE位(Quad Enable)为0时,/WP引脚使能写保护功能。如果系统中不需要写保护功能,建议将/WP引脚上拉到VCC,确保Flash始终处于可写入状态。
- /HOLD(保持):当QE位为0时,/HOLD引脚允许暂停SPI通信。如果不需要此功能,可上拉到VCC或悬空。
- 当QE位设为1时:/WP引脚变为IO2,/HOLD引脚变为IO3,用于Quad SPI操作。
三、产品实战:ZLinear采集卡的SPI Flash电路设计
3.1 产品中的SPI Flash选型
通过分析ZLinear系列产品的原理图和BOM清单,我们可以看到以下选型:
| 产品型号 | SPI Flash型号 | 容量 | 封装 | 接口模式 |
|---|---|---|---|---|
| DABT-PT509 | W25Q256JVEIQ | 256M-bit (32MB) | WSON-8 8x6mm | Standard/Dual/Quad SPI |
| DABL_G511 | W25Q256JVEIQ | 256M-bit (32MB) | WSON-8 8x6mm | Standard/Dual/Quad SPI |
| DABL7606 | W25Q256JVEIQ | 256M-bit (32MB) | WSON-8 8x6mm | Standard/Dual/Quad SPI |
选型理由分析:
- 容量充足:32MB的存储空间可以满足固件镜像备份、长期数据记录、字库存储等多种需求。
- 高速SPI支持:支持133MHz的标准SPI时钟,Quad模式下等效532MHz速率,配合MCU的SPI或QSPI外设,可实现高速读写。
- 宽温工业级:W25Q256JVEIQ支持-40°C ~ +85°C工作温度范围,满足工业现场环境要求。
- 成熟可靠:Winbond的SPI Flash产品在市场上应用多年,生态完善,驱动库丰富。
3.2 典型电路设计(参考DABT-PT509原理图)
从DABT-PT509的原理图中,我们可以看到一个标准的SPI Flash电路设计:
VCC_3V3
|
[C44] 100nF ← 去耦电容,紧贴芯片
|
┌────┴────┐
│ U8 │
│W25Q256 │
│ │
CS ────┤ /CS VCC├─── VCC_3V3
│ │
DO ────┤ DO /WP├─── VCC_3V3(上拉至3.3V)
│ │
DI ────┤ DI CLK├─── SCK
│ │
GND ───┤ GND /HOL├─── VCC_3V3(上拉至3.3V)
└────────┘
核心设计要点:
-
VCC去耦电容(C44):规格书中要求"每个电源引脚搭配100nF去耦电容,且电容紧贴芯片引脚"。在实际布局中,C44(100nF)必须放置在Flash芯片的VCC引脚旁边,走线短而粗,确保高频去耦效果。
-
/WP与/HOLD引脚的处理:
- /WP引脚上拉到VCC_3V3,确保Flash始终处于可写入状态,避免误触发写保护导致写入失败。
- /HOLD引脚上拉到VCC_3V3,确保通信过程中不会被意外暂停。
根据W25Q256JVEIQ规格书(第9页):
When the QE bit is set to a 0 state (factory default for part numbers with ordering options "IM"), the /WP and /HOLD are enabled.
在标准SPI模式下工作时(QE=0),如果/WP或/HOLD引脚浮空,可能因外部干扰导致Flash误进入写保护或保持状态,造成通信异常。因此,上拉处理是工业级设计的标准做法。
-
连接到MCU的信号:CS、SCK、DI、DO直接连接到MCU的SPI引脚。如果是Quad SPI模式,还需要连接IO2和IO3。
3.3 与MCU的硬件连接
在DABT-PT509的原理图中,SPI Flash与主控MCU(STM32F407VET6)的连接关系如下:
| Flash引脚 | Flash位号 | MCU引脚 | MCU功能复用 |
|---|---|---|---|
| /CS | U8 Pin 1 | PB14 | SPI2_CS(GPIO软件控制) |
| DO (IO1) | U8 Pin 2 | PB14(复用) | SPI2_MISO |
| /WP (IO2) | U8 Pin 3 | 上拉到3.3V | - |
| GND | U8 Pin 4 | GND | - |
| DI (IO0) | U8 Pin 5 | PB15 | SPI2_MOSI |
| CLK | U8 Pin 6 | PB13 | SPI2_SCK |
| /HOLD (IO3) | U8 Pin 7 | 上拉到3.3V | - |
| VCC | U8 Pin 8 | VCC_3V3 | - |
关于片选(CS)的设计选择:
在ZLinear系列产品中,SPI Flash的片选信号通过 GPIO软件控制,而非硬件NSS。这是因为:
- SPI总线上可能挂载多个从设备(如Flash和FRAM),每个从设备需要独立的CS信号。
- 软件控制CS可以灵活控制片选时序,避免硬件NSS在多设备环境下的冲突。
3.4 多设备共享SPI总线的考量
在DABL_G511和DABL7606中,SPI2总线被连接到多个从设备:
┌─────────┐
│ MCU │
│SPI2 │
└────┬────┘
MOSI (PB15)─┼────────→ Flash DI
│ FRAM SI
MISO (PB14)─┼────────→ Flash DO
│ FRAM SO
SCK (PB13)─┼────────→ Flash CLK
│ FRAM SCK
│
├─ PB12 ──→ Flash /CS
└─ PD8 ──→ FRAM /CS
设计注意事项:
- CS是独立的:每个从设备必须有独立的CS引脚,由MCU的GPIO控制。
- MISO是三态的:当CS无效时,从设备的MISO引脚必须为高阻态,否则多个从设备会同时驱动MISO线,造成信号冲突。W25Q256和MB85RS16都满足这一要求。
- 不同从设备的SPI模式可能不同:Flash和FRAM可能支持不同的CPOL/CPHA组合,需要在通信前切换到对应模式,或选用模式兼容的器件。
四、SPI Flash的PCB布局要点
4.1 去耦电容的摆放
根据《晶体管电路设计(上)》中的阐述:
如果将C3比作小容量的去耦电容器,C4比作大容量的电解电容器......并联连接小容量的电容器C3和大容量的电容器C4,可以在很宽的频率范围内降低电源对GND的阻抗。
对于SPI Flash,推荐去耦方案:
- 100nF MLCC(小容量):紧贴Flash芯片VCC引脚,间距<2mm,用于抑制高频噪声。
- 10μF~22μF钽电容(大容量):放置在附近,但可以稍微远一些,用于储能和中低频滤波。
4.2 信号走线要求
SPI Flash的工作时钟频率可达数十MHz(标准模式可达133MHz),PCB布局需遵循高速信号设计原则:
- 走线长度尽量短:Flash芯片应尽量靠近MCU的SPI引脚,减少走线长度和寄生参数。
- 时序匹配:CLK线与数据线(MOSI/MISO)长度尽量接近,减少时钟到数据的偏移(Skew)。
- 避免过孔:SPI信号线尽量减少过孔数量,每个过孔引入的寄生电感约1nH,会影响信号质量。
- 远离干扰源:SPI信号线远离晶振、DC-DC电感、电源走线等强干扰源。
- 地平面完整:SPI信号下方保持完整的地平面,提供低阻抗回流路径。
五、高级话题:代码层面的配合
5.1 初始化时序
根据W25Q256JV的规格书,芯片上电后需要等待**tVSL(典型值10μs)**才能进行访问。在《DABL7689核心代码解析》中可见:
// 第225行: 延时1秒等待所有外设上电稳定
// 特别是W25Q256需要上电后tVSL(10μs)才能访问
// 但这里延时1秒更保守,也等待W5100S完成上电复位
rt_thread_delay(1000);
在实际产品中,延时1秒是经过综合考虑的------不仅确保Flash初始化完成,也等待其他外设(如W5100S以太网芯片)稳定。在产品开发中,保守但可靠的设计原则往往优于极致优化。
5.2 写入前的擦除管理
SPI Flash的写入必须遵循"先擦除后写入"的原则。在《DABL7689核心代码解析》中,W25QXX_Write()函数实现了完整的扇区管理逻辑:
unsigned char W25QXX_BUFFER[4096]; // 4KB扇区缓冲区
void W25QXX_Write(unsigned char* pBuffer, unsigned int WriteAddr, unsigned short NumByteToWrite)
{
unsigned int secpos = WriteAddr / 4096; // 目标扇区号
unsigned short secoff = WriteAddr % 4096; // 扇区内偏移
unsigned short secremain = 4096 - secoff; // 扇区剩余空间
while(1)
{
// 第284行: 先读取整个扇区到缓冲区
W25QXX_Read(W25QXX_BUF, secpos*4096, 4096);
// ... 修改缓冲区中的内容 ...
// ... 擦除扇区 ...
// ... 将整个缓冲区写回Flash ...
}
}
核心思路:
- 将需要写入的扇区数据完整读到缓冲区(4KB)。
- 在缓冲区中修改对应位置的数据。
- 擦除整个扇区(变为全0xFF)。
- 将缓冲区中的数据写回到Flash。
这种"读-改-写"模式是Flash写入的标准做法,可以避免因仅修改几个字节而擦除整个扇区导致其他数据丢失的问题。
六、SPI Flash选型指南
6.1 关键参数速查表
| 参数 | 含义 | 选型建议 |
|---|---|---|
| 容量 | 存储器大小(单位:bit或Byte) | 根据应用场景选择:固件存储建议≥16MB;历史数据记录按需选择 |
| 电压范围 | 工作电压(VCC) | 工业常用3.3V系统,常见范围2.7V~3.6V |
| SPI时钟频率 | 最大SCK频率 | 越高读取速度越快,但注意PCB布局需配合 |
| 擦除寿命 | 每个扇区可擦除/编程的次数 | SLC型≥100K次,MLC/TLC更低 |
| 数据保留时间 | 断电后数据保持时间 | 通常≥20年(W25Q256JV规格书标称) |
| 封装 | 芯片物理封装形式 | SOIC-8/WSON-8(常用),TFBGA(小体积) |
| 温度范围 | 工作环境温度 | 工业级:-40°C ~ +85°C;军用级更宽 |
6.2 常见SPI Flash品牌对比
| 品牌 | 代表型号 | 特点 |
|---|---|---|
| Winbond(华邦) | W25Q256JV, W25Q128JV | 市场占有率最高,驱动成熟,生态完善 |
| Macronix(旺宏) | MX25L25635F | 性价比高,管脚兼容Winbond |
| GigaDevice(兆易创新) | GD25Q256D | 国产替代,性能接近Winbond |
| Micron(美光) | MT25QL256ABA | 大厂品质,价格较高 |
| Cypress/Infineon | S25FL256S | 高端工业/汽车级应用 |
在ZLinear产品中,我们选择Winbond作为主力供应商,原因包括:驱动库兼容性好、供货稳定、业界认可度高、技术资料丰富(包括SFDP寄存器支持、多种封装选项等)。
七、常见问题与排查方法
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 读取Flash ID失败 | 片选时序不对、SPI模式不匹配 | 用逻辑分析仪抓取CS/SCK/MISO/MOSI波形 |
| 写入后读取全为0xFF | 未执行擦除操作、写保护引脚未被拉高 | 检查/WP引脚是否上拉到VCC;确认先执行擦除命令 |
| 写入后数据部分正确部分错误 | 跨扇区写入时未正确处理扇区边界 | 检查写入地址是否跨越扇区边界,需按扇区管理 |
| 通信偶尔失败 | 去耦电容不足、电源噪声大、SCK频率过高 | 加去耦电容、检查电源纹波、降低SCK频率 |
| 无法进入Quad SPI模式 | QE位未设置为1 | 通过Write Status Register指令将Status Register-2的QE位置1 |
八、总结
SPI Flash作为数据采集卡中不可或缺的存储核心,其电路设计虽然看似简单,但要做好却需要从芯片选型、硬件电路设计、PCB布局到软件驱动的全链路考量。
通过拆解 ZLinear系列数据采集卡 的SPI Flash存储电路设计,我们可以看到:
- 选型要匹配应用场景:W25Q256JVEIQ的32MB容量、133MHz时钟、宽温工业级特性,完美适配ZLinear产品的固件存储和历史数据记录需求。
- 硬件设计要留足余量:/WP和/HOLD引脚上拉处理、去耦电容紧贴芯片、CS独立控制、多设备共享MISO的三态检查------每一个细节都影响可靠性。
- 代码要配合硬件特性:上电延时等待tVSL、写入前的扇区"读-改-写"管理、DMA传输提升效率------软硬协同才能发挥最大性能。
最后,无论你选择哪种SPI Flash芯片,都请记住两个核心原则:
- 写入前必须擦除------这是Flash的本性,不可违背。
- 片选信号必须干净------这是SPI通信的基本保障。
希望今天的分享能帮助你设计出更可靠、更高效的SPI Flash存储电路。
我是 ZLinear 开源电子,一个专注于工业数据采集卡研发、生产与销售的专业团队。我们致力于从芯片级到系统级拆解硬核技术,分享一线工程经验。如果这篇内容对你有帮助,欢迎点赞、收藏、关注三连支持!我们下期继续拆解工业数据采集的硬核干货~