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的传输流程大致是:

  1. 主设备发送起始条件(SCL高时SDA从高变低)
  2. 发送7位从设备地址 + 读写位
  3. 从设备应答(ACK)
  4. 传输数据(每字节后跟ACK)
  5. 主设备发送停止条件(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的传输流程:

  1. 主设备拉低CS,选中从设备
  2. 主设备在SCLK上产生时钟脉冲
  3. 每个时钟周期,主设备通过MOSI发一位,同时从MISO收一位
  4. 传输完成后,主设备拉高CS

SPI的速率可以很高,几十MHz很常见。在电机控制里,SPI常用于高速ADC、编码器、以及驱动器的寄存器配置。

1.4 电机控制中的通信需求分析

电机控制系统里,通信到底用来干什么?我总结了三类场景:

第一类:配置与参数读写

比如给电机驱动芯片写寄存器,设置电流限幅、PWM频率、死区时间等。这类数据量小,对速率要求不高,但对可靠性要求高。I2C很适合,因为线少,而且有应答机制。

第二类:实时数据采集

比如读编码器位置、电流采样值、温度等。这类数据需要周期性读取,对实时性有要求。SPI更合适,因为速率高、延迟低。

第三类:多设备组网

一个主控可能要管好几个电机,每个电机又有自己的驱动器和传感器。I2C的多从机能力在这里就体现出来了,一根总线上挂十几个设备没问题。

我的选型原则:

  • 配置类、低速传感器 → I2C(线少、地址灵活)
  • 高速数据、实时控制 → SPI(速率高、全双工)
  • 距离远、抗干扰要求高 → 考虑差分SPI或RS-485

我记得有一次做四轴机器人,每个关节电机都要读编码器。如果用I2C,总线负载太重,延迟不可控。最后全部换成SPI,每个电机独立片选,实时性一下就上来了。

1.5 本章知识结构图

下面这张图把I2C和SPI的核心差异、以及电机控制中的选型逻辑串起来了。你可以把它当作本章的“地图”。

电机控制通信协议选型框架 电机控制通信 I2C总线 SPI协议 2线:SDA + SCL 半双工 · 有应答 多从机 · 地址寻址 4线:SCLK + MOSI + MISO + CS 全双工 · 无应答 片选选通 · 高速 电机控制选型:配置用I2C · 数据用SPI 提示:I2C适合多设备配置场景,SPI适合高速实时数据采集

1.6 小结

这一章我们聊了:

  • 同步和异步通信的本质区别——有没有时钟线
  • I2C的两线制、地址寻址、半双工特点
  • SPI的四线制、全双工、高速特点
  • 电机控制中,配置类任务用I2C,实时数据用SPI