1. 课程导论:SPI总线概述、设备树在SPI驱动中的作用、课程目标与学习路径
1.1 SPI总线概述
SPI(Serial Peripheral Interface,串行外设接口)是一种由Motorola公司提出的全双工、同步、高速串行通信总线。它采用主从(Master-Slave)架构,通常由四条信号线组成:
| 信号线 | 名称 | 方向 | 功能描述 |
|---|---|---|---|
| SCLK | 串行时钟 | Master → Slave | 由主设备产生,决定数据传输速率 |
| MOSI | 主出从入 | Master → Slave | 主设备发送数据至从设备 |
| MISO | 主入从出 | Slave → Master | 从设备发送数据至主设备 |
| CS/SS | 片选/从选 | Master → Slave | 低电平有效,选中特定从设备 |
核心优势: SPI总线在嵌入式系统中广泛用于连接传感器、ADC/DAC、LCD显示屏、SD卡、无线模块等外设,其传输速率可达数十MHz,远高于I²C总线。
1.2 SPI总线拓扑结构
SPI支持两种基本拓扑:独立片选(每个从设备独占一条CS线)和菊花链(Daisy-Chain,多个从设备共用数据线,通过级联方式寻址)。在嵌入式Linux系统中,独立片选是最常见的配置方式。
1.3 设备树在SPI驱动中的作用
在嵌入式Linux系统中,设备树(Device Tree)是描述硬件拓扑和资源配置的标准化数据结构。对于SPI子系统而言,设备树承担以下关键职责:
- 硬件描述: 声明SPI控制器(Controller)的寄存器地址、中断号、时钟频率等硬件资源。
- 从设备枚举: 定义挂载在SPI总线上的从设备(Slave Device),包括片选引脚、最大速率、模式(CPOL/CPHA)等参数。
- 驱动绑定: 通过
compatible属性将设备节点与对应的SPI设备驱动进行匹配。 - 平台数据传递: 将自定义属性(如GPIO编号、DMA通道、私有配置)传递给驱动,避免硬编码。
关键概念: 设备树将硬件配置从内核源码中解耦出来,使得同一份内核镜像可以支持多种硬件平台。对于SPI驱动开发者而言,正确编写设备树节点是驱动能够正常工作的前提。
1.4 设备树SPI节点结构
一个典型的SPI设备树节点包含控制器节点和从设备子节点。以下是一个基于i.MX6ULL平台的SPI控制器及从设备配置示例:
&ecspi1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi1>;
cs-gpios = <&gpio4 26 GPIO_ACTIVE_LOW>;
status = "okay";
spidev@0 {
compatible = "spidev";
reg = <0>;
spi-max-frequency = <20000000>;
spi-cpol;
spi-cpha;
};
};
| 属性 | 说明 | 典型值 |
|---|---|---|
compatible |
驱动匹配字符串 | "spidev", "vendor,device" |
reg |
片选编号(从0开始) | 0, 1, 2 |
spi-max-frequency |
最大SPI时钟频率(Hz) | 20000000 |
spi-cpol |
时钟极性(高电平空闲) | 无值(布尔属性) |
spi-cpha |
时钟相位(第二个边沿采样) | 无值(布尔属性) |
1.5 从设备树到驱动的完整链路
设备树中的SPI节点最终需要与内核驱动协同工作,形成一条完整的硬件-软件链路:
1.6 课程目标与学习路径
本课程旨在帮助嵌入式Linux开发者系统掌握设备树中SPI设备的配置方法,并理解从设备树节点到驱动初始化的完整链路。课程分为以下四个阶段:
| 阶段 | 章节范围 | 核心内容 | 学习产出 |
|---|---|---|---|
| 基础篇 | 第1-5章 | SPI协议、设备树语法、控制器节点配置 | 能独立编写SPI控制器设备树节点 |
| 进阶篇 | 第6-15章 | 从设备节点、GPIO片选、DMA、时钟配置 | 掌握复杂SPI场景的设备树配置 |
| 驱动篇 | 第16-25章 | SPI驱动框架、probe流程、数据传输、中断处理 | 能编写完整的SPI设备驱动 |
| 实战篇 | 第26-30章 | 多从设备、高速SPI、调试技巧、案例分析 | 具备独立调试和优化SPI系统的能力 |
学习前提: 建议学习者具备C语言基础、Linux内核模块开发基本概念,以及至少一种嵌入式开发板(如i.MX6ULL、STM32MP1、Raspberry Pi)的使用经验。本课程将基于Linux 5.10 LTS内核版本进行讲解。