【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)

时间: 2024-10-10 10:18:07

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

【CAN总线】CAN代码相关问题和注释(2)

本节内容提要: 根据SJA1000的初始化程序,了解CAN的初始化过程以及对象.本来是想整理的,后来发现一整篇都很有用就直接转载了. 不过我在想,如果是直接用verilog实现can 是否有另外的方法来对can进行初始化,比如在fpga对can进行赋值. 参考网址:http://www.360doc.com/content/16/0119/13/29617669_529065812.shtml -----------------------------------------我是正文分界线---

从阅读Discuz的核心代码并给出注释的经历分析程序员该如何阅读代码?

本文标签:   程序员 php Discuz的核心代码 框架 深度学习框架 阅读优秀的代码,是技术水平成长的最佳途径.记得每个进来的新人,我都做过阅读优秀代码的要求,但几乎都只能坚持很少一段时间而已. 前晚大家还在开玩笑的讨论,都是因为看了前人的一些写法,才学会了一些乱七八糟的花招. 晚上我又开始重新阅读Discuz的核心代码,花了1h多的时间,才完成一个core文件的注释. 注释后的代码: <?php /** * [Discuz!] (C)2001-2099 Comsenz Inc. * Th

给php代码添加规范的注释phpDocumentor

给php代码添加规范的注释更多参考 http://phpdoc.org/docs/latest/index.html在phpdocumentor中,注释分为文档性注释和非文档性注释.所谓文档性注释,是那些放在特定关键字前面的多行注释,特定关键字是指能够被phpdoc分析的关键字,例如class,var等,具体的可参加附录1.那些没有在关键字前面或者不规范的注释就称作非文档性注释,这些注释将不会被phpdoc所分析,也不会出现在你产生的api文当中.3.2如何书写文档性注释:所 有的文档性注释都是

C#实现为类和函数代码自动添加版权注释信息的方法

本文实例讲述了C#实现为类和函数代码自动添加版权注释信息的方法,分享给大家供大家参考之用.具体方法如下: 以web项目为例: 一:给类加注释 1.在visual studio 的安装路径下 如:[盘符]:/Program files/Microsoft Visual Studio 8/Common7/IDE/ItemTemplates/web/cshare/2052/class.zip ,将里面的class.cs改为: /*------------------------------------

VS编写代码的四种注释(C#),让编程轻而易举

随着开发的不断深入,随着开发人员的增加,随着开发人员的各种编码风格,如果没有注释,则不同编码人员就很难进行沟通和交流. 注释就像一本书中的前言,这本书对自己有没有帮助,看完前言就知道,这段代码对自己有没有帮助,看完注释就知道! 注释就像深夜里的明灯,明灯指引我们路的方向,注释帮助我们了解代码! 得体的注释让编程者如沐春风,如入芝兰之室! 勉强用了个排比,不为别的,就为体现注释的重要性. 第一中注释:类头注释 效果图: [每次新建类的时候就会自动编写注释,包括作者.日期版本.类的功能] 实现过程:

linux 内核网络协议栈阅读理解--带详尽注释以及相关流程调用注释,附 github 注释后源码

linux 内核网络协议栈阅读理解--带详尽注释以及相关流程调用注释,对理解内核协议栈源码很有帮助 对理解阅读 linux 协议栈源码很用帮助 github 地址: https://github.com/y123456yz/Reading-and-comprehense-linux-Kernel-network-protocol-stack

代码是灵魂,注释是心声

在以前一些关于代码注释的文章中,我发现,你不需要的注释才是最好的注释.不要急着批判,请允许我阐述一下.首先代码应该尽量地简洁,尽可能地做到不需要依赖注释就可以理解.只有那些真的没法更易于理解的代码,才需要我们添加注释. 有一本非常经典的书叫<Structure and Interpretation of Computer Programs>(<电脑程序的结构和编译>),最初发表于1985年,在序言中就表明其观点: 程序必须能便于我们阅读,让机器执行只是附带的. Knuth也在他19

代码中特殊的注释技术——TODO、FIXME和XXX的用处 (转载)

转自:http://blog.csdn.net/reille/article/details/7161942 作者:reille 本博客网址:http://blog.csdn.net/reille/,转载本博客原创文章请注明出处. 本文内容概要: 代码中特殊的注释技术——TODO.FIXME和XXX的用处. 更多请关注:http://velep.com/ ——————————————————————————————————————————————————————————————————— 前言:

代码中特殊的注释技术——TODO、FIXME和XXX的用处 (转载)

转自:http://blog.csdn.net/reille/article/details/7161942 作者:reille 本博客网址:http://blog.csdn.net/reille/,转载本博客原创文章请注明出处. 本文内容概要: 代码中特殊的注释技术——TODO.FIXME和XXX的用处. 更多请关注:http://velep.com/ ——————————————————————————————————————————————————————————————————— 前言: