news 2026/10/1 16:15:49

SPI 为什么要有时钟?四根线怎样读出闪存身份?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SPI 为什么要有时钟?四根线怎样读出闪存身份?

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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 16:15:48

透明与高反光工件检测:偏振成像与相位偏折术(PMD)

透明与高反光工件检测:偏振成像与相位偏折术(PMD) 一、引言:当"看得见"变成奢望 手机玻璃盖板、光学镜片、液晶面板、注塑透明外壳、抛光金属件、镀铬装饰条、晶圆表面——这类工件的共同点是几乎不"漫反射":要么让光穿过去,要么像镜子一样把光弹回…

作者头像 李华
网站建设 2026/10/1 16:15:37

洛谷-入门-B2072

这是我在洛谷刷的第72道题。#include<stdio.h> #include<math.h> int main() { int n,i; long long num0; int arr[1000]{0}; scanf("%d",&n); for(i0;i<n;i) {arr[i]i1;numarr[i]; } printf("%lld",num);return 0; }反思&#xff1a; …

作者头像 李华
网站建设 2026/10/1 16:13:31

AIHOT部署完全指南:Docker Compose、域名HTTPS、中国大陆加速与自动备份

AIHOT部署完全指南&#xff1a;Docker Compose、域名HTTPS、中国大陆加速与自动备份 【免费下载链接】AIHOT 一个自己找热点、自己写日报的网站框架。把信源和精选标准换成你的&#xff0c;它就是你的行业热点站。 项目地址: https://gitcode.com/gh_mirrors/ai/AIHOT 本…

作者头像 李华
网站建设 2026/10/1 16:13:18

无人机巡检平台如何重构河道管理

河道巡检长期依赖人工徒步或船只巡查&#xff0c;效率低、覆盖范围有限、数据记录不完整。一条 10 公里的河道&#xff0c;传统方式需要 2-3 人花费一整天&#xff0c;且难以发现隐蔽的排污口或堤坝隐患。无人机巡检平台的出现&#xff0c;将河道管理从经验驱动转向数据驱动。技…

作者头像 李华