1. 通信基础:I2C与SPI协议概述
做电机控制这些年,我越来越觉得通信协议是绕不开的坎。很多人一上来就调PID、算FOC,结果板子焊好了,编码器数据读不出来,驱动器配置写不进去——卡在通信上。说白了,I2C和SPI就是嵌入式世界里最常用的两种“对话方式”。
这一章我们先打好地基。把同步异步的区别搞清楚,把I2C和SPI的骨架搭起来,再结合电机控制的实际需求,看看什么时候该用谁。
1.1 同步通信 vs 异步通信
先问个问题:两个人聊天,怎么保证对方听懂了?
同步通信就像开会时轮流发言——我说一句,你回应一句,节奏由时钟控制。SPI就是典型,主设备提供时钟,从设备跟着时钟走,数据在时钟边沿采样。你想想看,这种方式简单粗暴,但可靠。
异步通信呢?就像发微信——我发一条消息,你什么时候看到、什么时候回,我不确定。UART就是异步的典型,双方得事先约定好波特率、数据位、停止位,靠起始位和停止位来“对齐”。
核心区别一句话:同步通信有时钟线,异步通信没有。
我在项目中遇到过一件事:有个同事用UART和编码器通信,波特率设错了,数据全是乱码。查了两天才发现是时钟漂移的问题。如果是SPI,根本不会有这种事。
| 对比项 | 同步通信(SPI) | 异步通信(I2C/UART) |
|---|---|---|
| 时钟线 | 有(SCK) | 无 |
| 数据对齐 | 时钟边沿采样 | 起始位+波特率 |
| 传输速率 | 高(可达几十MHz) | 较低(受波特率限制) |
| 抗干扰 | 较强(时钟同步) | 较弱(时钟漂移敏感) |
| 硬件复杂度 | 线多(至少4线) | 线少(2线即可) |
1.2 I2C总线协议速览
I2C是飞利浦(现在的NXP)在80年代搞出来的。初衷很简单:让芯片之间用两根线就能通信。
这两根线是:
- SDA(数据线)——双向传输数据
- SCL(时钟线)——由主设备驱动
I2C是半双工的,同一时刻只能一个方向传数据。每个从设备有唯一的7位或10位地址,主设备通过地址来选择跟谁说话。
我的习惯:画原理图时,SDA和SCL一定要加上拉电阻,4.7kΩ是常用值。少了拉不动,多了信号边沿太缓。我曾经吃过这个亏,焊了10块板子,8块I2C不通,最后发现是上拉电阻选错了。
I2C的传输流程大致是:
- 主设备发送起始条件(SCL高时SDA从高变低)
- 发送7位从设备地址 + 读写位
- 从设备应答(ACK)
- 传输数据(每字节后跟ACK)
- 主设备发送停止条件(SCL高时SDA从低变高)
标准模式100kHz,快速模式400kHz,高速模式能到3.4MHz。但在电机控制里,我一般用100kHz或400kHz,够用且稳定。
1.3 SPI协议速览
SPI是Motorola搞的,全称Serial Peripheral Interface。它比I2C快,也比I2C费线。
SPI需要4根线:
- SCLK(时钟)——由主设备产生
- MOSI(主出从入)
- MISO(主入从出)
- CS(片选)——每个从设备一根
SPI是全双工的,主设备发数据的同时也能收数据。没有地址的概念,靠片选线选通从设备。
注意:SPI有4种模式(CPOL和CPHA的组合)。主设备和从设备必须用同一模式,否则数据会错位。我见过有人把模式0和模式3混用,数据读出来全是0x00,折腾了半天。
SPI的传输流程:
- 主设备拉低CS,选中从设备
- 主设备在SCLK上产生时钟脉冲
- 每个时钟周期,主设备通过MOSI发一位,同时从MISO收一位
- 传输完成后,主设备拉高CS
SPI的速率可以很高,几十MHz很常见。在电机控制里,SPI常用于高速ADC、编码器、以及驱动器的寄存器配置。
1.4 电机控制中的通信需求分析
电机控制系统里,通信到底用来干什么?我总结了三类场景:
第一类:配置与参数读写
比如给电机驱动芯片写寄存器,设置电流限幅、PWM频率、死区时间等。这类数据量小,对速率要求不高,但对可靠性要求高。I2C很适合,因为线少,而且有应答机制。
第二类:实时数据采集
比如读编码器位置、电流采样值、温度等。这类数据需要周期性读取,对实时性有要求。SPI更合适,因为速率高、延迟低。
第三类:多设备组网
一个主控可能要管好几个电机,每个电机又有自己的驱动器和传感器。I2C的多从机能力在这里就体现出来了,一根总线上挂十几个设备没问题。
我的选型原则:
- 配置类、低速传感器 → I2C(线少、地址灵活)
- 高速数据、实时控制 → SPI(速率高、全双工)
- 距离远、抗干扰要求高 → 考虑差分SPI或RS-485
我记得有一次做四轴机器人,每个关节电机都要读编码器。如果用I2C,总线负载太重,延迟不可控。最后全部换成SPI,每个电机独立片选,实时性一下就上来了。
1.5 本章知识结构图
下面这张图把I2C和SPI的核心差异、以及电机控制中的选型逻辑串起来了。你可以把它当作本章的“地图”。
1.6 小结
这一章我们聊了:
- 同步和异步通信的本质区别——有没有时钟线
- I2C的两线制、地址寻址、半双工特点
- SPI的四线制、全双工、高速特点
- 电机控制中,配置类任务用I2C,实时数据用SPI