CAN文档

更新时间:2023-09-20 06:01:01 阅读量: 医药卫生 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

最近在搞stm32实验板的can现场总线实验,之前只是搞过STC51的串口通信,相比之下,发觉can总线都挺复杂的。开始时,知道自己是新手,只知道can总线跟串行通信,485通信,I2C通信一样都是用来传输数据通信的,对其工作原理一窍不通,还是从基础开始看书看资料,先了解它的基本原理吧。

原来can总线有以下特点:

主要特点

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

发送

", 3个发送邮箱

", 发送报文的优先级特性可软件配置 ", 记录发送SOF时刻的时间戳

接收

", 3级深度的2个接收FIFO

", 14个位宽可变的过滤器组-由整个CAN共享 ", 标识符列表

", FIFO溢出处理方式可配置 ", 记录接收SOF时刻的时间戳

可支持时间触发通信模式 ", 禁止自动重传模式 ", 16位自由运行定时器 ", 定时器分辨率可配置

", 可在最后2个数据字节发送时间戳

管理

", 中断可屏蔽

", 邮箱占用单独1块地址空间,便于提高软件效率

看完这些特点后,疑问一个一个地出现, 1. 什么是时间触发功能? 2. 发送邮箱是什么来的? 3. 报文是什么来的? 4. 什么叫时间戳? 5. 什么叫接收FIFO? 6. 什么叫过滤器?

好了,带着疑问往下看,看完一遍后,

报文:

报文包含了将要发送的完整的数据信息

发送邮箱:

共有3个发送邮箱供软件来发送报文。发送调度器根据优先级决定哪个邮箱的报文先被发送。

接收过滤器:

共有14个位宽可变/可配置的标识符过滤器组,软件通过对它们编程,从而在引脚收到的报文中选择它需要的报文,而把其它报文丢弃掉。

接收FIFO

共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。它们完全由硬件来管理

工作模式

bxCAN有3个主要的工作模式:初始化、正常和睡眠模式。

初始化模式

*软件通过对CAN_MCR寄存器的INRQ位置1,来请求bxCAN进入初始化模式,然后等待硬件对CAN_MSR寄存器的INAK位置1来进行确认

*软件通过对CAN_MCR寄存器的INRQ位清0,来请求bxCAN退出初始化模式,当硬件对CAN_MSR寄存器的INAK位清0就确认了初始化模式的退出。

*当bxCAN处于初始化模式时,报文的接收和发送都被禁止,并且CANTX引脚输出隐性位(高电平)

正常模式

在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文。软件可以通过对CAN_MCR寄存器的INRQ位清0,来请求从初始化模式进入正常模式,然后要等待硬件对CAN_MSR寄存器的INAK位置1的确认。在跟CAN总线取得同步,即在CANRX引脚上监测到11个连续的隐性位(等效于总线空闲)后,bxCAN才能正常接收和发送报文。

过滤器初值的设置不需要在初始化模式下进行,但必须在它处在非激活状态下完成(相应的FACT位为0)。而过滤器的位宽和模式的设置,则必须在初始化模式下,进入正常模式前完成。

睡眠模式(低功耗)

*软件通过对CAN_MCR寄存器的SLEEP位置1,来请求进入这一模式。在该模式下,bxCAN的时钟停止了,但软件仍然可以访问邮箱寄存器。

*当bxCAN处于睡眠模式,软件想通过对CAN_MCR寄存器的INRQ位置1,来进入初始化式,那么软件必须同时对SLEEP位清0才行

*有2种方式可以唤醒(退出睡眠模式)bxCAN:通过软件对SLEEP位清0,或硬

件检测CAN总线的活动。

工作流程

那么究竟can是怎样发送报文的呢?

发送报文的流程为:

应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;

然后对CAN_TIxR寄存器的TXRQ位置1,来请求发送。TXRQ位置1后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。

如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置1,由于发送错误引起的

就对TERR位置1。

原来发送的优先级可以由标识符和发送请求次序决定: 由标识符决定

当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。

由发送请求次序决定

通过对CAN_MCR寄存器的TXFP位置1,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。 该模式对分段发送很有用。

时间触发通信模式

在该模式下,CAN硬件的内部定时器被激活,并且被用于产生时间戳,分别存储在

CAN_RDTxR/CAN_TDTxR寄存器中。内部定时器在接收和发送的帧起始位的采样点位置被采样,并生成时间戳(标有时间的数据)。

接着又是怎样接收报文的呢? 接收管理

接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU

的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。

有效报文

根据CAN协议,当报文被正确接收(直到EOF域的最后1位都没有错误),且通过了标识符

过滤,那么该报文被认为是有效报文。

接收相关的中断条件

* 一旦往FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为1,那么就会产生一个中断请求。 * 当FIFO变满时(即第3个报文被存入),CAN_RFxR寄存器的FULL位就被置1,并且如果CAN_IER寄存器的FFIE位为1,那么就会产生一个满中断请求。 * 在溢出的情况下,FOVR位被置1,并且如果CAN_IER寄存器的FOVIE位为1,那么就会产生一个溢出中断请求

标识符过滤

在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。(注:不是一对一通信,而是多机通信)节点在接收报文时-根据标识符的值-决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。

为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

过滤器的模式的设置

通过设置CAN_FM0R的FBMx位,可以配置过滤器组为标识符列表模式或屏蔽位模式。

为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。 为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。 应用程序不用的过滤器组,应该保持在禁用状态。

过滤器优先级规则

", 1位宽为32位的过滤器,优先级高于位宽为16位的过滤器

", 2对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式 ", 3位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高

图128 过滤器机制的例子

(原文件名:无标题.jpg)

引用图片

上面的例子说明了bxCAN的过滤器规则:在接收一个报文时,其标识符首先与配置在标识符列表模式下的过滤器相比较;如果匹配上,报文就被存放到相关联的FIFO中,并且所匹配的过滤器的序号被存入过滤器匹配序号中。如同例子中所显示,报文标识符跟#4标识符匹配, 因此报文内容和FMI4被存入FIFO。

如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。 如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件有任何打扰。

接收邮箱(FIFO)

在接收到一个报文后,软件就可以访问接收FIFO的输出邮箱来读取它。一旦软件处理了报文(如把它读出来),软件就应该对CAN_RFxR寄存器的RFOM位进行置1,来释放该报文,以便为后面收到的报文留出存储空间。

中断

bxCAN占用4个专用的中断向量。通过设置CAN中断允许寄存器(CAN_IER),每个中断源都可以单独允许和禁用。

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

本文来源:https://www.bwwdw.com/article/6igh.html

Top