1. 从零开始:为什么你的项目需要SPI和Flash?
如果你玩过正点原子的STM32F4开发板,肯定对点亮LED、驱动屏幕这些基础操作不陌生了。但当你做的项目稍微复杂一点,比如想做个数据采集器,需要把传感器数据存起来,或者想做个简单的文件系统,你就会发现一个问题:STM32F4自带的SRAM和Flash容量不够用了。这时候,你就需要外挂一个“大硬盘”——这就是我们常说的外部Flash芯片,比如W25Q128。
我刚开始做项目的时候,也遇到过这种尴尬。当时想做一个长时间记录温湿度的小设备,数据量不大,但需要掉电保存。一开始傻乎乎地想用单片机内部的Flash来存,结果发现写操作特别麻烦,还要整页擦除,一不小心就把程序给擦没了,真是踩了个大坑。后来老工程师指点我,说“你为啥不用SPI Flash呢?便宜、容量大、接口简单”。这才让我真正开始研究SPI通信和W25Q128。
SPI,全称是Serial Peripheral Interface,你可以把它理解成单片机和其他芯片之间说“悄悄话”的一种方式。它比我们熟悉的I2C要快得多,是全双工的,也就是能同时“听”和“说”。而W25Q128,就是那个能存16兆字节数据的“大仓库”,相当于你给STM32配了个U盘。通过SPI这根“电话线”,STM32就能自由地往这个“仓库”里存东西、取东西了。
这个组合在实战中应用太广了。比如,你的智能手环需要存储运动轨迹和睡眠数据;你的物联网设备需要缓存网络数据包;甚至你想在液晶屏上显示一张图片,都可以先把图片存到W25Q128里,需要的时候再读出来。掌握了它,你的嵌入式开发技能就从“点亮小灯”升级到了“处理复杂数据”,能玩的东西一下子就多了起来。
2. 硬件连接:把线接对,就成功了一半
搞嵌入式开发,硬件是基础,线接错了,代码写得再漂亮也是白搭。正点原子探索者STM32F407开发板已经非常贴心地帮我们把W25Q128和STM32F4的SPI1接口连好了,但我们还是得搞清楚它们是怎么“牵手”的,这样以后自己画板子或者换其他芯片心里才有底。
2.1 认识SPI的“四根金线”
SPI通信通常只需要四根线,比I2C还少一根(I2C有SDA和SCL两根)。但这四根线各有各的职责,一根都不能乱:
- SCLK (Serial Clock):时钟线,由主机(也就是我们的STM32)产生。你可以把它想象成乐队指挥的指挥棒,它挥一下,所有乐手(从设备)就动一下。数据的发送和接收节奏全靠它来同步。
- MOSI (Master Out Slave In):主机输出,从机输入。这是STM32对W25Q128“说话”的通道。比如STM32说:“我要往地址0x1000写数据0xAA”,这个命令就是通过MOSI线传过去的。
- MISO (Master In Slave Out):主机输入,从机输出。这是W25Q128对STM32“回话”的通道。当STM32问:“0x1000地址里存的是啥?” W25Q128就会通过MISO线把数据0xAA送回来。
- CS/SS (Chip Select / Slave Select):片选线。这根线是关键中的关键!SPI总线理论上可以挂很多个从设备,大家都连着SCLK、MOSI、MISO。那STM32怎么知道现在是在跟谁说话呢?就是靠片选线。当STM32想和W25Q128通信时,就把连接W25Q128的那根CS线拉低(通常是低电平有效),相当于点名:“W25Q128,你出来一下”。其他从设备的CS线保持高电平,它们就会自动进入“静音”模式,不理睬总线上的信号。
在探索者开发板上,W25Q128的这四根线是和STM32F407的SPI1接口固定连接的:
- W25Q128 CLK -> PB3 (SPI1_SCK)
- W25Q128 DO -> PB4 (SPI1_MISO)
- W25Q128 DI -> PB5 (SPI1_MOSI)
- W25Q128 CS -> PB14 (普通GPIO,软件控制)
这里注意一个细节:CS线没有接到STM32的硬件NSS引脚上,而是用了一个普通的GPIO口(PB14)来控制。这是因为硬件NSS管理起来有时不够灵活,用软件控制CS我们可以更自由地控制通信的起始和结束时刻。
2.2 一个容易忽略的“坑”:器件分时复用
正点原子的板子上还有一个设计需要我们特别注意:W25Q128和无线模块NRF24L01共用同一组SPI1接口。它们的SCK、MISO、MOSI是并联在一起的,区别只在于CS片选线不同。
| 器件 | CS引脚 | 状态 |
|---|---|---|
| W25Q128 | PB14 | 低电平选中 |
| NRF24L01 | PG8 |

7707

被折叠的 条评论
为什么被折叠?



