CAN 通讯笔记

电平特性

  • 显性电平
    \(CAN_H = CAN_L = 2.5\text{V}\),电压差 \(V_{\text{diff}} = 0\text{V}\)
  • 隐性电平\(CAN_H = 3.5\text{V}\)\(CAN_L = 1.5\text{V}\),电压差 \(V_{\text{diff}} = 2\text{V}\)

CAN 帧类型

类型 说明
数据帧 发送单元向接收单元发送数据的帧
遥控帧 接收单元向具有相同 \(ID\) 的发送单元请求数据的帧
错误帧 硬件自动完成的报错帧
过载帧 硬件自动完成,用于通知其他节点暂缓发送报文
帧间隔 硬件自动完成,用于将数据帧与前面的帧分离

帧格式分类

  • 标准格式\(11\) 位标识符
  • 扩展格式\(29\) 位标识符

帧结构

  1. 帧起始(Start of Frame)
    一个比特的显性电平,表示帧的开始。

  2. 仲裁段(Arbitration Field)
    表示帧的优先级,标准帧由标识符 \(ID\)

    然后是 \(IDE\),表示这个是标准帧还是扩展帧,扩展帧的话会在读取 \(18\) bit

    最后是 \(RTR\) 表示数据帧还是远程帧

  3. 控制段(Control Field)
    表示数据的字节数,由 \(6\) 个比特组成(最多可表示 \(64\) 字节)。

  4. 数据段(Data Field)
    数据的具体内容,可发送 \(0\)\(8\) 个字节。


仲裁段详解

  • 仲裁段包含一个 \(ID\),每个 \(CAN\) 设备可以发送多条不同 \(ID\) 的报文。
  • 每个总线节点的 \(CAN\) 控制器都有一个过滤器(通过设置寄存器配置),控制器会根据设置自动判断是否接收报文,该过程完全由硬件实现。

控制段详解

  • \(6\) 个比特:
    • 前两个比特为保留位(\(r0\), \(r1\)),全部以显性电平发送。
    • 数据长度码占 \(4\) 个比特。

image

数据段详解

  • 包含 \(0\)\(8\) 个字节的数据。
  • \(CAN\) 控制器有对应的寄存器,只需将数据直接填入即可。

数据仲裁机制

  • 当总线空闲时,最先开始发送的节点获得发送权限,且一旦开始发送,不会被其他节点抢占。
  • 若多个节点同时开始发送,各节点会从仲裁段的第一位开始仲裁,连续输出显性电平最多的节点可继续发送(显性电平具有优先级)。

\(Cubemx\) 中的 \(CAN\) 配置

  1. \(CAN\) 的最高通讯频率为 \(1\) MHz,我使用的 \(STM32F407VET6\)(主频为 \(168\) MHz)

    波特率 = \(APB\) 总线频率 / 分频数 / (\(TBS1\) + \(TBS2\) + \(SJY\))

  2. 打开 \(CAN\) 的接收中断,\(RX0\)

    \(2\) 个邮箱,每个邮箱有 \(3\) 层,每层可以放一条报文

    和过滤器匹配的报文可以放入 \(FIFO\) 邮箱中,\(CPU\) 需要取的时候才从邮箱里面取出

    发送邮箱优先级越高越先被发送,每个邮箱只能装 \(1\) 个报文

  3. 配置 \(CAN\) 过滤器

    • 列表模式:列出 \(ID\) 名字,过滤器通过判断报文 \(ID\) 是否一致来判断是接受还是舍弃,受到列表容量大小限制

    • 掩码模式:通过屏蔽码和验证码来实现筛选特定位上的特定数值的 \(ID\) 报文来筛选

    • \(CAN\_FS1R\) 寄存器:标准格式的 \(ID\) 只需要 \(16\) 位寄存器,但是扩展格式需要 \(32\) 位寄存器。\(CAN\_FS1R\) 表示是否需要处理 \(32\) 位的 \(ID\)

    • \(CAN\_FxR1\)\(CAN\_FxR2\) 寄存器:在不同的工作模式下这两个寄存器的定义是不同的

image

posted @ 2026-01-02 10:55  BorisDimitri  阅读(5)  评论(0)    收藏  举报