车载通信1000问:总线基础、故障排查与ECU接口选型

本篇迁移通信协议系列第一至第四篇及 SPI 菊花链补充内容,整理 12 道问答,把同步/异步、全/半双工、串并行、主从模式与真实 ECU 排障连接起来。

39. 同步通信和异步通信的区别是什么?

答案: 同步通信由发送端和接收端共享时钟或可恢复的时钟节奏;SPI 由 SCK 提供时钟。异步通信没有独立时钟线,双方通过预先约定波特率和帧格式采样,UART 是典型例子。

同步方式便于控制采样时刻,但需要时钟信号和相应布线;异步方式省时钟线,但双方时钟误差、帧长度和采样点必须满足容差。不能简单说同步通信一定更抗干扰,物理层信号质量和时序预算同样重要。

40. 全双工、半双工和单工分别是什么?

答案:

  • 全双工:双方可同时发送和接收,例如典型 SPI 四线接口。
  • 半双工:双方可双向通信,但同一时刻只能一方发送,例如 I2C、两线 RS-485。
  • 单工:数据只沿一个方向传输,例如基础 SENT 传感器到 ECU 的数据流。

协议的物理能力与应用层交互方式要区分:SPI 硬件可全双工,但上层驱动仍可能按请求—响应方式使用。

41. 串行通信一定比并行通信慢吗?

答案: 不一定。串行只表示按时间顺序逐 bit 传输;并行用多条线同时传输多个 bit。串行可以通过更高时钟、差分传输和更好的串扰控制获得很高吞吐;并行会受线间 skew、串扰、引脚数和布线复杂度影响。

现代高速链路(USB、PCIe、车载以太网)采用高速串行,不是因为并行在原理上一定慢,而是串行在高速互连和系统成本上更有优势。

42. 主从通信中,为什么 SPI 从设备在未选中时必须释放 MISO?

答案: 多个 SPI 从设备可以共享 SCK 和 MOSI,但若它们共用 MISO,未被选中的从设备必须将输出置为高阻态,否则多个器件可能同时驱动总线,产生电气争用和数据错误。I2C 也采用释放总线的开漏机制;多主仲裁则通过线与和总线状态检测完成。

43. UART 有波形但 MCU 没收到数据,怎样排查?

答案: 按信号链逐层定位:

  1. 示波器确认 TX/RX 电平、bit 宽度、空闲电平和帧格式。
  2. 逻辑分析仪解码确认波特率、数据位、校验位和停止位。
  3. GPIO 翻转或调试器确认 UART RX 中断是否触发。
  4. 检查 DMA/ISR 是否读取数据寄存器并清除错误标志。
  5. 检查环形缓冲区头尾指针、溢出计数和消费者任务调度。
  6. 检查 RTS/CTS 或软件流控是否阻塞发送。

波特率误差容限与数据位数、采样实现和双方时钟误差有关;“±2%”只能作为某些场景的粗略经验,不能替代具体 UART 时序预算。

44. SPI Flash 偶发写错,为什么降频有时能解决?

答案: 器件手册给出的最高 SPI 时钟是在规定电压、温度、负载和时序条件下的上限。PCB 走线、连接器、驱动强度、阻抗不连续和时钟边沿会引入振铃或建立/保持时间不足。降频可增加采样余量,但根因也可能是 CS 时序、写使能、BUSY 轮询或页边界处理。

推荐先抓取 SCK/MOSI/MISO/CS 波形,再做速率扫描和最差条件验证;不能把降频当作所有 SPI 偶发错误的唯一修复。

45. I2C 总线被某个从设备拉死,怎样恢复?

答案: 先确认 SDA 还是 SCL 被拉低,以及设备是否处于未完成字节/等待时钟状态。若芯片手册允许,可由主机释放 SDA 并提供最多约 9 个 SCL 脉冲尝试让从设备完成当前字节,再生成 STOP;之后重新初始化 I2C 控制器。若 SCL 被持续拉低或设备内部故障,可能需要复位该设备或进行电源循环。

恢复动作必须设置超时,不能无限等待,也不能在多主总线或不支持该恢复方法的器件上盲目发脉冲。

46. RS-485 最后一个字节为什么容易丢?DE 什么时候切回接收?

答案: UART 的数据寄存器空不代表移位寄存器已经发送完最后一个停止位。若 DE 过早拉低,收发器会提前关闭驱动,截断最后一个字节。应等待 UART 的 Transmission Complete(TC)标志或等价的“移位寄存器发送完成”事件,再按收发器关闭延迟留出必要余量后切换方向。

不能只等待 DMA 完成或 TX FIFO 空;它们不一定代表物理线上最后一个 bit 已发送完毕。

47. SPI 菊花链和多个独立 CS 并联接法有什么区别?

答案:

  • 独立 CS 并联:各从机共享 SCK/MOSI/MISO,但每个从机有独立片选,支持独立寻址,布线和 GPIO 数量增加。
  • 菊花链:前级 SDO 接后级 SDI,数据像移位寄存器逐级传递,通常用一个 CS 控制整条链。一次更新需要传输与节点数量相关的位数,延迟随链长增加。

菊花链必须由芯片设计支持,普通 SPI 芯片不能随意串接。它适合顺序更新、带宽要求不高且可容忍链式延迟的场景。

flowchart LR
  A[MCU MOSI] --> B[Device 1 SDI]
  B -->|SDO| C[Device 2 SDI]
  C -->|SDO| D[Device 3 SDI]
  D --> E[MCU MISO]
  F[Shared SCK / CS] --> B
  F --> C
  F --> D

48. 在汽车 ECU 内部,SPI、UART、I2C 和 SENT 通常分别用在哪里?

答案:

  • SPI:外部 Flash、外部 CAN 控制器、IMU 和高性能传感器。
  • UART:调试口、蓝牙/蜂窝/GNSS 模块、产线测试。
  • I2C:温度传感器、EEPROM、PMIC 和低速板级器件。
  • SENT:单向传感器数据输出,如节气门、压力或位置传感器。

具体接口由器件选型、实时性、抗干扰、引脚和安全要求决定;同一功能也可能存在不同接口方案。

49. 外部 SPI CAN 控制器与 MCU 内置 CAN 控制器有什么取舍?

答案: 外部控制器可扩展 CAN 通道数或为缺少 CAN 外设的 MCU 提供总线能力,但报文要经过 SPI 读写,增加延迟、CPU 负载和软件复杂度。内置 CAN 控制器通常能降低接口延迟并简化集成,但受 MCU 通道数量和过滤资源限制。

高负载 CAN FD 场景要评估 SPI 吞吐、缓存深度、中断延迟和最坏报文负载,不能只看 SPI 标称时钟频率。

50. AUTOSAR 中 SPI、I2C 和外部器件驱动通常怎样集成?

答案: 标准 MCAL 提供的驱动能力取决于 MCU 和 AUTOSAR 版本。标准化 SPI Driver 常用于片上 SPI 控制器;I2C 驱动在不同 AUTOSAR 平台中的标准化程度和供应商支持可能不同。特殊外设可通过 CDD 或供应商扩展集成。

不要把“所有外部 Flash 都由 Fee 管理”当作通用规则:Fee 常用于基于内部 Flash 的 EEPROM 仿真;外部 SPI Flash 可能需要专用驱动、存储抽象或项目自定义集成。

Flomo 原始来源