跳转至

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 卡驱动。

3.参考 API

spi-API

搜索