当前位置: 首页 > news >正文

串行接口:CAN总线

CAN(Controller Area Network,控制器局域网络)总线是一种功能强大且广泛应用的串行通信协议,最初由德国博世(Bosch)公司于1980年代开发,用于汽车电子系统。它以其高可靠性、实时性和灵活性成为工业自动化、汽车、医疗设备、航空航天等领域的主流通信协议。以下是对CAN总线的详细介绍,涵盖其原理、架构、协议、硬件实现、优缺点及应用场景。


1. CAN总线概述

CAN总线是一种多主广播式串行通信协议,允许网络中的多个节点共享同一通信介质,无需中央控制器。其主要特点包括:

  • 多主通信:任何节点均可主动发起通信,无主从限制。
  • 差分信号:使用CAN_H和CAN_L两条差分信号线,抗干扰能力强。
  • 实时性:支持优先级仲裁,确保高优先级消息优先传输。
  • 容错性:内置错误检测和处理机制,提高通信可靠性。
  • 低成本:简单硬件实现,适合大规模部署。

2. CAN总线的工作原理

CAN总线基于差分信号传输非破坏性仲裁,以下是其核心工作原理:

2.1 物理层
  • 信号传输
    • CAN总线使用两根差分信号线:CAN_H(高电平)和CAN_L(低电平)。
    • 逻辑状态:
      • 显性(Dominant):表示逻辑“0”,CAN_H和CAN_L电平差较大(典型差值为2V)。
      • 隐性(Recessive):表示逻辑“1”,CAN_H和CAN_L电平差接近0V。
    • 差分信号增强了抗电磁干扰能力,适合长距离传输。
  • 终端电阻
    • 总线两端各接一个120Ω电阻,用于阻抗匹配,防止信号反射。
    • 对于短距离总线(<1m),可省略一端电阻,但长总线必须两端均接。
2.2 数据链路层
  • 帧结构
    CAN协议定义了多种帧类型,主要包括:
    • 数据帧:传输数据,包含标识符(ID)、数据字段等。
    • 远程帧:请求其他节点发送数据。
    • 错误帧:报告 Ascending
      • 错误主动帧:由错误节点主动发送,通知总线错误。
      • 错误被动帧:由错误计数器达到一定阈值的节点发送,进入被动状态。
      • 过载帧:通知总线过载,请求降低通信速率。
  • 数据帧格式(以标准CAN 2.0A为例):
    • 起始位(SOF):1位,标志帧开始。
    • 标识符(ID):11位(标准帧)或29位(扩展帧),决定消息优先级(ID越小,优先级越高)。
    • 控制字段:6位,包含数据长度代码(DLC,0-8字节)。
    • 数据字段:0-8字节,实际传输的数据。
    • CRC字段:15位循环冗余校验,确保数据完整性。
    • 应答字段(ACK):接收节点确认正确接收。
    • 结束位(EOF):7位,标志帧结束。
  • 仲裁机制
    • 当多个节点同时发送数据时,CAN通过非破坏性位仲裁决定优先级:
      • 显性位(0)优先于隐性位(1)。
      • 节点逐位比较ID,发送隐性位但检测到显性位的节点停止发送,优先级低的节点自动退让。
    • 这种机制确保无冲突、无数据丢失。
2.3 错误检测与容错

CAN总线具有强大的错误检测和处理机制:

  • 错误类型
    • 位错误:发送节点检测到总线电平与发送电平不一致。
    • 填充错误:连续5个相同位后未检测到填充位。
    • CRC错误:接收到的CRC校验不匹配。
    • 格式错误:帧结构不符合协议。
    • 应答错误:无节点应答ACK。
  • 错误处理
    • 每个节点维护错误计数器(发送错误计数器TEC和接收错误计数器REC)。
    • 错误计数高时,节点进入错误被动(仅发送错误被动帧)或总线关闭状态,防止故障节点干扰总线。
    • 错误帧会中断当前传输,触发重传。

3. CAN协议版本

CAN协议有多个版本,适用于不同场景:

  • CAN 2.0A(标准帧):
    • 11位标识符,最大2048个不同ID。
    • 广泛应用于工业和汽车系统。
  • CAN 2.0B(扩展帧):
    • 29位标识符,支持更多节点(约536M个ID)。
    • 兼容CAN 2.0A,适合复杂网络。
  • CAN FD(灵活数据率)
    • 扩展数据字段至64字节,波特率可变(仲裁阶段低速,数据阶段高速)。
    • 提高吞吐量,适用于现代汽车和工业应用。
    • STM32F103不支持CAN FD,仅支持CAN 2.0A/B。

4. 硬件实现

实现CAN总线通信需要以下硬件:

  • CAN控制器
    • 集成在微控制器中(如STM32F103的bxCAN模块)。
    • 负责帧编码、解码、仲裁和错误管理。
  • CAN收发器
    • 将逻辑电平转换为差分信号。
    • 常见芯片:TJA1050(5V)、SN65HVD230(3.3V)。
  • 总线介质
    • 双绞线(屏蔽或非屏蔽),支持最远40m(1Mbps)或1km(50kbps)。
  • 终端电阻
    • 120Ω电阻置于总线两端。

典型连接(以STM32F103为例)

  • STM32的CAN_TX(PB9)连接收发器TXD,CAN_RX(PB8)连接RXD。
  • 收发器的CAN_H和CAN_L连接总线。
  • 确保节点共地,供电匹配。

5. CAN总线的优缺点

优点:
  • 高可靠性:多重错误检测和容错机制,适合恶劣环境。
  • 实时性:优先级仲裁确保关键数据优先传输。
  • 抗干扰:差分信号和屏蔽双绞线降低电磁干扰。
  • 多主架构:无需中央控制器,节点平等通信。
  • 低成本:硬件简单,易于大规模部署。
缺点:
  • 带宽有限:CAN 2.0最大波特率1Mbps,数据长度8字节,适合小型数据传输。
  • 复杂性:协议实现和调试需要一定专业知识。
  • 扩展性:CAN 2.0A的11位ID限制节点数量(CAN FD解决此问题)。
  • 无内置加密:需额外协议确保数据安全性。

6. CAN总线的典型应用

  • 汽车电子
    • 引擎控制单元(ECU)、ABS、仪表盘通信。
    • 现代车辆使用CAN FD提高带宽。
  • 工业自动化
    • 工厂设备间的实时控制(如PLC、传感器)。
    • 常见于DeviceNet、CANopen协议。
  • 医疗设备
    • 医疗仪器的数据采集和控制。
  • 航空航天
    • 飞行控制系统、传感器网络。
  • 智能家居
    • 家电间的低速通信。

7. CAN总线与STM32F103的实现

STM32F103内置bxCAN控制器,支持CAN 2.0A/B,最高1Mbps。实现步骤(参考前文):

  1. 硬件连接
    • 使用TJA1050收发器,连接PB8(CAN_RX)、PB9(CAN_TX)。
    • 总线两端接120Ω电阻。
  2. 软件配置
    • 使用STM32CubeMX配置CAN参数(波特率、过滤器)。
    • HAL库提供API(如HAL_CAN_AddTxMessageHAL_CAN_GetRxMessage)。
  3. 测试
    • 搭建两节点网络,验证发送/接收功能。
    • 使用CAN分析仪(如PCAN)监控总线。

关键配置

  • 波特率:通过分频器设置(如36MHz APB1时钟,分频4,Tseg1=15,Tseg2=2,得500kbps)。
  • 过滤器:设置ID匹配规则,减少无关消息处理。
  • 中断:启用RX中断,优化接收效率。

8. 常见问题与解决

  • 通信失败
    • 检查波特率一致性。
    • 确认CAN_H/CAN_L连接正确,终端电阻是否接好。
    • 验证节点共地。
  • 数据丢失
    • 检查过滤器配置是否过滤了目标ID。
    • 确保总线负载率不过高(<50%为宜)。
  • 错误计数高
    • 检查物理层问题(如接线错误、电阻缺失)。
    • 使用示波器检查CAN_H/CAN_L波形。
  • 干扰问题
    • 使用屏蔽双绞线,增加滤波电容。
    • 缩短总线长度或降低波特率。

9. 学习资源

  • 标准
    • ISO 11898-1/2:CAN协议规范。
    • Bosch CAN规范。
  • 教程
    • ST官网的STM32 CAN应用笔记(如AN3154)。
    • 正点原子/野火的STM32 CAN教程。
  • 工具
    • PCAN-View、CANalyzer:监控CAN数据。
    • 逻辑分析仪/示波器:检查信号完整性。

10. 总结

CAN总线是一种高效、可靠的通信协议,适用于实时性要求高的嵌入式系统。其差分信号、多主仲裁和错误检测机制使其在汽车和工业领域广泛应用。在STM32F103上实现CAN通信需要配置bxCAN控制器、连接收发器并编写HAL库代码。通过合理配置波特率和过滤器,可实现稳定通信。理解CAN协议的帧结构和仲裁机制有助于优化开发和调试。

http://www.lryc.cn/news/582316.html

相关文章:

  • 2025年全国青少年信息素养大赛图形化(Scratch)编程小学低年级组初赛样题答案+解析
  • 华为OD机试 2025B卷 - 最长的指定瑕疵度的元音子串 (C++PythonJAVAJSC语言)
  • 互补功率放大器Multisim电路仿真——硬件工程师笔记
  • web渗透之指纹识别1
  • 施密特触发器Multisim电路仿真——硬件工程师笔记
  • 2048-控制台版本
  • 设计模式文章
  • 汽车信息安全 -- SHE密钥更新小细节
  • vscode配置gitlab仓库详细步骤
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二课——RGB转YCbCr的FPGA硬件编程详解
  • Rust单例模式:OnceLock的使用指南
  • Rust 内存结构:深入解析
  • iOS 出海 App 安全加固指南:无源码环境下的 IPA 加固与防破解方法
  • 期待在 VR 森林体验模拟中实现与森林的 “虚拟复现”​
  • 企业物资集采平台解决方案之:AI+物联网,智能预测需求,让企业库存“零呆滞”的科技实践
  • OSPFv3基础
  • 基于 STM32+FPGA 的快速傅里叶频域图像在 TFT 中显示的设计与实现(项目资料)(ID:8)
  • 关于 c、c#、c++ 三者区别
  • vue时间轴,antd时间轴,带卡片时间轴
  • 全球 AI HR 浪潮下的中国实践:从效率革命到战略重构
  • Android kotlin中 Channel 和 Flow 的区别和选择
  • 【Qt】QSignalMapper
  • 谢飞机的Java高级开发面试:从Spring Boot到分布式架构的蜕变之旅
  • 【音视频】HLS简介与服务器搭建
  • 常用的webpack配置
  • 应用俄文OCR技术,为跨语言交流与数字化管理提供更强大的支持
  • 解数独(C++版本)
  • 关于Xinference 中部署服务不能成功的若干问题整理(持续迭代)
  • 安卓10.0系统修改定制化_____安卓9与安卓10系统文件差异 有关定制选项修改差异
  • NLP:文本特征处理和回译数据增强法