1. 课程导论与硬件基础:I2C与SPI总线物理层对比、时序图解读、常见外设芯片选型
各位同学好,我是你们这门课的老周。做嵌入式驱动开发十几年了,踩过的坑比写过的代码还多。今天咱们开篇不讲虚的,直接聊最实在的东西——I2C和SPI这两条总线,到底该怎么选、怎么用。
说实话,很多新手工程师一上来就纠结“I2C和SPI哪个好”。我的回答是:没有好坏,只有合不合适。你想想看,一个项目里同时挂4个传感器,用I2C两根线搞定;另一个项目要高速传输摄像头数据,不用SPI你还能用啥?
1.1 物理层对比:两条线的战争
先看一张表,把最核心的差异说清楚。我当年带团队做智能手表项目时,就因为在I2C上挂了个高速陀螺仪,结果数据老是丢包——后来才发现是总线速率没算对。
| 对比项 | I2C | SPI |
|---|---|---|
| 信号线数量 | 2根(SCL + SDA) | 4根(SCLK + MOSI + MISO + CS) |
| 通信方式 | 半双工 | 全双工 |
| 速率范围 | 标准100kHz / 快速400kHz / 高速3.4MHz | 通常10MHz~50MHz,甚至更高 |
| 从设备选择 | 7位或10位地址 | 独立CS片选线 |
| 总线拓扑 | 多主多从,总线仲裁 | 单主多从,无仲裁 |
| 抗干扰能力 | 较弱(开漏输出) | 较强(推挽输出) |
| 典型应用 | EEPROM、温湿度传感器、RTC | Flash、LCD、ADC、SD卡 |
核心结论:I2C省引脚但慢,SPI快但费引脚。选型时先看速率需求,再看引脚预算。
1.2 时序图解读:别被那些波形吓到
很多同学看到时序图就头疼。其实说白了,时序图就是芯片之间“握手”的规矩。我刚开始学的时候也看不懂,后来发现一个窍门——把时序图当成“红绿灯”来看。
I2C时序要点
I2C的时序有几个关键动作:起始条件、停止条件、数据采样、应答信号。我习惯用一句话记:SCL高电平时,SDA跳变是控制信号;SCL低电平时,SDA才能变数据。
- 起始条件:SCL高电平,SDA从高变低
- 停止条件:SCL高电平,SDA从低变高
- 数据采样:SCL高电平时读取SDA上的数据
- 应答信号:每发完8位数据,接收方拉低SDA表示“收到了”
避坑指南:我曾经在一个项目里,I2C总线上的上拉电阻选错了值——用了10kΩ,结果400kHz模式下波形都变圆了。后来换成2.2kΩ,问题解决。记住:速率越高,上拉电阻要越小。
SPI时序要点
SPI的时序比I2C简单多了。它没有地址、没有应答,就是纯粹的“主设备发时钟,数据同步传输”。但有个坑——时钟极性(CPOL)和时钟相位(CPHA),这俩参数配不对,数据全是乱的。
- CPOL=0:空闲时SCLK为低电平
- CPOL=1:空闲时SCLK为高电平
- CPHA=0:第一个跳变沿采样数据
- CPHA=1:第二个跳变沿采样数据
注意:SPI的4种模式(Mode 0~3)由CPOL和CPHA组合决定。选型时一定要看芯片手册里的时序图,确认它工作在哪个模式。我见过有人把Mode 0的Flash当Mode 3用,读出来的数据全是0xFF。
1.3 常见外设芯片选型:AT24C02与MPU9250
讲完理论,咱们看两个实际芯片。这两个是我项目里用得最多的,也是最适合入门的。
AT24C02:I2C接口的EEPROM
AT24C02是Atmel(现Microchip)的2Kbit串行EEPROM。为什么选它做教学?因为它简单、便宜、不容易坏。我当年第一个驱动就是写AT24C02的读写。
| 参数 | 值 |
|---|---|
| 容量 | 2Kbit(256字节) |
| I2C地址 | 0x50~0x57(由A0/A1/A2引脚决定) |
| 最大速率 | 400kHz(快速模式) |
| 写周期 | 最大5ms(页写入后需等待) |
| 页大小 | 16字节 |
选型建议:AT24C02适合存配置参数、校准数据、设备ID。注意写操作后要加延时或查询应答,否则下一笔写会失败。
MPU9250:SPI/I2C双接口的9轴传感器
MPU9250是InvenSense的9轴运动传感器(3轴陀螺仪+3轴加速度计+3轴磁力计)。它同时支持I2C和SPI接口,但注意——一旦检测到CS引脚被拉低,它会自动切换到SPI模式。
- I2C模式:地址0x68(AD0接地)或0x69(AD0接VCC)
- SPI模式:最大速率20MHz,Mode 0或Mode 3
- 内部寄存器:通过SPI/I2C读写,磁力计通过I2C从机总线访问
个人经验:用MPU9250做无人机姿态解算时,我建议用SPI接口。I2C在400kHz下读取9轴数据,采样率上不去,容易导致姿态漂移。换成SPI 10MHz后,数据更新率从100Hz飙到500Hz。
1.4 知识体系总览:一张图看懂本章
下面这张图把本章的核心知识点串起来了。我画图有个习惯——先画骨架,再填血肉。你看完这张图,应该能回答三个问题:I2C和SPI怎么选?时序怎么看?芯片怎么挑?
1.5 本章小结
这一章咱们把I2C和SPI的物理层差异、时序要点、典型芯片选型都过了一遍。说白了,就是让你拿到一个项目需求时,能快速判断:用I2C还是SPI?选什么芯片?
我个人建议,初学者先从AT24C02的I2C驱动写起,因为它逻辑简单、调试方便。等I2C玩熟了,再挑战MPU9250的SPI驱动——那时候你会发现,SPI的速率优势真不是吹的。
最后提醒一句:不管用哪条总线,一定要先看芯片手册的时序图!我见过太多人凭经验写驱动,结果芯片不工作,最后发现是时序参数没配对。手册是王道,别偷懒。