1. 课程导学与环境准备

各位同学好,欢迎来到《SPI接口驱动移植与全志T113内核编译实战》的第一章。这一章我们不做代码,先把地基打牢。我个人习惯是,不管多着急的项目,环境准备这一步绝不能省。你想想看,工具链都没配好,后面写再多代码也是白搭。

1.1 SPI协议基础回顾

SPI,全称Serial Peripheral Interface,说白了就是四根线搞定设备间通信。我刚开始做嵌入式时,总觉得SPI比I2C简单,后来踩了几个坑才发现——越简单的东西,细节越要命。

SPI的四根核心信号线:

信号 全称 方向 作用
SCLK Serial Clock 主→从 时钟同步,由主机产生
MOSI Master Out Slave In 主→从 主机发送数据给从机
MISO Master In Slave Out 从→主 从机回复数据给主机
CS Chip Select 主→从 片选信号,低电平有效

这里有个关键点:SPI是全双工的。什么意思?就是主机发数据的同时,从机也在往回发数据。我在项目中遇到过有人把SPI当单工用,结果读回来的数据全是错的——嗯,其实是因为没发虚拟字节去触发从机回复。

SPI有四种工作模式,由时钟极性(CPOL)和时钟相位(CPHA)决定:

模式 CPOL CPHA 采样边沿 典型场景
模式0 0 0 上升沿采样 最常用,兼容性好
模式1 0 1 下降沿采样 部分ADC芯片
模式2 1 0 下降沿采样 某些Flash芯片
模式3 1 1 上升沿采样 部分传感器
避坑指南:我曾经因为SPI模式没配对,调了整整两天。从机手册上写的是模式0,结果实际要模式3才能工作。所以拿到任何SPI设备,第一件事就是拿示波器看波形,别全信手册。

1.2 全志T113芯片概览

全志T113,这是一颗双核Cortex-A7处理器,主频1.2GHz。我选这颗芯片做课程,原因很简单:性价比高、资料全、SPI控制器设计规范。你在实际项目中遇到的SPI问题,T113上基本都能复现。

T113的SPI控制器特性:

  • 支持4个SPI控制器(SPI0~SPI3)
  • 最高时钟频率100MHz
  • 支持DMA传输模式
  • 内置FIFO深度64字节
  • 支持标准SPI、双线SPI、四线SPI

我建议你重点关注SPI0和SPI1,这两个控制器在开发板上引出了标准排针,调试起来最方便。

1.3 开发板选型与硬件连接

课程使用的是全志T113-S3开发板,某宝上两百多块就能买到。选这块板子还有一个原因——它的原理图是开源的,后面我们做驱动移植时,查引脚复用关系会非常方便。

硬件连接其实就几步:

  1. 把SPI从机模块插到面包板上
  2. 用杜邦线连接SCLK、MOSI、MISO、CS四根线
  3. 注意共地——GND必须连,不然波形全是乱的
  4. 检查电平匹配,T113是3.3V电平,别直接接5V设备
小技巧:我习惯在CS线上串一个10kΩ上拉电阻到3.3V。这样在SPI总线空闲时,CS被拉高,从机不会误触发。这个习惯帮我避免过好几次莫名其妙的通信错误。

1.4 Ubuntu开发环境搭建

开发环境我用的是Ubuntu 22.04 LTS。为什么选这个版本?因为全志官方SDK就是基于这个版本测试的,你用其他版本可能会遇到依赖库版本不兼容的问题。

安装必要工具包:

sudo apt update
sudo apt install -y build-essential git vim
sudo apt install -y libncurses5-dev libssl-dev
sudo apt install -y flex bison bc
sudo apt install -y u-boot-tools device-tree-compiler

这里有个坑:libncurses5-dev和libncurses-dev是两个不同的包。我刚开始装的是后者,结果make menuconfig时界面全是乱码。后来才发现全志的配置脚本依赖的是ncurses5的库。

1.5 交叉编译工具链安装与验证

交叉编译工具链,说白了就是在PC上编译出能在ARM芯片上运行的程序。我们用的是Linaro提供的gcc-arm-linux-gnueabihf工具链。

安装步骤:

# 下载工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

# 添加环境变量
echo 'export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin' >> ~/.bashrc
source ~/.bashrc

验证是否安装成功:

arm-linux-gnueabihf-gcc --version

如果看到类似下面的输出,说明工具链已经就绪:

arm-linux-gnueabihf-gcc (Linaro GCC 7.5.0-2019.12) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
验证小实验:写一个简单的hello.c,用交叉编译器编译,然后放到开发板上运行。如果能在板子上打印出"Hello SPI",那你的环境就彻底准备好了。

本章知识结构

下面这张图把本章的核心知识点串了起来,你可以对照着检查自己是否都掌握了:

第1章 知识体系结构图 环境准备与基础 SPI协议基础 T113芯片概览 开发板与硬件 Ubuntu环境搭建 四线信号 四种模式 硬件连接与电平 工具链安装验证 核心目标 掌握SPI通信原理 → 熟悉T113硬件 → 搭建完整开发环境