常见的CAN总线协议面试题

目录

1、CAN帧的结构是什么?

2、为什么CAN总线两端需要120欧姆电阻?

3、为什么CAN是消息导向协议?

4、CAN总线的仲裁机制是什么?

5、什么是位填充?其作用是什么?

6、标准CAN与扩展CAN的区别是什么?

7、CAN总线的错误处理机制如何运作?

[8、CAN FD相比传统CAN有哪些改进?](#8、CAN FD相比传统CAN有哪些改进?)

[9、CAN FD的FDF、BRS、ESI位分别有什么作用?](#9、CAN FD的FDF、BRS、ESI位分别有什么作用?)

10、如何计算CAN总线的波特率?

11、CAN总线通信异常时如何排查?


本篇文章讲一讲嵌入式领域中常见的CAN总线面试问题,涵盖协议原理、物理层、数据链路层及实际应用方面。

1、CAN帧的结构是什么?

CAN帧是CAN总线上传输的数据单元,主要分为标准帧(CAN 2.0A)和扩展帧(CAN 2.0B)。标准帧的结构包括:

  • 帧起始(SOF):1位显性位(0),标志帧开始。
  • 仲裁字段:11位标识符(ID),决定消息优先级;1位远程传输请求(RTR)位。
  • 控制字段:6位,包括4位数据长度代码(DLC),指示数据字段字节数。
  • 数据字段:0-8字节数据。
  • CRC字段:15位循环冗余校验,用于错误检测。
  • ACK字段:2位,接收者确认帧接收(显性位表示成功)。
  • 帧结束(EOF):7位隐性位(1),标志帧结束。
  • 帧间隙(IFS):3位隐性位,确保帧间间隔。

2、为什么CAN总线两端需要120欧姆电阻?

CAN总线两端各安装一个120欧姆终止电阻,用于匹配总线的特性阻抗,防止信号反射。高速通信中,信号到达总线末端时,若无终止电阻,会因阻抗不匹配产生反射,干扰通信。120欧姆电阻吸收这些反射,确保信号完整性,减少通信错误。

3、为什么CAN是消息导向协议?

CAN是消息导向协议,意味着通信基于消息内容而非节点地址。每条消息携带一个唯一标识符(ID),表示消息类型和优先级。所有节点接收消息后,根据ID决定是否处理。这种机制与基于地址的协议(如I2C)不同,具有以下优势:

  • 灵活性:无需预定义发送者和接收者,易于扩展。
  • 高效性:广播机制减少通信开销。

举个例子,在汽车中,气囊传感器通过CAN总线发送高优先级消息(低ID值),所有相关ECU(如安全系统)可接收并处理。

4、CAN总线的仲裁机制是什么?

CAN总线采用非破坏性位仲裁机制,通过CSMA/CD+AMP(载波监听多路访问/冲突检测与消息优先级仲裁)解决多节点同时发送时的冲突。仲裁基于消息ID,ID值越低,优先级越高。

仲裁过程:

  • 各节点在发送消息时,逐位比较ID。
  • 若节点发送隐性位(1)但检测到显性位(0),则停止发送,进入监听模式。
  • ID最低(显性位最多)的消息赢得仲裁,继续传输。

5、什么是位填充?其作用是什么?

位填充是CAN总线用于同步的机制。在CAN协议中,采用NRZ-5(非归零5位)编码,若连续发送5个相同位(全0或全1),发送端自动插入一个相反位(称为填充位)。接收端识别并移除填充位。

作用:

  • 同步:确保接收端时钟与发送端同步,防止长序列相同位导致的时钟漂移。
  • 错误检测:若接收到6个连续相同位,表明违反位填充规则,触发错误帧。

例如,发送数据"00000"后,插入一个"1",变为"000001"。接收端移除填充位,恢复原始数据。

6、标准CAN与扩展CAN的区别是什么?

标准CAN(CAN 2.0A)和扩展CAN(CAN 2.0B)的主要区别在于标识符长度:

  • 标准CAN:11位标识符,支持2^11(2048)个消息ID,IDE位为0。
  • 扩展CAN:29位标识符(11位基本ID+18位扩展ID),支持2^29(约5.37亿)个消息ID,IDE位为1。

7、CAN总线的错误处理机制如何运作?

CAN控制器维护两个错误计数器:

  • 发送错误计数器(TEC):记录发送错误次数
  • 接收错误计数器(REC):记录接收错误次数

节点状态转换规则:

  • 错误主动状态:TEC < 128 且 REC < 128,正常参与通信
  • 错误被动状态:TEC ≥ 128 或 REC ≥ 128,限制发送错误帧
  • 总线关闭状态:TEC ≥ 256,完全脱离总线通信

8、CAN FD相比传统CAN有哪些改进?

CAN FD 是CAN协议的升级版本,主要区别如下:

9、CAN FD的FDF、BRS、ESI位分别有什么作用?

CAN FD新增的控制位功能:

  • FDF位:区分CAN报文和CAN FD报文
  • BRS位:位速率转换开关,控制数据段是否使用高速传输
  • ESI位:错误状态指示,表明发送节点的错误状态

10、如何计算CAN总线的波特率?

CAN波特率计算公式:

复制代码
波特率 = CAN时钟频率 / (预分频器 × (BS1 + BS2 + 1))

实际计算示例:

  • CAN时钟:36MHz(STM32 APB1)
  • 预分频器:6
  • BS1:8TQ
  • BS2:3TQ
  • 波特率 = 36000000 / (6 × (8 + 3 + 1)) = 500000 bps = 500Kbps

11、CAN总线通信异常时如何排查?

典型故障现象及解决方案:

CAN总线作为嵌入式系统的核心通信协议,其理论深度和实践广度都值得我们深入掌握。通过系统学习CAN协议原理、编程实现和应用案例,不仅能在面试中表现出色,更能在实际项目中游刃有余。希望本文的深度解析能为大家的技术成长提供有价值的参考。

相关推荐
一直C11 小时前
【ARM嵌入式开发】LCD液晶屏显示原理、色彩模式与显存地址映射详解
lcd·嵌入式·arm·寄存器·cortex-a7
Hespethorn12 小时前
洪泛、路由、网络栈:LoRa 自组网三条路线的设计取舍与量化对比
物联网·嵌入式
用户05101225729615 小时前
RGA(二)——RK3588 的核拓扑与能力差异
linux·嵌入式
用户05101225729615 小时前
RGA(一)——基础知识
linux·嵌入式
用户05101225729615 小时前
RGA(三)——实宽高、虚宽高与对齐约束
linux·嵌入式
燕卫博15 小时前
SSD201 BSP 开发教程
嵌入式·bsp·ssd201
一直C16 小时前
【嵌入式 ARM 驱动开发】PWM 脉宽调制原理与 GT9147 电容触控屏驱动开发详解
嵌入式硬件·lcd·嵌入式·arm汇编·imx6ull·cortex-a7
haliu17 小时前
【FHE 同态加密】我们如何实现同态加密推理(十四):为什么 `RESULT=PASS` 不是判据(纯 C11 · 零依赖)
人工智能·嵌入式·c·fhe·推理引擎·c11·边缘推理·同态加密推理
jianqiang.xue1 天前
【CStackGUI 实战】深色主题终端:app.dark 默认深色 + 顶层命名样式表 + 运行时切换
单片机·嵌入式·cstackgui·c语言gui·可视化拖拽
追涨杀跌老能手1 天前
GD32H759 + RT-Thread 工控实战--第7篇 OSPI Flash
开源·嵌入式