SPI 为什么要有时钟?四根线怎样读出闪存身份?
本文为教学接线与设计预期,尚无实物测量记录;使用 NUCLEO-F030R8。
问题
单片机让闪存报告身份,为什么不能只接一根数据线?因为双方要知道哪次变化算下一位。本例只读厂家身份,不擦写数据。片选决定轮到谁说话,时钟决定何时看一位,另外两根线分别负责去和回。
物件动作
想象小熊给仓库送号码卡。它先放下轮到你的旗子,再敲节拍器,递出卡上的一位。仓库员听到节拍才看下一位;回答时,沿另一条通道送回号码卡。旗子抬起,谈话结束。旗子、节拍和两条通道,分别对应片选、时钟和收发数据线。
真实连接
回到电路,开发板 D十三时钟接闪存六脚;D十一发送接五脚;D十二接二脚返回;D十控制一脚片选。闪存八脚接三点三伏,四脚共地。三脚写保护和七脚暂停保持高电平;供电旁跨接零点一微法电容。
原因与结果
程序先把片选拉低,再沿发送线送出十六进制九 F 读取身份指令。每一位按时钟节拍传送;指令后继续给时钟,闪存从返回线送出身份字节。厂家资料里的首个厂家字节是 E F。时钟线本身不装数据。
验证
把逻辑分析仪接到片选、时钟、发送和返回四个节点,并共地。设计预期是片选先变低,随后时钟出现;发送线先解码出九 F,返回线随后读到 E F。先核对四条线脚位,再谈解码。这里是资料值和预计波形,不是实测。
边界
这里只演示标准单线 SPI 读身份,不代表所有指令都按同样字节返回。两边要设置相容的时钟模式,供电不能超范围。任意线接反,都可能读到全零或全一;不能据此断言闪存损坏。
为什么是四根主要信号线
本例的主机是 NUCLEO-F030R8,外部器件是 Winbond W25Q80BV 的 SOIC-8 封装。开发板的 D13/PA5 作为 SPI1_SCK 输出节拍,D11/PA7 作为 SPI1_MOSI 发送指令,D12/PA6 作为 SPI1_MISO 接收返回。D10/PB6 在本例配置为普通 GPIO 软件片选,拉低才选中这颗闪存;不要把板上 D10 的名称误当成已经自动完成片选配置。把这四条线想成一次有秩序的问答:片选旗告诉闪存轮到你,时钟是双方共同的节拍,发送线只负责主机发问,返回线负责闪存回答。没有时钟,双方无法按同一拍数出哪一位;只有时钟却没有数据线,也不会凭空得到身份号码。SPI 可以同时在两个方向移位,但本例先用读身份命令把动作拆开讲。
供电、引脚与不能省略的连接
W25Q80BV 官方 Rev C1 资料标出 SOIC-8 顶视引脚:1 为低有效 /CS,2 为 DO,3 为 /WP,4 为 GND,5 为 DI,6 为 CLK,7 为 /HOLD,8 为 VCC。图上的脚号必须按顶视方向看,实际使用前再确认器件丝印与封装;把芯片反过来看会把两侧脚号颠倒。该器件供电规格为 2.7~3.6 V,本例由开发板 3.3 V 供电,不可直接接 5 V。供电脚旁跨接 100 nF 去耦电容到公共地,不能串联在时钟线上。本例不使用写保护与暂停功能,因此让 /WP 和 /HOLD 保持高电平;片选在空闲时保持高,开始交换时拉低。共地不仅给芯片供电回路,也给逻辑分析仪与主机电平一个共同参考。建议先断电逐线核对:3.3 V 对 VCC、地对 GND、D13 对 CLK、D11 对 DI、D12 对 DO、D10 对 /CS;确认无短路再上电。
9F 指令的逐拍因果
官方资料把 9Fh 定义为 Read JEDEC ID。程序先让 /CS 变低,发送线按高位优先送出 9Fh;时钟推进每一位。8 位指令送完后,主机还要继续给时钟,闪存才沿 DO 依次输出身份字节。资料给出的 Winbond 厂家首字节是 EFh。这里的 9Fh 和 EFh 是厂家定义的命令和资料值,不是本项目已经量到的波形。如果发送指令后立刻把 /CS 拉高,相当于提前结束谈话;即使三根通信线都没接错,也不会得到完整回答。若没有给后续时钟,闪存无法把剩余位推到 DO。程序里的模式设定、位序、片选时序必须与器件要求相容,不能只把四根线插上就期待数值出现。
一次可执行的验证顺序
把逻辑分析仪的四个输入分别接 /CS、CLK、DI、DO,并让分析仪地夹与板卡地相连。先单看 /CS:程序发问时应处于低电平;再看 CLK:只有交换期间出现节拍;然后解码 DI 是否先为 9Fh,最后查看 DO 的首个身份字节是否与资料 EFh 相符。若读到全零、全一或没有跳变,依次查电源、公共地、SOIC-8 观察方向、D11/D12 是否接反和片选是否真的拉低。记录真实波形时写清供电、采样设置、SPI 模式与实物版本;没有这样的原始记录,本文只能称设计预期。读身份只验证基本通信,不证明整颗闪存的每一页都能正确写入或长期保存。
边界:这不是随便一颗闪存的通用配方
不同闪存可能有不同命令、身份字节、电压范围或封装。换型号后先查对应原件,而不是套用本例的 EFh。此处没有做擦除、编程或寿命测试,也没有把外部 Flash 画成 STM32 内部存储器。若要讲高速传输或四线 Quad 模式,/WP、/HOLD 的职责会改变,必须另做连接和时序核验。
逐线接线清单
- CN5 D13/PA5 SPI1_SCK → W25Q80BV pin 6 CLK:同步节拍
- CN5 D11/PA7 SPI1_MOSI → W25Q80BV pin 5 DI(IO0):主机发送
- CN5 D12/PA6 SPI1_MISO → W25Q80BV pin 2 DO(IO1):从机返回
- CN5 D10/PB6 GPIO → W25Q80BV pin 1 /CS:低有效片选
- CN6 +3.3V → W25Q80BV pin 8 VCC:3.3 V 供电
- CN6 GND → W25Q80BV pin 4 GND:公共地
- W25Q80BV pin 3 /WP → 3.3 V:本例不用写保护输入
- W25Q80BV pin 7 /HOLD → 3.3 V:本例不暂停串行通信
- W25Q80BV pin 8 VCC → 100 nF 到 pin 4 GND:就近去耦
- 逻辑分析仪四通道 → /CS、CLK、DI、DO;地接公共 GND:观察预计时序
计算与实施边界
- Winbond W25Q80BV Rev C1 2018:SOIC-8 顶视引脚 1 /CS、2 DO、3 /WP、4 GND、5 DI、6 CLK、7 /HOLD、8 VCC
- 供电范围 2.7~3.6 V;本例只选 3.3 V,不接 5 V
- 9Fh 读 JEDEC ID,首个 Winbond 厂家字节 EFh;仅为资料预期,非本项目实测
- D10/PB6 明确配置为 GPIO 软件片选,不假设它自动片选
这些参数和数值是本例选择或可复算计算;实际测量前,应先检查电源极性、公共地、元件额定值、仪器探头连接。
完整可运行的核心算例与验收
以下 C11 程序可在电脑上用 C 编译器单独编译运行,用来复算状态或数值;它不是已配置 GPIO、ADC、定时器和驱动的开发板固件。移植到实板时应按前述接线配置外设、检查读取错误,并另做实测。
#include<stdint.h>#include<stdio.h>staticvoiddescribe_expected_read(void){constuint8_tcommand=0x9F;constuint8_tmanufacturer=0xEF;printf("CS low; send command 0x%02X; expect first ID 0x%02X; CS high\n",command,manufacturer);}intmain(void){describe_expected_read();return0;}验收时同时记录输入、关键节点电压或波形、程序输出;若发现传感器通信失败、输入超出允许范围或波形明显异常,应停止并排查。
官方资料
- https://www.st.com/resource/en/user_manual/um1724-.pdf
- https://www.st.com/resource/en/datasheet/dm00088500.pdf
- https://www.winbond.com/upload/technical-support/f0f72951-b845-42ea-9010-faaeab26872f.pdf