1. SPI总线系统设计概述
在嵌入式系统开发中,数据采集、存储与传输的实时性需求越来越高。SPI(Serial Peripheral Interface)总线凭借其高带宽、低延迟和全双工通信特性,成为连接以太网控制器、Flash存储器和无线通信模块的首选方案。作为一名长期从事物联网硬件开发的工程师,我将在本文详细分享SPI总线在多设备系统中的设计要点和实战经验。
SPI总线采用主从架构,包含四根基本信号线:
- SCLK:时钟信号,由主设备产生
- MOSI:主设备输出,从设备输入
- MISO:主设备输入,从设备输出
- CS:片选信号,每个从设备独立一根
相比I2C总线,SPI的优势在于:
- 最高传输速率可达50MHz以上
- 没有复杂的起始/停止条件
- 支持全双工通信
- 协议简单,实现成本低
2. 硬件设计与配置要点
2.1 Air780E系列模组SPI资源分析
Air780E系列模组提供1-2路SPI总线,具体资源分配因型号而异:
2.1.1 标准型号SPI配置
-
SPI0:固定引脚(PIN83-PIN86)
- PIN83: SPI0_CS
- PIN84: SPI0_CLK
- PIN85: SPI0_MOSI
- PIN86: SPI0_MISO
-
SPI1:可复用引脚
- 方案A:PIN28/PIN29(默认UART2)
- 方案B:PIN57/PIN58(默认UART3)
重要提示:复用引脚需在初始化时正确配置功能模式,否则会导致通信失败。
2.1.2 特殊型号限制
某些型号因内部资源占用导致SPI1不可用:
| 型号系列 | 限制原因 | 可用SPI |
|---|---|---|
| EHV | 内置Audio Codec占用I2C0 | 仅SPI0 |
| EGP/EGG/EGH | 内置GNSS占用UART2 | 仅SPI0 |
2.2 多设备级联设计
SPI总线支持通过片选信号(CS)挂载多个从设备,但需注意以下设计要点:
-
速率匹配原则:同一SPI总线上所有设备必须工作在相同时钟频率。例如,若总线上有10MHz的以太网芯片和1MHz的Flash,所有设备都只能以1MHz工作。
-
布线等长要求:SCLK到各从设备的走线长度差异应控制在1/10波长内。以50MHz信号为例,最大允许长度差约为6cm。
-
负载计算:
- 每个SPI从设备相当于一个容性负载(通常3-10pF)
- 总负载电容 = 总线寄生电容 + Σ从设备电容
- 确保总负载在驱动能力范围内(通常<50pF)
计算公式:
code复制最大允许从设备数 = (驱动能力 - 总线寄生电容) / 单个从设备电容
2.3 抗干扰设计
高频SPI信号易受干扰,推荐以下防护措施:
-
PCB布局:
- SPI走线尽量短,避免穿越电源区域
- 保持完整地平面,信号线下方不要分割
- 差分对(MOSI/MISO)应平行等长走线
-
端接匹配:
- 在信号末端添加33Ω串联电阻
- 长距离传输时使用RC端接(100Ω+100pF)
-
电源滤波:
- 每个从设备VCC引脚添加0.1μF+10μF去耦电容
- 敏感设备可增加磁珠滤波
3. 以太网控制器(CH390H)集成
3.1 硬件连接方案
CH390H是SPI接口的10/100M以太网控制器,典型连接方式:
code复制Air780E SPI0 ----> CH390H
MOSI ----> SI
MISO ----> SO
SCLK ----> SCK
CS0 ----> CS
电源设计要点:
- 使用LDO稳压器提供3.3V电源
- 在VCC引脚附近放置10μF钽电容+0.1μF陶瓷电容
- 保留至少500mA电流余量
3.2 软件驱动实现
LuatOS中初始化CH390H的示例代码:
lua复制-- 初始化SPI0
local spiID = 0
local spiSpeed = 20000000 -- 20MHz
spi.setup(spiID, spiSpeed, spi.MSB, spi.CPOL_LOW, spi.CPHA_1)
-- 配置CH390H
local function ch390h_init()
-- 复位芯片
gpio.set(CS_PIN, 0)
spi.send(spiID, string.char(0xFF, 0xFF, 0xFF, 0xFF))
gpio.set(CS_PIN, 1)
sys.wait(100)
-- 设置MAC地址
local mac = {0x00,0x11,0x22,0x33,0x44,0x55}
gpio.set(CS_PIN, 0)
spi.send(spiID, string.char(0x80, 0x01)..table.concat(mac))
gpio.set(CS_PIN, 1)
end
调试技巧:用逻辑分析仪抓取SPI波形时,注意检查CS信号是否正常拉低,时钟极性(CPOL)和相位(CPHA)是否匹配。
4. Flash存储器应用实践
4.1 SPI NOR Flash选型指南
常用型号参数对比:
| 型号 | 容量 | 速度 | 工作电压 | 特点 |
|---|---|---|---|---|
| W25Q64 | 8MB | 104MHz | 2.7-3.6V | 性价比高 |
| W25Q128 | 16MB | 133MHz | 2.7-3.6V | 支持双线SPI |
| W25Q256 | 32MB | 133MHz | 2.7-3.6V | 支持四线QSPI |
4.2 文件系统挂载
使用LittleFS文件系统的示例:
lua复制-- 初始化SPI Flash
local spiFlash = spi.deviceSetup(0, 20, 0, 0, 8, 0, 1, 1)
-- 挂载文件系统
local fs = require("littlefs")
fs.mount("/flash", "spi", "spi_flash", spiFlash)
-- 文件操作示例
local f = io.open("/flash/config.txt", "w")
f:write("device_id=12345")
f:close()
常见问题处理:
- 挂载失败:检查Flash是否支持SFDP协议
- 写入速度慢:尝试提高SPI时钟频率
- 数据损坏:添加ECC校验或降低时钟频率
5. AirLink高速通信实现
5.1 协议栈架构
AirLink协议采用分层设计:
code复制应用层
|
传输层(重传/流控)
|
数据链路层(帧校验)
|
物理层(SPI硬件)
5.2 性能优化技巧
-
DMA传输:启用SPI DMA减少CPU开销
c复制// 伪代码示例 HAL_SPI_Transmit_DMA(&hspi1, txBuffer, length); -
双缓冲机制:准备下一帧数据时传输当前帧
-
流量控制:通过GPIO信号实现硬件流控
实测性能对比:
| 优化措施 | 吞吐量提升 | CPU占用降低 |
|---|---|---|
| 基础SPI | 8Mbps | 90% |
| +DMA | 12Mbps | 40% |
| +双缓冲 | 15Mbps | 30% |
6. 系统集成与调试
6.1 复合设备连接方案
推荐的多设备连接拓扑:
code复制Air780E SPI0
├─ CS0: CH390H (以太网)
├─ CS1: W25Q128 (Nor Flash)
└─ CS2: SD卡
电源分配设计:
- 为每个设备提供独立LDO
- 总电流需求 = Σ各设备最大电流 × 1.2
6.2 常见故障排查
-
通信失败:
- 检查CS信号是否正常使能
- 确认CPOL/CPHA设置匹配
- 测量电源电压是否稳定
-
数据错误:
- 降低SPI时钟频率测试
- 检查PCB走线是否过长
- 添加信号完整性分析
-
系统不稳定:
- 检查去耦电容是否足够
- 测量电源纹波(<50mVpp)
- 检查地回路是否合理
在最近的一个工业物联网项目中,我们采用SPI0连接CH390H和W25Q256,SPI1连接从处理器。通过优化PCB布局和启用DMA传输,实现了18Mbps的稳定数据传输速率。关键经验是:
- 提前做好信号完整性仿真
- 为每个SPI设备保留测试点
- 在软件中实现超时重试机制
