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  阅读(105)  评论(0)    收藏  举报