01 SPI
作者:马梦阳 | 最后修改:2026-10-07
一、概述
SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,用于微控制器与外设之间的短距离、高速通信。
SPI 采用一主多从架构,协议层没有总线仲裁和冲突检测机制,同一总线只能有一个主机。标准 SPI 有四根信号线:
SCLK(Serial Clock):时钟线,由主机唯一控制,决定数据传输节奏。MOSI(Master Output, Slave Input):主机输出、从机输入,主机通过此线向从机发送数据。MISO(Master Input, Slave Output):主机输入、从机输出,从机通过此线向主机返回数据。CS(Chip Select,又称 SS):片选线,低电平有效。同一总线可接多个从机,每个从机需要独立 CS,同一时间只能拉低一个;对从机来说 CS 只能是输入。
Air160X 系列模组的 SPI 只支持主机模式。波特率上限见 spi-API 中 spi.setup 的取值范围;实际可用速率受布线长度、电平转换和外设本身限制,先用较低速率验证通信,再逐步提高频率。
二、管脚与总线分配
Air1603 引出 SPI1、SPI5 两路通用 SPI。SPI1 的管脚与 Air1601 一致;SPI5 是 Air1603 新增引出的总线,由 RGB888 省出的管脚(PIN59~PIN62)组成。
| 信号 | SPI1 管脚 / GPIO | SPI5 管脚 / GPIO |
|---|---|---|
| MISO | PIN51 / GPIO10 | PIN62 / GPIO64 |
| MOSI | PIN52 / GPIO11 | PIN61 / GPIO58 |
| CLK | PIN50 / GPIO9 | PIN60 / GPIO57 |
| CS | PIN49 / GPIO8 | PIN59 / GPIO56 |
模组作主机时,MOSI 接外设数据输入,MISO 接外设数据输出,CLK 接时钟,CS 接片选。
软件中直接用数字 ID 选择 SPI,无需填写 spi.SPI_1 这类常量:SPI1 填 1,SPI5 填 5。
使用 SPI5 时注意:
- SPI5 的 CS(GPIO56)与参考设计中的 AirLink_RST 共用,不能同时按两种功能配置;作 SPI5 CS 时 AirLink_RST 必须另选 GPIO。
- SPI5 占用 GPIO56~58、GPIO64,与这些管脚的其他复用功能互斥。
- 同一总线接多个从机时共用 CLK/MOSI/MISO,片选各自独立;初始化时先把所有 CS 拉高,防止从机之间互相干扰,未选中的从机应释放 MISO。
- SD 卡、CH390H 等外设断电后可能通过信号线或保护结构影响总线;掉电外设的上拉供电须与总线活动状态一致。
完整的硬件连接与常见问题见 硬件开发资料 的 SPI 接口章节。
三、使用教程
SPI 的典型用法是挂载 Nor Flash、SD 卡,或直连 RC522 等外设。
1.挂载 Nor Flash
以 SPI1 外接 Nor Flash 为例,CS 为 PIN49 / GPIO8:
-- SPI1:总线 ID 1,CS 管脚按实际电路修改
local spi_device = spi.deviceSetup(
1, -- SPI 总线 ID
8, -- CS 管脚 GPIO 编号
0, -- CPHA,时钟相位
0, -- CPOL,时钟极性
8, -- 数据宽度(位)
2*1000*1000, -- 波特率 2MHz
spi.MSB, -- 高位先发
spi.master, -- 主机模式
spi.full -- 全双工
)
local flash = sfud.init(spi_device)
改用 SPI5 时,总线 ID 换成 5,CS 换成 SPI5 的对应值(PIN59 / GPIO56)即可,其余参数不变。
完整的功能演示、软件环境、硬件环境、示例代码与功能展示请参考 AirSPINORFLASH_1000。
2.挂载 SD 卡
SD 卡走 SPI 模式时先用低速完成初始化,挂载时再提高速率:
local spi_id, pin_cs = 1, 8
spi.setup(spi_id, nil, 0, 0, 8, 400000)
-- 同一总线上的所有从机在初始化时必须先拉高 CS,防止从机之间互相干扰
gpio.setup(pin_cs, 1)
local mount_ok, mount_err = fatfs.mount(fatfs.SPI, "/sd", spi_id, pin_cs, 24000000)
SD 卡的完整挂载与文件读写流程见 SD 卡驱动。