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 | 上升沿采样 | 部分传感器 |
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开发板,某宝上两百多块就能买到。选这块板子还有一个原因——它的原理图是开源的,后面我们做驱动移植时,查引脚复用关系会非常方便。
硬件连接其实就几步:
- 把SPI从机模块插到面包板上
- 用杜邦线连接SCLK、MOSI、MISO、CS四根线
- 注意共地——GND必须连,不然波形全是乱的
- 检查电平匹配,T113是3.3V电平,别直接接5V设备
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.
本章知识结构
下面这张图把本章的核心知识点串了起来,你可以对照着检查自己是否都掌握了: