2. 硬件接口详解:SPI接口协议、Quad-SPI模式、硬件连接图、时序参数分析
各位同学,咱们今天来聊聊NOR Flash的硬件接口。说实话,这部分内容看着枯燥,但却是整个移植工作的地基。我见过太多人,软件写得飞起,结果板子一跑就挂,最后查出来是硬件连接或者时序配置出了问题。嗯,咱们今天就把它彻底讲透。
2.1 SPI接口协议:最基础的通信方式
SPI,全称Serial Peripheral Interface,串行外设接口。说白了,就是主设备(比如MCU)和从设备(比如Flash芯片)之间用四根线来聊天。
这四根线分别是:
- SCLK(Serial Clock):时钟线,由主设备产生。它决定了通信的节奏。
- MOSI(Master Out Slave In):主设备输出,从设备输入。数据从主设备流向从设备。
- MISO(Master In Slave Out):主设备输入,从设备输出。数据从从设备流向主设备。
- CS(Chip Select):片选线,低电平有效。主设备拉低这根线,就表示“我要跟这个芯片说话”。
你想想看,这四根线就能完成双向通信,是不是很巧妙?不过要注意,SPI是全双工的,也就是说,主设备发数据的同时,从设备也可以回数据。这一点和I2C不一样,I2C是半双工的。
重要概念:SPI的四种模式
SPI有四种工作模式,由时钟极性(CPOL)和时钟相位(CPHA)决定。CPOL决定时钟空闲时的电平,CPHA决定数据在哪个时钟沿采样。
| 模式 | CPOL | CPHA | 说明 |
|---|---|---|---|
| 模式0 | 0 | 0 | 时钟空闲为低,第一个跳变沿采样 |
| 模式1 | 0 | 1 | 时钟空闲为低,第二个跳变沿采样 |
| 模式2 | 1 | 0 | 时钟空闲为高,第一个跳变沿采样 |
| 模式3 | 1 | 1 | 时钟空闲为高,第二个跳变沿采样 |
我个人习惯,NOR Flash绝大多数情况下都工作在模式0。但这不是绝对的,一定要看芯片的数据手册。我曾经在一个项目里,因为想当然地用了模式0,结果读出来的数据全是乱的,折腾了两天才发现是模式没配对。
2.2 Quad-SPI模式:速度的飞跃
标准SPI一次只能传1个bit,对于大容量数据读写来说,太慢了。于是就有了Quad-SPI,也叫QSPI。它把MOSI和MISO变成了双向的数据线,再加上两根额外的IO线,总共四根数据线同时传输。
QSPI的引脚定义是这样的:
- IO0:相当于标准SPI的MOSI
- IO1:相当于标准SPI的MISO
- IO2:额外的数据线,写保护(WP#)功能复用
- IO3:额外的数据线,保持(HOLD#)功能复用
说白了,QSPI就是一次传4个bit,速度直接翻了四倍。但要注意,QSPI不是所有操作都能用四线模式。通常,命令和地址还是用单线模式发送,只有数据阶段才切换到四线模式。这个切换过程,是通过发送特定的命令码来实现的。
我的经验:QSPI的初始化流程一定要严格按照数据手册来。我记得有一次,我为了省事,直接跳过了“进入QSPI模式”的配置步骤,结果芯片根本不响应。后来老老实实按手册走了一遍,问题就解决了。别偷懒,真的。
2.3 硬件连接图:画对线才能跑对数据
咱们来看一个典型的硬件连接图。这里我以STM32F4系列MCU和W25Q64 Flash芯片为例。
看到这个图,你可能会问:IO2和IO3为什么是虚线?因为它们在标准SPI模式下是不用的,只有切换到QSPI模式时才需要连接。如果你只用标准SPI,这两根线可以悬空,或者接上拉电阻。
注意:CS线一定要接对。我见过有人把CS接到了VCC上,结果芯片永远处于非选中状态,通信自然失败。另外,CS线建议加一个10kΩ的上拉电阻,防止上电瞬间电平不稳定导致误操作。
2.4 时序参数分析:快慢之间见真章
时序参数,说白了就是芯片对信号的时间要求。比如,时钟频率能跑多快?片选信号拉低后,多久才能开始传数据?这些参数都在数据手册里,咱们必须看懂。
我挑几个关键参数说一下:
| 参数 | 符号 | 典型值 | 说明 |
|---|---|---|---|
| 时钟频率 | f_CLK | 104 MHz (QSPI模式) | 标准SPI模式通常低一些,比如80 MHz |
| CS建立时间 | t_CSS | 5 ns | CS拉低后,至少等这么久才能发时钟 |
| CS保持时间 | t_CSH | 5 ns | 最后一个时钟沿之后,CS要保持低电平至少这么久 |
| 数据建立时间 | t_DSU | 2 ns | 数据必须在时钟沿到来前稳定 |
| 数据保持时间 | t_DH | 2 ns | 时钟沿之后,数据要保持稳定 |
这些数值看着很小,但实际工程中很容易出问题。比如,你MCU的SPI时钟频率设置得太高,超过了Flash芯片的f_CLK,那数据就会出错。我曾经在一个项目里,把时钟配到了120 MHz,结果读出来的数据每隔几个字节就跳一个错。后来降到80 MHz,一切正常。
我的建议:在项目初期,先按数据手册里的最保守值来配置时序。等系统跑稳定了,再慢慢优化,把频率提上去。这样能省去很多调试时间。
还有一个容易忽略的点:PCB走线长度。高频信号在长走线上会有延迟和反射。如果MCU和Flash离得太远,时序参数就要留更多余量。我一般建议,SCLK走线不超过10厘米,而且尽量和其他信号线等长。
嗯,关于硬件接口,咱们今天就聊这么多。这部分内容虽然基础,但真的很重要。你想想看,如果硬件接口都没搞对,后面文件系统写得再好,数据也存不进去,对吧?