结论:菲亚特 Fiorino(Fiat Mini 平台)的 B-CAN 是 CAN 2.0B、29 位扩展标识符、ISO 11898-3 低速容错物理层、50 kbps、大端(Motorola,MSB 在前)。文档记录了一个紧凑的帧矩阵:车速、转速、冷却液温度、喷油量、续航、油量等都能从几条固定 ID 上被动读到。这套解码背后有一个现实动机——Fiat Mini 平台的仪表存在一个出厂软件缺陷,总里程一到 399999 公里就永久冻结;作者因此让 ESP32 自行计算并存储里程,且系统随车通过了西班牙官方的 ITV 检验。边界:帧矩阵按平台记录,具体到某一辆车仍需核对,任何改动都应先在台架确认。
本文整理自该项目的 CAN 矩阵文档与工程说明。文档把帧矩阵定义为「逆向得到的 Fiat Mini 平台 B-CAN 网络」,本文保留这一来源限定。
车辆与适用范围
项目以一辆 Fiat Fiorino 为对象,用一块 ESP32 加自定义载板替换原厂中央单色液晶,读 B-CAN 实时遥测并渲染自定义界面。文档提到同类平台的车型(Fiorino、Grande Punto、Alfa Romeo MiTo)共享这套仪表缺陷,因此帧矩阵按 Fiat Mini 平台陈述。
| 项 | 内容 |
|---|---|
| 车型 | 菲亚特 Fiorino(Fiat Mini 平台;同平台另有 Grande Punto、Alfa Romeo MiTo) |
| 年款 / 市场版本 | 源文档未给出具体年款;项目语境为西班牙市场(需通过 ITV 检验) |
| ECU / 改装状态 | 用 ESP32 + 自定义载板替换原厂中央单色液晶;原厂仪表仍作为被替换对象存在 |
| 采集跨度 | 源文档未给出;随车通过了西班牙官方 ITV 检验 |
| 适用范围 | 按 Fiat Mini 平台记录的帧矩阵;逐车细节仍需核对 |
总线与寻址
文档把 B-CAN 定义为 CAN 2.0B、29 位扩展标识符,物理层是低速容错 CAN(ISO 11898-3),50 kbps,字节序为大端(Motorola,MSB 先)。接入侧使用 TJA1055T(低速容错 B-CAN 收发器),配合电平转换芯片适配 3.3 V / 5 V。
| 项 | 内容 |
|---|---|
| 物理层 | 低速容错 CAN(ISO 11898-3),50 kbps |
| 链路层 | CAN 2.0B,29 位扩展标识符 |
| 字节序 | 大端(Motorola,MSB 在前) |
| 收发器 | TJA1055T 低速容错 B-CAN 收发器 + 电平转换 |
| CAN FD | 源文档未提及 |
已解码信号
下表逐条取自文档帧矩阵。解码式中 B_n 表示第 n 个字节,位移写法保留原文。
| 信号 | 位置(ID / 字节) | 解码 | 证据 |
|---|---|---|---|
| 发动机转速 | 0x04214001 字节 6 |
Byte[6] × 32(32 转/分/位) |
文档帧矩阵 |
| 喷油量 | 0x04214001 字节 4、5 |
((B4 左移 8) 或 B5) ÷ 100.0,单位 mm³/行程 |
文档帧矩阵 |
| 发动机温度 | 0x04214001 字节 3 |
B3 − 40,摄氏度 |
文档帧矩阵 |
| 燃油消耗(推导) | 0x04214001 字节 3 至 6 |
(raw_iq × RPM × 1.2) ÷ 1e6,升/小时(按 4 缸 4 冲程推导) |
文档帧矩阵(派生量) |
| 总里程 | 0x0C014003 字节 1 至 3 |
(B1 左移 16) 或 (B2 左移 8) 或 B3,公里 |
文档帧矩阵;不采用,见下(399999 公里后冻结) |
| 续航 | 0x0C014003 字节 4、5 |
((B4 与 0x03) 左移 8) 或 B5(字节 4 需掩码) |
文档帧矩阵 |
| 车速 | 0x04394000 字节 0、1 |
((B0 左移 8) 或 B1) × 0.0625,km/h |
文档帧矩阵 |
| 燃油液位 | 0x06214000 字节 5 |
Byte[5],直接取百分比 |
文档帧矩阵 |
读取方法与注意事项
先查 DLC,再取载荷。文档把「提取载荷前必须检查 DLC」列为安全要求,用于防止缓冲区越界读。这一条对 0x04214001 这类大端多字节字段尤其重要。
0x0C014003 是复用帧。文档说明这一帧同时承载「总里程」和「续航」两组信息(多路复用),解析时要按同一帧内的不同字节段分别取用,不能只当一种含义。
里程为何要自己算。这是本项目的核心动机:Fiat Mini 平台的仪表存在出厂缺陷,总里程到达 399999 公里后永久冻结、不再记录。文档因此让单片机从 B-CAN 实时遥测独立计算并安全存储总里程,并把它写入外部的 AT24C32 EEPROM(经 I2C,配合 DS3231 实时时钟),以避免磨损 ESP32 内部闪存。文档记录:该车带着这套系统通过了西班牙官方的 ITV 检验,作为可靠性的一次实证。
两条核对手段。固件提供「被动 CAN ASCII 流式输出」(用一个编译开关打开),按标准 LAWICEL/SLCAN 格式(如 t1238…)把原始 B-CAN 帧输出到串口,便于用任意串口终端或自写脚本记录;界面上还有硬件状态浮层,用于提示 EEPROM 状态、熄火保存与内存损坏错误。
证据等级与边界
文档给出的帧矩阵被明确定义为「逆向得到的 Fiat Mini 平台 B-CAN 网络」,属于社区工程结果,而不是厂家规格。其中「燃油消耗」被文档自述为派生量(由喷油量与转速按 4 缸 4 冲程推导),而非总线上直接广播的字段;「总里程」虽可从帧中解出,但文档明确不采用该值,原因是它在 399999 公里后冻结。
验证层面有两处相对硬的证据:其一,该车带着这套嵌入式方案通过了西班牙官方的 ITV 检验,文档把它作为「可靠且准确」的实证;其二,项目提供了原始 B-CAN 帧的被动流式输出,便于独立复核。但文档未给出逐信号置信度,也未绑定具体年款与配置。
因此边界是:帧矩阵按 Fiat Mini 平台陈述,同平台车型(Fiorino、Grande Punto、MiTo)可能共享,但具体到某一辆车、某一年的配置仍需逐车核对;更换仪表属对车辆电气系统的改动,任何操作都应在台架或合规前提下进行。
常见问题
Fiorino 的 B-CAN 是什么协议和速率?
文档定义为 CAN 2.0B、29 位扩展标识符、ISO 11898-3 低速容错物理层,速率 50 kbps,字节序为大端(Motorola,MSB 在前)。收发器用的是低速容错型号 TJA1055T。
为什么不用总线上读到的总里程?
因为 Fiat Mini 平台的仪表存在出厂缺陷:总里程到达 399999 公里后永久冻结、不再记录。项目因此让 ESP32 从实时遥测独立计算总里程,并写入外部 EEPROM 保存,而不是直接采信被冻结的广播值。
车速和转速的解码式分别是什么?
车速在 0x04394000 字节 0、1:((B0 左移 8) 或 B1) × 0.0625 km/h。转速在 0x04214001 字节 6:Byte[6] × 32,分辨率 32 转/分。
解析时有哪些必须注意的工程细节?
三点:提取载荷前先检查 DLC,防止越界读;0x0C014003 是复用帧,同时承载总里程与续航,要分段取用;全程按大端解析多字节字段。
延伸阅读
- 车载小仪表开发板选型:微雪 / M5Stack / Seeed 三家横向对照 —— 与本项目「用 ESP32 替换原厂仪表」同属一块屏幕的选型问题。
- 车电接入:为什么 ESP32 的 TWAI 不等于 OBD 接口 —— 说明 ESP32 接 B-CAN 需要注意的物理层与收发器差异。
- 车辆协议与 DBC 指纹:怎么判断一台车是不是同一套定义 —— 解释为何同平台帧矩阵也要逐车核对。
- 圆屏还是方屏:车载仪表的显示形态该怎么选 —— 与本文的界面层取舍互补。
参考资料
- 项目 01 ——
public-can-dbc-datasets/additional/raul-fiat-fiorino-can/docs/Can_Matrix.md(本项目车型档案主来源,取用了总线规格与帧矩阵)。 - 项目 01 ——
public-can-dbc-datasets/additional/raul-fiat-fiorino-can/README.md(取用了 399999 公里冻结背景、硬件选型与 ITV 检验结论)。
说明:本文整理自第三方开源项目的公开文档,仅代表该文档所记录的单个车辆样本,不代表同型号全系车型。CAN 与诊断操作存在风险,任何实车操作前请自行复核并遵守当地法规。
更新记录
首次发布 2026-10-11 最近核对:2026-10-11
发表回复