首页 > 代码库 > 【CAN总线】CAN代码相关问题和注释(1) ------------4.6更新

【CAN总线】CAN代码相关问题和注释(1) ------------4.6更新

前言:

  在看如何用FPGA实现can_controller ,本来想把代码上传上来的,结果没成功。如果有意向研究的,可以自己去下载  pudn就有。can tb有点问题,我也只是在刚刚研究,如果有意向可以和我交流, 欢迎大家讨论呐。【PS:坚决抵制伸手党】

本文为整理总结,参考文档如下:

《STM32中文参考手册2010》

----------------------------------------------------我是正文分界线-----------------------------------------

1 CAN IP有提到Wishbone,是总线的一种。它通过在IP核之间建立一个通用接口完成互连。可以用于在软核、固核以及硬核之间进行互联。

2 CAN_IP 需要初始化的寄存器,或者初始化方式可以参考百度文库700多页的手册,22章就是关于can的初始化。我看完了也会整理一下。

3 CAN的工作模式:初始化模式、正常模式、睡眠模式。分别对应不同的寄存器配置。

4 bxCAN(基本扩展CAN)功能描述

 

1 发送处理

设置标识符,数据长度和待发送数据;

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

--------------------------------------------------我是16.4.6更新分界线---------------

3 接收管理

 

根据CAN协议, 当报文被正确接收(直到EOF域的最后一位都没有错误), 且通过了标识符过滤,那么该报文被认为是有效报文。

 

4 标识符过滤

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

过滤器可配置为,屏蔽位模式和标识符列表模式。

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

如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。

如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件有任何打扰。

 

5 报文存储

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

发送邮箱:

接收邮箱(FIFO):在接收到一个报文后,软件就可以访问接收FIFO的输出邮箱来读取它。一旦软件处理了报文(如把它读出来),软件就应该对CAN_RFxR寄存器的RFOM位进行置’1’,来释放该报文,以便为后面收到的报文留出存储空间。过滤器匹配序号存放在CAN_RDTxR寄存器的FMI域中。16位的时间戳存放在CAN_RDTxR寄存器的TIME[15:0]域中。

6 出错管理

7 位时间特性(重要)

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

(2)名义上的每位时间分为3段:

●  同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 xt 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处于初始化状态下进行。

 

8 bxCAN中断

9 CAN寄存器描述

9.1寄存器访问保护

软件只能在CAN处于初始化模式时修改CAN_BTR寄存器。

软件只能在发送邮箱为空的状态改变它。

过滤器的数值只能在关闭对应过滤器组的状态下,或设置FINIT位为’1’后才能改。此外,只有在设置整个过滤器为初始化模式下(即FINIT=1),才能修改过滤器的设置,即修改CAN_FMxR,CAN_FSxR和CAN_FFAR寄存器。

9.2 CAN控制和状态寄存器

CAN 主控制寄存器 (CAN_MCR)

CAN 主状态寄存器 (CAN_MSR)

CAN 发送状态寄存器 (CAN_TSR)

CAN 接收FIFO 0 寄存器 (CAN_RF0R)

CAN 接收FIFO 1 寄存器(CAN_RF1R)

CAN 中断使能寄存器 (CAN_IER)

CAN 错误状态寄存器 (CAN_ESR)

CAN 位时序寄存器 (CAN_BTR)

9.3CAN邮箱寄存器

9.4CAN过滤器寄存器

CAN  过滤器主控寄存器 (CAN_FMR)

CAN  过滤器模式寄存器 (CAN_FM1R)

CAN  过滤器位宽寄存器 (CAN_FS1R)

CAN  过滤器FIFO 关联寄存器 (CAN_FFA1R)

CAN  过滤器激活寄存器 (CAN_FA1R)

CAN  过滤器组i 的寄存器x (CAN_FiRx)

【CAN总线】CAN代码相关问题和注释(1) ------------4.6更新