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\) 位标识符
帧结构
-
帧起始(Start of Frame)
一个比特的显性电平,表示帧的开始。 -
仲裁段(Arbitration Field)
表示帧的优先级,标准帧由标识符 \(ID\) 和然后是 \(IDE\),表示这个是标准帧还是扩展帧,扩展帧的话会在读取 \(18\) bit
最后是 \(RTR\) 表示数据帧还是远程帧
-
控制段(Control Field)
表示数据的字节数,由 \(6\) 个比特组成(最多可表示 \(64\) 字节)。 -
数据段(Data Field)
数据的具体内容,可发送 \(0\)~\(8\) 个字节。
仲裁段详解
- 仲裁段包含一个 \(ID\),每个 \(CAN\) 设备可以发送多条不同 \(ID\) 的报文。
- 每个总线节点的 \(CAN\) 控制器都有一个过滤器(通过设置寄存器配置),控制器会根据设置自动判断是否接收报文,该过程完全由硬件实现。
控制段详解
- 共 \(6\) 个比特:
- 前两个比特为保留位(\(r0\), \(r1\)),全部以显性电平发送。
- 数据长度码占 \(4\) 个比特。

数据段详解
- 包含 \(0\)~\(8\) 个字节的数据。
- \(CAN\) 控制器有对应的寄存器,只需将数据直接填入即可。
数据仲裁机制
- 当总线空闲时,最先开始发送的节点获得发送权限,且一旦开始发送,不会被其他节点抢占。
- 若多个节点同时开始发送,各节点会从仲裁段的第一位开始仲裁,连续输出显性电平最多的节点可继续发送(显性电平具有优先级)。
\(Cubemx\) 中的 \(CAN\) 配置
-
\(CAN\) 的最高通讯频率为 \(1\) MHz,我使用的 \(STM32F407VET6\)(主频为 \(168\) MHz)
波特率 = \(APB\) 总线频率 / 分频数 / (\(TBS1\) + \(TBS2\) + \(SJY\))
-
打开 \(CAN\) 的接收中断,\(RX0\)
有 \(2\) 个邮箱,每个邮箱有 \(3\) 层,每层可以放一条报文
和过滤器匹配的报文可以放入 \(FIFO\) 邮箱中,\(CPU\) 需要取的时候才从邮箱里面取出
发送邮箱优先级越高越先被发送,每个邮箱只能装 \(1\) 个报文
-
配置 \(CAN\) 过滤器
-
列表模式:列出 \(ID\) 名字,过滤器通过判断报文 \(ID\) 是否一致来判断是接受还是舍弃,受到列表容量大小限制
-
掩码模式:通过屏蔽码和验证码来实现筛选特定位上的特定数值的 \(ID\) 报文来筛选
-
\(CAN\_FS1R\) 寄存器:标准格式的 \(ID\) 只需要 \(16\) 位寄存器,但是扩展格式需要 \(32\) 位寄存器。\(CAN\_FS1R\) 表示是否需要处理 \(32\) 位的 \(ID\)
-
\(CAN\_FxR1\) 和 \(CAN\_FxR2\) 寄存器:在不同的工作模式下这两个寄存器的定义是不同的
-


浙公网安备 33010602011771号