SPI
本章介绍 SPI 控制器的相关内容,面向使用 SPI 模块做驱动开发或者用户态程序开发或维护人员。具体包括设备能力,驱动和用户态程序接口,配置流程以及核心参考代码。
概述
SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,主要用于短距离设备间的高速数据交换。常见应用包括微控制器与传感器、存储器、显示屏等外设之间的通信。
SPI 采用主从架构,通过四根信号线实现全双工通信:
SCK:时钟信号(由主设备提供)MOSI:主设备输出,从设备输入MISO:主设备输入,从设备输出CS_N:片选信号(低电平有效)
SPI 不具备寻址机制,通信依赖硬件片选,具备以下特点:
- 硬件结构简单
- 无需握手机制
- 传输速率高(可达数十 MHz 乃至百 MHz 级)
- 广泛应用于 EEPROM、LCD、ADC、触控芯片等嵌入式场景
关键特性
- SPI 通道:系统共支持 6 路 SPI(
SPI0–SPI5)SPI0–SPI4位于非安全空间,可由普通应用访问,支持通用 SPI 功能SPI5位于安全空间,仅供安全模块调用,通常用于控制板载关键芯片,如 PMIC、电源芯片、RTC 等
- 支持主模式:所有 SPI 控制器均支持主模式通信
- 通信引脚:使用
SCK、CS_N、MISO、MOSI四根基本信号线 - 频率范围:
SCK时钟频率范围为 0–50 MHz,常见值为 25 MHz 和 50 MHz - 数据传输方式:支持中断模式传输(不支持
DMA) - FIFO 缓冲:每通道具有 256-word(32-bit 宽)
FIFO缓冲区
内核文件
SPI 涉及到的内核文件包含以下几个:
| 文件路径 | 用途说明 |
|---|---|
linux-mthreads/drivers/spi/spi-dw-core.c | DesignWare SPI 模块的核心处理文件 |
linux-mthreads/drivers/spi/spi-dw-m1000.c | SPI0–SPI4 模块初始化文件 |
linux-mthreads/drivers/spi/spi-dw-sm-ss.c | SPI5 模块初始化文件(仅供测试使用,非必要不建议在内核中使用 SPI5) |
linux-mthreads/drivers/spi/spi.c | SPI 子系统的通用程序接口 |
linux-mthreads/drivers/spi/spidev.c | SPI 驱动的用户接口,生成字符设备节点供用户态访问 |
linux-mthreads/tools/spi/spidev_test.c | SPI 用户态测试示例程序 |
以用户态程序为例:
- 用户的
spidev_test.c通过/dev目录下的spidev字符设备节点与内核的spidev.c进行通信。 - 内核中的
spidev.c调用spi.c提供的通用SPI接口进行数据读写操作。 spi.c根据初始化时注册的spi-dw-core.c中的函数,完成硬件的初始化和调度。spi-dw-core.c最终调用对应的硬件相关实现文件spi-dw-m1000.c,执行具体的硬件层面数据读写操作.