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系统中,独立片选是最常见的配置方式。

SPI 独立片选拓扑结构 SPI Master (SoC / CPU) Slave #1 (传感器) Slave #2 (ADC) Slave #3 (LCD) SCLK MOSI MISO CS (独立片选) 拓扑特点 • 每个从设备独占一条CS线 • 共享SCLK/MOSI/MISO总线 • 支持全双工同步传输

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节点最终需要与内核驱动协同工作,形成一条完整的硬件-软件链路:

设备树 → SPI驱动 完整链路 设备树节点 (.dts / .dtsi) OF 解析层 (of_match_table) SPI 核心层 (spi_register_driver) 设备驱动 (probe / remove) 硬件寄存器 (MMIO / IRQ) 用户空间 (spidev / sysfs) 链路关键点 ① compatible 匹配 ② 设备树属性解析 ③ 驱动 probe 回调

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内核版本进行讲解。

1.7 本章小结