1. 课程导学与硬件基础:I2C与SPI协议概述
各位同学,欢迎来到《I2C总线与SPI协议开发外设驱动实战》的第一章。
做嵌入式驱动开发这些年,我见过不少工程师拿着数据手册对着I2C和SPI的时序图发呆。说实话,我刚入行时也一样。这两个协议看起来简单,但真要在项目里把外设调通,坑还真不少。
这一章我们先打好地基。不急着写代码,先把I2C和SPI是什么、它们在整个嵌入式系统里扮演什么角色搞清楚。你想想看,驱动开发说白了就是让CPU和外设之间能“说上话”,而I2C和SPI就是最常用的两种“方言”。
1.1 嵌入式系统通信架构概览
一个典型的嵌入式系统,内部通信是分层的。我习惯把它画成下面这张图:
嵌入式系统通信分层(个人总结)
- 应用层:用户程序、业务逻辑
- 驱动层:Linux驱动、RTOS驱动、裸机驱动
- 总线/协议层:I2C、SPI、UART、CAN、USB等
- 物理层:GPIO、电平转换、PCB走线、连接器
我们这门课聚焦在总线/协议层和驱动层的接口处。说白了,就是教你如何用代码去控制I2C和SPI这两条总线,让CPU和外设(比如传感器、ADC、显示屏)正常通信。
我在一个工业控制项目里遇到过这种情况:传感器数据偶尔跳变,查了三天,最后发现是I2C总线上拉电阻没焊好,导致信号上升沿太慢。嗯,物理层的问题往往最隐蔽。
1.2 I2C协议概述
I2C(Inter-Integrated Circuit)是飞利浦公司在1980年代发明的。它只用两根线——SDA(数据线)和SCL(时钟线)——就能挂载多个设备。每个设备有一个唯一的7位或10位地址。
I2C的核心特点:
| 特性 | 说明 |
|---|---|
| 线数 | 2根(SDA + SCL) |
| 通信方式 | 半双工,主从模式 |
| 速率 | 标准模式100kHz,快速模式400kHz,高速模式3.4MHz |
| 设备寻址 | 7位或10位地址,支持多主机 |
| 传输单元 | 以字节为单位,每字节后跟ACK/NACK |
| 典型应用 | 温度传感器、EEPROM、RTC、IO扩展芯片 |
我个人习惯把I2C比作一个“会议室”:SCL是主持人(时钟),SDA是发言者(数据)。主持人控制节奏,谁想发言得先报自己的名字(地址),然后才能说话。一次只能说一个字节,说完要等大家回应(ACK)。
避坑指南:我曾经在一个项目里把I2C设备的地址搞反了——数据手册上写的是7位地址0x48,但Linux驱动里需要左移一位变成0x90。这种坑,新手几乎必踩一次。
1.3 SPI协议概述
SPI(Serial Peripheral Interface)是摩托罗拉推出的。它比I2C多两根线,但速度更快,结构更简单。
SPI的四根线:
- SCLK:串行时钟,由主机产生
- MOSI:主机输出,从机输入
- MISO:主机输入,从机输出
- CS/SS:片选信号,低电平有效
SPI的核心特点:
| 特性 | 说明 |
|---|---|
| 线数 | 4根(SCLK + MOSI + MISO + CS),也可用3线模式 |
| 通信方式 | 全双工,主从模式 |
| 速率 | 通常10MHz~50MHz,甚至更高 |
| 设备寻址 | 通过片选线CS选择,无地址概念 |
| 传输单元 | 以字节或字为单位,无ACK机制 |
| 典型应用 | ADC/DAC、LCD显示屏、SD卡、Flash存储器 |
SPI就像一条“双向高速公路”:主机和从机可以同时发送和接收数据。每个从机有自己的“收费站”(CS线),主机拉低哪个CS,就和哪个从机通信。
注意:SPI没有标准的应答机制。主机发送数据时,并不知道从机是否真的收到了。所以很多SPI设备会在数据帧里加入CRC校验或状态寄存器,这一点在驱动开发时要特别留意。
1.4 I2C与SPI的对比
很多初学者会问:到底用I2C还是SPI?我的回答是:看场景。
| 对比项 | I2C | SPI |
|---|---|---|
| 引脚数量 | 2根(少) | 4根(多) |
| 速度 | 慢(100kHz~3.4MHz) | 快(10MHz~50MHz+) |
| 通信方式 | 半双工 | 全双工 |
| 设备数量 | 多(地址区分,理论127个) | 少(每设备需独立CS) |
| 硬件复杂度 | 需上拉电阻 | 无需上拉,但CS线多 |
| 协议复杂度 | 较复杂(地址、ACK、时钟同步) | 简单(无地址、无ACK) |
| 典型场景 | 传感器、RTC、EEPROM | ADC、LCD、Flash、SD卡 |
我个人习惯:如果外设对速度要求不高,且引脚紧张,优先选I2C。如果追求吞吐量,或者外设本身只支持SPI,那就用SPI。你想想看,一个温度传感器每秒才读一次,用I2C绰绰有余;但一个高帧率的LCD显示屏,不用SPI根本跑不动。
1.5 开发板与工具介绍
这门课我们主要用STM32F4系列开发板和树莓派来演示。为什么选这两个?
- STM32F4:工业级MCU,I2C和SPI外设齐全,适合裸机和RTOS驱动开发
- 树莓派:Linux环境,可以用用户空间的i2c-dev和spidev接口快速验证
必备工具清单:
| 工具 | 用途 |
|---|---|
| 逻辑分析仪 | 抓取I2C/SPI总线波形,调试时序问题 |
| 示波器 | 测量信号质量、上升沿/下降沿时间 |
| 万用表 | 检查电压、通断、上拉电阻值 |
| USB转I2C/SPI适配器 | PC直接与I2C/SPI设备通信,方便调试 |
我的建议:逻辑分析仪是调试I2C和SPI的“神器”。我曾经花了两天查一个SPI驱动问题,最后用逻辑分析仪一看,发现CS信号的时序比数据手册要求晚了几个时钟周期。这种问题,光看代码根本看不出来。
1.6 本章知识体系
下面这张图总结了本章的核心知识点和它们之间的关系:
这张图把本章的核心内容串起来了。从嵌入式通信架构出发,分出I2C和SPI两条主线,每条线又展开各自的关键特性。底部是我们在后续章节会用到的开发板和调试工具。
好了,第一章就到这里。内容不多,但都是基础中的基础。后面的章节我们会一步步深入,从硬件时序到Linux驱动框架,再到实际外设的驱动开发。嗯,路还长,咱们慢慢走。