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怎么选?时序怎么看?芯片怎么挑?

I2C与SPI总线知识体系总览 I2C与SPI总线知识体系总览 总线选型决策 I2C总线 SPI总线 2线制(SCL+SDA) 半双工通信 地址寻址 总线仲裁 4线制(含CS) 全双工通信 CPOL/CPHA 片选控制 选型口诀:低速多设备用I2C,高速大数据用SPI AT24C02(I2C)适合存配置,MPU9250(SPI)适合高速传感 AT24C02 (I2C EEPROM) MPU9250 (9轴传感器)

1.5 本章小结

这一章咱们把I2C和SPI的物理层差异、时序要点、典型芯片选型都过了一遍。说白了,就是让你拿到一个项目需求时,能快速判断:用I2C还是SPI?选什么芯片?

我个人建议,初学者先从AT24C02的I2C驱动写起,因为它逻辑简单、调试方便。等I2C玩熟了,再挑战MPU9250的SPI驱动——那时候你会发现,SPI的速率优势真不是吹的。

最后提醒一句:不管用哪条总线,一定要先看芯片手册的时序图!我见过太多人凭经验写驱动,结果芯片不工作,最后发现是时序参数没配对。手册是王道,别偷懒。