CAN学习总结

2 篇文章 0 订阅

CAN学习总结

CAN的优缺点在此处就不赘述了,各大搜索引擎、课程都能找到CAN的介绍。该笔记作学习记录辅助作用,不免会出现错误,请大佬勿喷。该笔记的名词出现顺序参照《STM32F10x-中文参考手册》,学习CAN确实是最繁琐用时最长的一个功能,多看几次视频,仔细的看手册,会发现更加多有用的知识。

一、关键名词

  • bxCAN(控制器局域网):bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B。
  • 时间触发通信模式:在该模式下,CAN硬件的内部定时器被激活,并且被用于产生(发送与接收邮箱的)时间戳,分别存储在CAN_RDTxR/CAN_TDTxR寄存器中。内部定时器在每个CAN位时间累加。内部定时器在接收和发送的帧起始位的采样点位置被采样,并生成时间戳。
  • SOF时刻:
  • FIFO:FIFO( First Input First Output)简单说就是指先进先出。
  • 标识符
  • 数据长度

二、主要内容

基本功能

  • 支持CAN协议2.0A和2.0B主动模式
  • 波特率最高可达1兆位/s
  • 支持时间触发通讯功能

发送

  • 3个发送邮箱
  • 可设置发送优先级
  • 记录发送SOF时刻的时间戳

接收

  • 3级深度的2个接受FIFO
  • 可变的过滤器组:14/28个
  • 标识符列表
  • FIFO溢出方式的配置
  • 记录接收SOF时刻的时间戳

时间触发通信模式

  • 禁止自动重传模式
  • 16位自由运行定时器
  • 可在最后两个数据字节发送时间戳

管理

  • 中断可屏蔽
  • 邮箱占用单独一块地址空间,便于提高效率

双CAN

  • CAN1:是主bxCAN,它负责管理在从bxCAN和512字节的SRAM存储器之间的通信。
  • CAN2:是从bxCAN,它不能之既然访问SRAM寄存器
  • 这2个bxCAN模块共享512字节的SRAM存储器

主要需要配置的内容

  1. 配置CAN参数,如波特率
  2. 请求发送报文
  3. 处理报文接收
  4. 管理中断
  5. 获取诊断信息

三、CAN的工作模式(以下多数为摘抄内容)

CAN主要有几种工作模式:初始化、正常和睡眠模式,测试模式、环回模式、环回静默模式。

1. 初始化模式

设置CAN_MCR寄存器的INRQ位为’1’,请求
bxCAN进入初始化模式,然后等待硬件对CAN_MSR寄存器的INAK位置’1’来进行确认。
清除CAN_MCR寄存器的INRQ位为’0’,请求bxCAN退出初始化模式,当硬件对CAN_MSR寄存
器的INAK位清’0’就确认了初始化模式的退出。
当bxCAN处于初始化模式时,禁止报文的接收和发送,并且CANTX引脚输出隐性位(高电平)。
初始化模式的进入,不会改变配置寄存器。
软件对bxCAN的初始化,至少包括位时间特性(CAN_BTR)和控制(CAN_MCR)这2个寄存器。
在对bxCAN的过滤器组(模式、位宽、FIFO关联、激活和过滤器值)进行初始化前,软件要对
CAN_FMR寄存器的FINIT位设置’1’。对过滤器的初始化可以在非初始化模式下进行
当 FINIT=1 时,报文的接收被禁止。
可以先对过滤器激活位清 ’0’( 在 CAN_FA1R 中 ) ,然后修改相应过滤器的值。
如果过滤器组没有使用,那么就应该让它处于非激活状态 ( 保持其 FACT 位为清 ’0’ 状态 ) 。

2. 正常模式

在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文。软件可以通过对
CAN_MCR寄存器的INRQ位清’0’,来请求从初始化模式进入正常模式,然后要等待硬件对
CAN_MSR寄存器的INAK位置’1’的确认。在跟CAN总线取得同步,即在CANRX引脚上监测到
11个连续的隐性位(等效于总线空闲)后,bxCAN才能正常接收和发送报文。
不需要在初始化模式下进行过滤器初值的设置,但必须在它处在非激活状态下完成(相应的
FACT位为0)。而过滤器的位宽和模式的设置,则必须在初始化模式中进入正常模式前完成。

3. 睡眠模式( 低功耗)

bxCAN可工作在低功耗的睡眠模式。软件通过对CAN_MCR寄存器的SLEEP位置’1’,来请求进
入这一模式。在该模式下,bxCAN的时钟停止了,但软件仍然可以访问邮箱寄存器。
当bxCAN处于睡眠模式,软件必须对CAN_MCR寄存器的INRQ位置’1’并且同时对SLEEP位
清’0’,才能进入初始化模式。
有2种方式可以唤醒(退出睡眠模式)bxCAN:通过软件对SLEEP位清’1’,或硬件检测到CAN总线
的活动。
如果CAN_MCR寄存器的AWUM位为’1’,一旦检测到CAN总线的活动,硬件就自动对SLEEP位
清’0’来唤醒bxCAN。如果CAN_MCR寄存器的AWUM位为’0’,软件必须在唤醒中断里对SLEEP
位清’0’才能退出睡眠状态。
注:如果唤醒中断被允许 (CAN_IER 寄存器的 WKUIE 位为 ’1’) ,那么一旦检测到 CAN 总线活动就会产
生唤醒中断,而不管硬件是否会自动唤醒 bxCAN 。

bxCAN工作模式 在对SLEEP位清’0’后,睡眠模式的退出必须与CAN总线同步,当硬件对SLAK位清’0’时,就确认了睡眠模式的退出。在这里插入图片描述

从图中就可以很明确的看出CAN各种模式所对应的寄存器的初始化所需要设置数据位的值

4、测试模式

通过对CAN_BTR寄存器的SILM和/或LBKM位置’1’,来选择一种测试模式。只能在初始化模式下,修改这2位。在选择了一种测试模式后,软件需要对CAN_MCR寄存器的INRQ位清’0’,来真正进入测试模式。

5、静默模式

通过对CAN_BTR寄存器的SILM位置’1’,来选择静默模式。
在静默模式下,bxCAN可以正常地接收数据帧和远程帧,但只能发出隐性位,而不能真正发送报文。如果bxCAN需要发出显性位(确认位、过载标志、主动错误标志),那么这样的显性位在内部被接回来从而可以被CAN内核检测到,同时CAN总线不会受到影响而仍然维持在隐性位状态。因此,静默模式通常用于分析CAN总线的活动,而不会对总线造成影响-显性位(确认位、 错误帧)不会真正发送到总线上。
在这里插入图片描述

5、环回模式

通过对CAN_BTR寄存器的LBKM位置’1’,来选择环回模式。在环回模式下,bxCAN把发送的报文当作接收的报文并保存(如果可以通过接收过滤)在接收邮箱里。在这里插入图片描述
环回模式可用于自测试。为了避免外部的影响,在环回模式下CAN内核忽略确认错误(在数据/远程帧的确认位时刻,不检测是否有显性位)。在环回模式下,bxCAN在内部把Tx输出回馈到Rx输入上,而完全忽略CANRX引脚的实际状态。发送的报文可以在CANTX引脚上检测到。

6、环回静默模式

在这里插入图片描述
通过对CAN_BTR寄存器的LBKM和SILM位同时置’1’,可以选择环回静默模式。该模式可用于“热自测试”,即可以像环回模式那样测试bxCAN,但却不会影响CANTX和CANRX所连接的整个CAN系统。在环回静默模式下,CANRX引脚与CAN总线断开,同时CANTX引脚被驱动到 隐性位状态。

bxCAN的描述

1、发送处理

选择1个 空置的发送邮箱;设置标识符,数据长度和待发送数据,对寄存器操作后,邮箱不再是空邮箱;一旦邮箱不再是空置,软件对邮箱寄存器不再有书写权限。一旦邮箱成为最高优先级的邮箱,其状态就变为 预定发送状态。一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入 发送状态)。一旦邮箱中的报文被成功发送后,它马上变为 空置邮箱。

发送优先级
  • 标识符决定
    当有超过1个发送邮箱在挂号时,根据标识符由小到大加粗样式来决定优先级,如果值相等,则邮箱号小的先发送。
  • 由发送请求次序决定
    通过对CAN_MCR寄存器的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。
    该模式对分段发送很有用。
  • 中止
    当邮箱处于挂号或者预定状态,发送请求马上就被中止了;但处于发送状态时,会有两种结果:邮箱的报文发送成功,那么变为空置邮箱;如果发送失败,则会变为预定状态,然后请求被中止,变为空置邮箱。因此如果邮箱处于发送状态,那么在发送操作结束后,邮箱都会变为 空置邮箱。
  • 禁止自动重传模式
    在该模式下,发送操作只会执行一次。如果发送操作失败了,不管是由于仲裁丢失或出错,硬件都不会再自动发送该报文。
    在这里插入图片描述

2、接收管理

接收到的报文,被存储在3级邮箱深度的FIFO中。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。

  • 有效报文
    根据CAN协议,当报文被正确接收(直到EOF域的最后一位都没有错误),且通过了标识符过滤,那么该报文被认为是有效报文。
    在这里插入图片描述
  • FIFO管理
    FIFO从 空状态开始,在接收到第一个有效的报文后,FIFO状态变为挂号_1(pending_1),以此类推,最多能接收3个报文,可以通过软件设置将邮箱进行释放。当FIFO的邮箱满了不释放邮箱,下一个报文就会丢失。
  • 溢出
    当FIFO处于 挂号_3状态(即FIFO的3个邮箱都是满的),下一个有效的报文就会导致溢出,并且一个报文会丢失。

● 如果禁用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被清’0’),那么FIFO中最后收到的报文就被新报文所覆盖。这样,最新收到的报文不会被丢弃掉。
● 如果启用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被置’1’),那么新收到的报文就被丢弃,软件可以读到FIFO中最早收到的3个报文。

  • 接收相关的中断
    当FIFO存入存满溢出报文的时候,就会分别产生存入存满溢出中断。

3、标识符过滤

在CAN协议里,节点在接收报文时,根据标识符的值,决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

  • 屏蔽位模式
    在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
  • 标识符列表模式
    在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。

如果想了解更多更详细关于过滤器的知识,可以去看这篇文章
再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结

报文存储

邮箱是软件和硬件之间传递报文的接口。邮箱包含了所有跟报文有关的信息:标识符、数据、控制、状态和时间戳信息。

  • 发送邮箱
    软件需要在一个空的发送邮箱中,把待发送报文的各种信息设置好(然后再发出发送的请求)。
    在这里插入图片描述
  • 接收邮箱
    在接收到一个报文后,软件就可以访问接收FIFO的输出邮箱来读取它。一旦软件处理了报文(如把它读出来),软件就应该对CAN_RFxR寄存器的RFOM位进行置’1’,来释放该报文,以便为后面收到的报文留出存储空间。过滤器匹配序号存放在CAN_RDTxR寄存器的FMI域中。16位的时间戳存放在CAN_RDTxR寄存器的TIME[15:0]域中。在这里插入图片描述

出错管理

CAN协议描述的出错管理,完全由硬件通过发送错误计数器(CAN_ESR寄存器里的TEC域),和接收错误计数器(CAN_ESR寄存器里的REC域)来实现,其值根据错误的情况而增加或减少。

  • 离线恢复
    当TEC大于255时,bxCAN就进入离线状态,同时CAN_ESR寄存器的BOFF位被置’1’。在离线状态下,bxCAN无法接收和发送报文。
    根据CAN_MCR寄存器中ABOM位的设置,bxCAN可以自动或在软件的请求下,从离线状态恢复(变为错误主动状态)。在这两种情况下,bxCAN都必须等待一个CAN标准所描述的恢复过程
    (CAN RX引脚上检测到128次11个连续的隐性位)。
    如果ABOM位为’1’,bxCAN进入离线状态后,就自动开启恢复过程。
    如果ABOM位为’0’,软件必须先请求bxCAN进入然后再退出初始化模式,随后恢复过程才被开启。
    注: 在初始化模式下, bxCAN 不会监视 CAN RX 引脚的状态,这样就不能完成恢复过程。为了完成恢复过程,为了完成恢复过程, bxCAN 必须工作在正常模式。

位时间特性

位时间特性逻辑通过采样来监视串行的CAN总线,并且通过与帧起始位的边沿进行同步,及通过与后面的边沿进行重新同步,来调整其采样点。

先码图!
在这里插入图片描述
看图可知道,可以分成3个时间段分别为:同步段(SYNC_SEG)、时间段1(BS1)、时间段2(BS2)。

  • 同步段(SYNC_SEG)
    通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 x
    t CAN )。
  • 时间段1(BS1):定义采样点的位置。它包含CAN标准里的PROP_SEG和PHASE_SEG1。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
  • 时间段2(BS2):定义发送点的位置。它代表CAN标准里的PHASE_SEG2。其值可以编程为1到8个时间单元,但也可以被自动缩短以补偿相位的负向漂移。
    重新同步跳跃宽度(SJW)定义了,在每位中可以延长或缩短多少个时间单元的上限。其值可以编
    程为1到4个时间单元。
    有效跳变被定义为,当bxCAN自己没有发送隐性位时,从显性位到隐性位的第1次转变。
    如果在时间段1(BS1)而不是在同步段(SYNC_SEG)检测到有效跳变,那么BS1的时间就被延长最多SJW那么长,从而采样点被延迟了。
    相反如果在时间段2(BS2)而不是在SYNC_SEG检测到有效跳变,那么BS2的时间就被缩短最多SJW那么长,从而采样点被提前了。
    为了避免软件的编程错误,对位时间特性寄存器(CAN_BTR)的设置,只能在bxCAN处于初始化状态下进行。

CAN的帧

在这里插入图片描述
先上图,看完了你也会发现并没有完全看不懂,同时你也会发现完全没看懂。再看文件会发现也没有详细的讲解,所以只能自己搜索资料。

can的通信

其实讲了这么多关于CAN的知识,会发现并没有讲它的数据是如何传输的。在上面我们可以看到,CAN需要标识符、屏蔽位这些来确认所需要的数据,讲了标准帧和扩展帧,但并没有展开讲帧。
接下来一个概念是:CAN是通过帧来传递信息的,主要是数据帧!

帧的构成

从构成开始看起我们先将其分成:帧开始(SOF)、仲裁域【ID(标识符)、SSR、远程发送请求(RTR)、IDE】、控制域【标识符扩展位、r0(接受位)、r1、DLC】、数据域、CRC域【CRC(循环冗余校验码)】、Ack域【ACK(响应位)】、EOF(帧结束)、错误标志、错误回声、错误分隔、间隙、传输暂停、总线空闲、过载标准、过载回声、过载分隔。

  • 帧起始与结束

帧开始:由单个显性位组成。总线空闲时,其他接收节点同步于该帧起始位。
帧结束:由7个连续的隐形位组成

  • 仲裁段
    第一行为标准帧,第二行为扩展帧
    在这里插入图片描述
  • 控制位

在这里插入图片描述
【注】 *1 保留位(r0、r1)
保留位必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。
*2 数据长度码(DLC)
数据长度码与数据的字节数的对应关系如表 8 所示。
数据的字节数必须为 0~8 字节。但接收方对 DLC = 9~15 的情况并不视为错误。

  • 数据段
    Data:0~7与其他总线协议相比,有①数据量小②实时性高③抗干扰性强
  • CRC域
    一个计算值,大致来说就是在这里插入图片描述
  • Ack域
    ACK段:
    发送节点:发送隐形电平
    接收正确的节点:发送显性电平
    根据此节点来判断是否发送成功
帧的种类及其作用
  1. 数据帧(用于发送单元向接收单元传送数据的帧。)
    数据帧是传输数据的CAN帧,结构上由有标准帧(标准标识符)和(扩展标识符)拓展帧。
    在文章开头时,我们讲到CAN有2.0A和2.0B,而2.0A的协议为11位标识符(标准帧),2.0B在兼容11位ID标识符的同时扩展到了29位ID标识符。
    在这里插入图片描述

  2. 远程帧(用于接收单元向具有相同 ID 的发送单元请求数据的帧)
    与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和拓展格式,且RTR位为1。
    在这里插入图片描述
    数据帧与远程帧(遥控帧、请求帧)的不同
    在这里插入图片描述

  3. 错误帧(用于当检测出错误时向其它单元通知错误的帧)
    错误帧的类型分为:

  • CRC错误:发送节点计算得到的CRC值与接收到的CRC值不同时发送该结果。
  • 格式错误:传输的数据帧与任何一种合法的帧格式不符合时发生的错误。
  • 应答错误:发送节点在ACK段没有接送到应答信号时发生该错误。
  • 位发送错误:发送节点在发送时发现总线电平与发送电平不相同时发生该错误。
  • 位填充错误:通讯线缆上传输信号违反“位填充”规则时发生该错误。
    主动错误识别:6连续显性+8连续隐性
    被动错误识别:6连续隐性+8连续隐性
    在这里插入图片描述
  1. 过载帧(用于接收单元通知其尚未做好接收准备的帧)
  • 过载标志:6 个位的显性位。(过载标志的构成与主动错误标志的构成相同)
  • 过载界定符:8 个位的隐性位。(过载界定符的构成与错误界定符的构成相同)
    在这里插入图片描述
  1. 帧间空隙(用于将数据帧及遥控帧与前面的帧分离开来的帧)
    帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
    过载帧和错误帧前不能插入帧间隔。
    在这里插入图片描述
  • 间隔:3 个位的隐性位。
  • 传输暂停(发送暂时停止):8 个位的隐性位。只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
  • 总线空闲:隐性电平,无长度限制(0 亦可)。
    本状态下,可视为总线空闲,要发送的单元可开始访问总线。

bxCAN中断(原文摘抄)

bxCAN占用4个专用的中断向量。通过设置CAN中断允许寄存器(CAN_IER),每个中断源都可以单独允许和禁用。
在这里插入图片描述

  • 发送中断可由下列事件产生:

─ 发送邮箱0变为空,CAN_TSR寄存器的RQCP0位被置’1’。
─ 发送邮箱1变为空,CAN_TSR寄存器的RQCP1位被置’1’。
─ 发送邮箱2变为空,CAN_TSR寄存器的RQCP2位被置’1’。

  • FIFO0中断可由下列事件产生:

─ FIFO0接收到一个新报文,CAN_RF0R寄存器的FMP0位不再是’00’。
─ FIFO0变为满的情况,CAN_RF0R寄存器的FULL0位被置’1’。
─ FIFO0发生溢出的情况,CAN_RF0R寄存器的FOVR0位被置’1’。

  • FIFO1中断可由下列事件产生:

─ FIFO1接收到一个新报文,CAN_RF1R寄存器的FMP1位不再是’00’。
─ FIFO1变为满的情况,CAN_RF1R寄存器的FULL1位被置’1’。
─ FIFO1发生溢出的情况,CAN_RF1R寄存器的FOVR1位被置’1’。

  • 错误和状态变化中断可由下列事件产生:

─ 出错情况,关于出错情况的详细信息请参考CAN错误状态寄存器(CAN_ESR)。
─ 唤醒情况,在CAN接收引脚上监视到帧起始位(SOF)。
─ CAN进入睡眠模式。

结束语

对于CAN的学习,需要多看、多搜索资料,最好能够写一份笔记,这样才能仔细阅览、理解CAN的神奇与奥妙。
写这一份笔记时参考了许多资料,我都会将它写到文末,和大家一起分享参考学习,如果这一份笔记有什么不对,也请大佬指出!
CAN协议,系统结构和帧结构
CAN总线信号帧类型有哪些
CAN帧解析
再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
以及《STM32F10x-中文参考手册》《CAN入门教程》

  • 8
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值