CAN总线学习笔记四:CAN总线通信

发布者:和谐共存最新更新时间:2015-06-12 来源: eepw关键字:CAN总线  学习笔记  CAN总线通信 手机看文章 扫描二维码
随时随地手机看文章
  在理解了CAN总线的自通信程序后,再来探讨CAN总线间的相互通信变得容易了许多。对于是自通信还是相互通信,这个肯定是需要对寄存器进行必要的设置的,分析PIAE的两个程序后不难发现,自通信和互通信需要设置的知识模式寄存器,这个是在SJA1000的初始化时进行设定的。
本文引用地址:http://www.eepw.com.cn/article/268271.htm

  SJA1000的初始化程序我根据习惯,直接把它独立成一个子程序了。如下,是工作于自通信时的初始化程序。

  ///////////////////////////////////////////////

  //函数:init_sja1000

  //说明:独立CAN控制器SJA1000的初始化

  //入口:无

  //返回:无

  ///////////////////////////////////////////////

  void init_sja1000(void)

  {

  uchar state;

  uchar ACRR[4];

  uchar AMRR[4];

  // 接收代码寄存器

  ACRR[0] = 0xff;

  ACRR[1] = 0x22;

  ACRR[2] = 0x33;

  ACRR[3] = 0x44;

  // 接收屏蔽寄存器,只接收主机发送的信息

  AMRR[0] = 0xff;

  AMRR[1] = 0Xff;

  AMRR[2] = 0xff;

  AMRR[3] = 0xff;

  // 使用do--while语句确保进入复位模式

  do

  { // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器

  MODR = 0x09;

  state = MODR;

  }

  while( !(state & 0x01) );

  // 对SJA1000部分寄存器进行初始化设置

  CDR = 0x88; // CDR为时钟分频器,CDR.3=1--时钟关闭, //CDR.7=0---basic CAN, CDR.7=1---Peli CAN

  BTR0 = 0x31; // 总线定时寄存器0 ;总线波特率设定

  BTR1 = 0x1c; // 总线定时寄存器1 ;总线波特率设定

  IER = 0x01; // IER.0=1--接收中断使能; IER.1=0--关闭发送中断使能

  OCR = 0xaa; // 配置输出控制寄存器

  CMR = 0x04; // 释放接收缓冲器

  // 初始化接收代码寄存器

  ACR0 = ACRR[0];

  ACR1 = ACRR[1];

  ACR2 = ACRR[2];

  ACR3 = ACRR[3];

  // 初始化接收屏蔽寄存器

  AMR0 = AMRR[0];

  AMR1 = AMRR[1];

  AMR2 = AMRR[2];

  AMR3 = AMRR[3];

  // 使用do--while语句确保进入自接收模式

  do

  { //MOD.2=1--进入自接收模式,MOD.3=0--双滤波器模式

  MODR = 0x04;

  state = MODR;

  }

  while( !(state & 0x04) );

  }

  两个数组ACRR[4]和AMRR[4]分别存储着需要设置的接收代码寄存器和接收屏蔽寄存器的数值。这两个数组的设置设计者可以根据需要自己设定(在互通信时就需要在这里做文章了)。AMRR的四个值都设定为OXFF说明无论总线上传输的ID值是什么,也不管ACRR的数值设定是什么,这个SJA1000都照单全收(至于为什么,上节关于验收滤波的日志做了详细讨论了)。[page]

  然后进入设定模式寄存器进入复位模式。在复位模式下,可以对SJA1000部分寄存器进行初始化设置,并且把刚才两个数组的数据存入接收代码寄存器和接收屏蔽寄存器里,自此初始化算是完成了。但是因为CAN总线控制器要进行自通信,所以必须对模式寄存器设定使得SJA1000进入复位模式,这就是最后的do--while语句的作用。

  接下来,我们看CAN总线互相通信的初始化设置。

  ///////////////////////////////////////////////

  //函数:init_sja1000

  //说明:独立CAN控制器SJA1000的初始化

  //入口:无

  //返回:无

  ///////////////////////////////////////////////

  void init_sja1000(void)

  {

  uchar state;

  uchar ACRR[4];

  uchar AMRR[4];

  // 接收代码寄存器

  ACRR[0] = 0x11;

  ACRR[1] = 0x22;

  ACRR[2] = 0x33;

  ACRR[3] = 0x44;

  // 接收屏蔽寄存器

  AMRR[0] = 0x00;

  AMRR[1] = 0Xff;

  AMRR[2] = 0x00;

  AMRR[3] = 0xff;

  // 使用do--while语句确保进入复位模式

  do

  { // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器

  MODR = 0x09;

  state = MODR;

  }

  while( !(state & 0x01) );

  // 对SJA1000部分寄存器进行初始化设置

  CDR = 0x88; // CDR为时钟分频器,CDR.3=1--时钟关闭, //CDR.7=0---basic CAN, CDR.7=1---Peli CAN

  BTR0 = 0x31; // 总线定时寄存器0 ;总线波特率设定

  BTR1 = 0x1c; // 总线定时寄存器1 ;总线波特率设定

  IER = 0x01; // IER.0=1--接收中断使能; IER.1=0--关闭发送中断使能

  OCR = 0xaa; // 配置输出控制寄存器

  CMR = 0x04; // 释放接收缓冲器

  // 初始化接收代码寄存器

  ACR0 = ACRR[0];

  ACR1 = ACRR[1];

  ACR2 = ACRR[2];

  ACR3 = ACRR[3];

  // 初始化接收屏蔽寄存器

  AMR0 = AMRR[0];

  AMR1 = AMRR[1];

  AMR2 = AMRR[2];

  AMR3 = AMRR[3];

  // 使用do--while语句确保退出复位模式

  do

  {

  MODR = 0x08; //MOD.3=0--双滤波器模式

  state = MODR;

  }

  while( state & 0x01 );

  }

  很容易可以发现,CAN互通信和自通信的初始化设置,只有最后的设置是不一样的,自通信时把模式寄存器的自通信寄存器位置位,而互通信时只要退出复位模式(同时把自通信寄存器位清零)即可。其它的设置根据需要设定。

  上面讨论了自通信和互通信两种工作方式下的寄存器设置。那么,我就在想,如果用互通信的模式下,如果发送帧的ID设定和自身接收的验收滤波吻合,是不是也能进行自接收呢?答案是否定的,根据以上的设想做的实验表明,在互通信模式下,CAN总线上若只有一个节点,那么CAN总线是不会达到你预想的变化的,按下键后红灯会一直亮着,说明CAN总线陷入了无法接收或者正在接收的死循环跳不出来了。

  另外,我还做了一个实验。就是当CAN节点1发送的数据帧ID不仅和节点2的吻合,也和自身的验收滤波吻合,那么当节点1的数据帧发送后是不是节点1和节点2都能接收到数据呢?结果证明这个设想是成立的。这也就说明了挂靠在CAN总线上的每一个节点,只要CAN总线上的数据帧ID和某节点验收滤波通过,该节点就可以接收数据。

  在初始化设置了模式寄存器后,下一步就是设定不同的发送帧的ID和本节点的接收代码寄存器值和屏蔽寄存器值。我这里只有两个节点通信,一般如果要使CAN总线上的两个节点相互接收到对方的数据。那么根据上一节的原理设定接收代码寄存器值和屏蔽寄存器值以及发送帧的ID值就可以了。

  在看懂并且理解了PIAE工作组的CAN自通信和互通信后,我想对于CAN总线协议的工作方式算是已经入门了,剩下的就是继续从官方或者第三方提供的datasheet里补知识,根据不同的场合和不同的应用把CAN总线控制器的寄存器设置用活来。

关键字:CAN总线  学习笔记  CAN总线通信 引用地址:CAN总线学习笔记四:CAN总线通信

上一篇:CAN总线学习笔记五:SJA1000硬件电路
下一篇:CAN总线学习笔记三:验收滤波

推荐阅读最新更新时间:2024-05-02 23:44

基于ARM的CAN总线电缆沟道监测系统的设计
1 引言 城市高低压输电电缆人地率已成为城市管理水平的标志之一。城市输配电电缆近年正逐渐从架空线改为电力电缆,电缆沟道作为电缆线路的通道,其建设速度逐年加快,建设里程逐年递增,以后更会大规模展开。 研制一套电缆沟道检测系统,采用现代化的设备和手段对电缆沟道环境和电缆运行状态进行实时传输,全程监测,状态显示,临界报警,预测提示,事件分析统计等,通过此设备使电缆沟道的管理由人工周期巡检,事后补救式转变为全程实时监测、人工周期维护和事件应急反应处理相结合的管理模式。将事故隐患消除在萌芽状态,防患于未然,降低事故发生率和人员成本,提高供电质量,增加经济效益。这里基于LPC2292控制器和CAN现场总线技术,考虑经济、实用因素,提出
[单片机]
基于ARM的<font color='red'>CAN总线</font>电缆沟道监测系统的设计
基于CAN总线的分布式铝电解控制系统
    摘要: 介绍了基于CAN总线的分布式铝电解控制系统的设计和实现方法,给出了CAN总线的硬件接口电路设计和槽控机逻辑电路结构图。     关键词: CAN总线  电解槽  槽控机     铝电解生产计算机监控系统的形成和发展,已由早期的集中型发展到集散型,又进一步发展到了分布式系统。集中控制采用单机群控技术,比较成功地解决了铝电解生产过程监控系统的设计和应用问题。为了对每台铝电解槽比较复杂的控制进行解析、响应现场实时性强的多种操作、控制程序多任务调度等,同时也为了解决集中控制的脆弱性、实时性差等问题,需要对铝电解槽实施分布式控制方案。现在分布式控制已成为铝行业计算机控制系统的发展趋势。为此,本文介
[应用]
基于单片机AT89C52的CAN总线分布式测控系统的设计
  本文主要介绍了一种基于单片机AT89C52的CAN总线分布式测控系统,主要阐述了系统的总体设计方案,以及控制模块和采集模块的软硬件设计,重点是系统中以单片机为核心的带有CAN总线接口的设计,解决现场各传感器得到的测量信号利用单片机进行存储和处理,然后通过与CAN控制器的通讯将信息发送到CAN总线上。   1 CAN总线网络的技术特点   用通讯数据块编码,可实现多主工作方式,数据收发方式灵活,可实现点对点、一点对多点及全局广播等多种传输方式;可将DCS结构中主机的常规测试与控制功能分散到各个智能节点,节点控制器把采集到的数据通过CAN适配器发送到总线,或者向总线申请数据,主机便从原来繁重的底层设备监控任务中解放出来,进行更高
[单片机]
基于单片机AT89C52的<font color='red'>CAN总线</font>分布式测控系统的设计
CAN总线抗干扰的6条“军规”
随着CAN总线在电动汽车、充电桩、电力电子、轨道交通等电磁环境比较恶劣的场合应用越来越多,信号干扰的问题已经严重影响到使用者对CAN总线的信任。究竟如何才能抗干扰?本文展示了致远电子CAN总线抗干扰的6条“军规”。 在汽油车时代,CAN总线遇到的干扰少之又少,即使有一些继电器和电磁阀的脉冲, 也不会有很大影响,稍微进行双绞处理,完全可以实现零错误帧。 可是到了电动汽车年代,逆变器、电动机、充电机等大功率设备对CAN的影响足以中断通讯,或者损坏CAN节点,如图1图2所示,就是被逆变器干扰的CAN波形。 图1 干扰前 图2 干扰后
[汽车电子]
<font color='red'>CAN总线</font>抗干扰的6条“军规”
MSP430F5438学习笔记 DCO倍频至8MHZ
1.平台说明 MS430F5438 // 时钟默认情况 // FLL时钟 FLL选择 XT1 // 辅助时钟 ACLK选择 XT1 32768Hz // 主系统时钟 MCLK选择 DCOCLKDIV 1048576Hz // 子系统时钟 SMCLK选择 DCOCLKDIV 1048576Hz #include msp430.h void clock_config(void); void select_xt1(void); void dco_config(void); int main(void) { clock_config(); // 初始化时钟 P4DI
[单片机]
SN65HVD230型CAN总线收发器的原理及应用
引言 CAN总线以其较高的通讯速率、良好的抗电磁干扰能力可实现高可靠性串行通信,因而在实际应用中具有极高的应用价值。但是,随着集成技术的不断发展,为了节省功耗,缩小电路体积,一些新型CAN总线控制器的逻辑电平均采用LVTTL,这就需要与之相适应的总线收发器。TI公司生产的SN65HVD230型电路很好地解决了这个问题。 1 SN65HVD230简介 SN65HVD230是德州仪器公司生产的3.3CAN总线收发器,主要是与带有CAN控制器的TMS320Lx240x系列DSP配套使用,该收发器具有差分收发能力,最高速率可达1Mb/s。广泛用于汽车、工业自动化、UPS控制等领域。     1.1 主要特点及引脚功能 SN6
[嵌入式]
基于CAN总线的高精度温湿度监控系统
引言     一个高效的温湿度自动监控系统对各行业进行科学有效的管理,保障工作环境温湿度恒定,降低能源损耗是非常必要的。传统的温湿度远程监控系统如RS一485总线在数据传输过程中存在着数据传输速率低、实时性差,对所采集的实时数据不能进行分析、节点加入或者离开网络要重新配置等问题,而温湿度传感器检测过程中湿度受温度影响而导致测量误差大、校准和标定复杂、互换性和长期稳定性差等。     因此,本文提出一种基于CAN总线高精度温湿度监控系统,不仅可以提高系统的传输速率和实时性,而且也可以提升系统温湿度采集的准确度。 1 系统的整体结构 图1 温湿度监控系统的总线分布式结构     CAN—Bus(Control
[嵌入式]
51单片机学习笔记———10.中断机制
中断 单片机的中断系统是最基础也是最重要的部分,博主在学习这个的时候踩到了很多的坑,于是写下这篇笔记来整理一下自己的思路。 中断涉及的内容: 中断源: C51单片机有5个中断源,C52单片机有6个中断源: 由于多出来的那个中断源不常用,所以我们在这里只介绍C51单片机的中断系统: 8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1 中断整体结构: 与中断有关的寄存器:
[单片机]
51单片机<font color='red'>学习</font><font color='red'>笔记</font>———10.中断机制
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved