1. 课程导论与硬件基础
各位同学,欢迎来到《ARM架构外设驱动开发:SPI与I2C控制器配置实战》的第一章。在正式开始撸代码之前,咱们得先把底层的硬件逻辑理清楚。我见过太多工程师一上来就对着寄存器手册猛写,结果板子一跑就挂,查了半天发现是协议时序没搞懂——这种坑,我踩过不止一次。
这一章,咱们就聊聊ARM SoC的整体架构、SPI和I2C到底差在哪、怎么选开发板、以及数据手册该怎么读。说白了,就是给你一套“看家本领”,以后拿到任何一款ARM芯片,你都知道从哪下手。
1.1 ARM SoC架构概览
ARM SoC(System on Chip)不是一颗单纯的CPU,它是一整套系统。你可以把它想象成一个微型城市:CPU是市长办公室,负责决策;总线系统是主干道,负责数据运输;各种外设控制器(SPI、I2C、UART、GPIO等)就是城市里的工厂和仓库,干具体的活。
典型的ARM SoC内部结构大致如下:
- 处理器核心:Cortex-A系列(跑Linux)、Cortex-M系列(跑RTOS/裸机)、Cortex-R系列(实时控制)。咱们课程主要基于Cortex-A系列,因为要跑Linux内核驱动。
- 总线矩阵:AMBA(Advanced Microcontroller Bus Architecture)总线家族。常见的有AHB(高速总线,接内存、DMA)、APB(低速总线,接外设控制器)。SPI和I2C控制器通常挂在APB上。
- 外设控制器:每个外设都是一组寄存器映射到内存地址空间。CPU通过读写这些寄存器来控制外设行为。
- 中断控制器(GIC):外设干活干完了,通过中断通知CPU。GIC负责分发中断。
- 时钟与复位管理:每个外设都有自己的时钟门控,不用的外设可以关掉省电。
核心要点:驱动开发本质上就是“操作寄存器”。但寄存器怎么配、配完怎么同步、中断怎么处理,这些都得基于你对SoC架构的理解。
我个人习惯,拿到一款新芯片,第一件事不是看驱动代码,而是先看芯片的内存映射图。找到SPI和I2C控制器的基地址,看看它们挂在哪个总线上,时钟源是什么。这一步能帮你避免很多低级错误。
1.2 SPI与I2C协议对比
SPI和I2C是嵌入式系统里最常用的两种板级通信协议。很多初学者会问:“到底用哪个?”我的答案是:看场景。没有万能的协议,只有合适的协议。
咱们先看一张对比表,把核心差异列清楚:
| 对比维度 | SPI | I2C |
|---|---|---|
| 信号线数量 | 4线(SCLK, MOSI, MISO, CS) | 2线(SCL, SDA) |
| 通信方式 | 全双工 | 半双工 |
| 主从结构 | 一主多从(每个从设备独立CS) | 多主多从(地址寻址) |
| 速度 | 典型10-50MHz,最高可达100MHz+ | 标准100kHz,快速400kHz,高速3.4MHz |
| 硬件复杂度 | 简单,无地址机制 | 稍复杂,需地址匹配和ACK |
| 典型应用 | ADC/DAC、LCD、Flash、SD卡 | 传感器、EEPROM、RTC、温度监控 |
你想想看,SPI为什么快?因为它全双工,主设备发数据的同时就能收数据,而且没有地址帧、ACK这些开销。但代价就是线多,每加一个从设备就得加一根片选线。
I2C呢,两根线走天下,通过地址寻址,理论上可以挂上百个设备。但半双工意味着同一时间只能一个方向传输,而且每个字节后面都要跟一个ACK位,速度自然上不去。
我的经验:如果项目里需要高速传输大量数据(比如刷LCD、读写SD卡),无脑选SPI。如果只是读个温度、配个寄存器,I2C更省引脚,布线也简单。我在一个项目里遇到过用I2C读摄像头数据,结果帧率死活上不去——后来换成SPI,问题直接解决。
1.3 开发板选型与数据手册解读
选开发板这件事,我建议你先看芯片,再看板子。芯片的数据手册(Datasheet)和技术参考手册(TRM)才是最终权威。板子只是载体。
咱们课程主要基于以下平台讲解:
- STM32MP157:Cortex-A7 + Cortex-M4异构架构,资料丰富,社区活跃。适合入门到进阶。
- i.MX6ULL:单核Cortex-A7,工业级稳定,很多产品量产都在用。适合深入学习Linux驱动。
- 树莓派(BCM2837/2711):Cortex-A53/A72,生态最好,但外设控制器实现偏“魔改”,适合验证思路。
拿到数据手册,怎么看?我一般按这个顺序:
- 看内存映射:找到SPI/I2C控制器的基地址和地址范围。
- 看时钟树:外设时钟源是什么?默认使能了吗?分频系数怎么算?
- 看寄存器描述:控制寄存器、状态寄存器、数据寄存器、中断寄存器。每个bit的含义必须搞清楚。
- 看时序图:SPI的CPOL/CPHA怎么配?I2C的SCL频率怎么算?
- 看电气特性:IO电平是3.3V还是1.8V?上拉电阻要不要加?
避坑指南:我曾经在一个项目里,照着数据手册配好了SPI寄存器,但死活通信不上。查了两天,最后发现是芯片的SPI引脚默认被JTAG占用了,需要在PIN MUX寄存器里重新配置。所以,拿到数据手册,一定要看引脚复用(Pin Mux)章节!
另外,我建议你准备一个笔记本(或者电子笔记),把每个外设的关键寄存器地址、默认值、配置步骤记下来。别指望脑子能记住所有细节——芯片手册动辄几千页,你不可能全背下来。
1.4 本章小结
这一章咱们把ARM SoC的骨架搭起来了,也理清了SPI和I2C的核心差异。选型和数据手册的阅读方法,是后续所有章节的基础。说白了,驱动开发就是“翻译”数据手册的过程——把芯片厂商的硬件描述,翻译成Linux内核能理解的代码。