第一章:SPI与I2C基础回顾
各位同学好,我是老张。在汽车电子这行摸爬滚打了十几年,今天咱们来聊聊ECU里最常用的两种总线——SPI和I2C。
说实话,很多工程师对这两个协议的理解停留在「会用」层面。但真正到了项目里,时序对不上、从机没响应、数据丢包……这些问题我当年都踩过坑。今天这堂课,咱们把基础打扎实。
1.1 SPI协议原理
SPI,全称Serial Peripheral Interface。摩托罗拉发明的,简单粗暴。
它用四根线:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。
我习惯把SPI比作「乒乓通信」——主设备发一个时钟脉冲,从设备就回一个数据位。你发我也发,同时进行。
核心要点:
- 全双工通信,收发同时进行
- 主设备控制时钟,从设备被动响应
- 片选信号低电平有效,选中哪个从机就拉低哪个
这里有个坑,我当年在调试一个ABS传感器时遇到过:SPI的时钟极性(CPOL)和时钟相位(CPHA)必须匹配。主设备设成模式0,从设备却是模式3,结果数据全乱套。
四种模式怎么记?我教你个口诀:
- 模式0:CPOL=0,CPHA=0 —— 空闲低电平,第一个边沿采样
- 模式1:CPOL=0,CPHA=1 —— 空闲低电平,第二个边沿采样
- 模式2:CPOL=1,CPHA=0 —— 空闲高电平,第一个边沿采样
- 模式3:CPOL=1,CPHA=1 —— 空闲高电平,第二个边沿采样
说白了,你只要记住:主从设备的模式必须一模一样。否则就是鸡同鸭讲。
1.2 I2C协议原理
I2C是飞利浦搞的,两根线:SDA(数据线)和SCL(时钟线)。
跟SPI不同,I2C是半双工。一根数据线上,主设备发完从设备才能回。而且它没有片选线,靠地址来寻址。
你想想看,一根线上挂几十个设备,怎么区分?靠7位或10位地址。每个从机有自己的ID,主设备发地址时,匹配上的从机才会应答。
个人经验:I2C的速率通常比SPI慢。标准模式100kHz,快速模式400kHz,高速模式3.4MHz。但SPI轻松上几十MHz。所以ECU里,传感器配置用I2C,大数据传输用SPI。
I2C的时序我简单捋一下:
- 起始条件:SCL高电平时,SDA从高变低
- 发送7位地址 + 读写位
- 从机应答(拉低SDA)
- 传输数据(每字节后跟应答位)
- 停止条件:SCL高电平时,SDA从低变高
嗯,这里要注意:应答信号是必须的。我曾经调试一个胎压监测模块,从机死活不应答。查了半天,发现是地址写错了——7位地址左移了一位,把读写成写了。
1.3 ECU中的典型应用场景对比
在ECU里,SPI和I2C各有各的活。我列个表,大家一目了然:
| 对比项 | SPI | I2C |
|---|---|---|
| 线数 | 4根(全双工) | 2根(半双工) |
| 速率 | 最高可达50MHz+ | 通常100kHz~3.4MHz |
| 寻址方式 | 片选信号 | 设备地址 |
| 典型应用 | ADC、DAC、闪存、传感器数据流 | 温度传感器、EEPROM、RTC、PMIC配置 |
| ECU场景 | 发动机控制、变速箱控制、高速数据采集 | 电池管理、车身控制、诊断接口 |
我个人的经验是:能用SPI的地方尽量用SPI,除非引脚不够。为什么?SPI简单、快、稳定。I2C虽然省线,但容易出问题——总线锁死、应答超时、地址冲突……
举个例子,我在做发动机ECU时,曲轴位置传感器的数据必须实时读取,延迟超过1微秒都不行。这种场景只能用SPI。而像车内温度传感器,几秒钟更新一次数据,I2C完全够用。
避坑指南:我曾经在一个项目中,把I2C总线上挂了8个设备,结果通信老是出错。后来发现是总线电容太大,上拉电阻没选对。记住:I2C总线的上拉电阻要根据总线电容和速率来算,别随便用个4.7kΩ就完事。
最后说一句:没有最好的协议,只有最合适的协议。SPI和I2C就像螺丝刀和扳手,各有各的用处。关键是你得知道什么时候用哪个。
下一章,咱们深入讲讲SPI在ECU中的高级应用——多从机仲裁和DMA传输。到时候我会分享一个我在变速箱控制单元里的实战案例,保证干货满满。