CAN基础知识 点击:30713 | 回复:451



陈卫华

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:11帖 | 30回
  • 年度积分:0
  • 历史总积分:207
  • 注册:2003年4月16日
发表于:2005-04-20 13:52:00
楼主
CAN基本知识 什么是CAN ? CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。 一个由CAN 总线构成的单一网络中,理论上可以挂接无数个节点。实际应用中,节点数目受网络硬件的电气特性所限制。例如,当使用Philips P82C250作为CAN收发器时,同一网络中允许挂接110个节点。CAN 可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易。另外,硬件的错误检定特性也增强了CAN的抗电磁干扰能力。 CAN 是怎样发展起来的? CAN最初出现在80年代末的汽车工业中,由德国Bosch公司最先提出。当时,由于消费者对于汽车功能的要求越来越多,而这些功能的实现大多是基于电子操作的,这就使得电子装置之间的通讯越来越复杂,同时意味着需要更多的连接信号线。提出CAN总线的最初动机就是为了解决现代汽车中庞大的电子控制装置之间的通讯,减少不断增加的信号线。于是,他们设计了一个单一的网络总线,所有的外围器件可以被挂接在该总线上。1993年,CAN 已成为国际标准ISO11898(高速应用)和ISO11519(低速应用)。 CAN是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。当信号传输距离达到10Km时,CAN 仍可提供高达50Kbit/s的数据传输速率。 由于CAN总线具有很高的实时性能,因此,CAN已经在汽车工业、航空工业、工业控制、安全防护等领域中得到了广泛应用。 CAN 是怎样工作的? CAN通讯协议主要描述设备之间的信息传递方式。CAN层的定义与开放系统互连模型(OSI)一致。每一层与另一设备上相同的那一层通讯。实际的通讯发生在每一设备上相邻的两层,而设备只通过模型物理层的物理介质互连。CAN的规范定义了模型的最下面两层:数据链路层和物理层。下表中展示了OSI开放式互连模型的各层。应用层协议可以由CAN用户定义成适合特别工业领域的任何方案。已在工业控制和制造业领域得到广泛应用的标准是DeviceNet,这是为PLC和智能传感器设计的。在汽车工业,许多制造商都应用他们自己的标准。 表1 OSI开放系统互连模型 7 应用层 最高层。用户、软件、网络终端等之间用来进行信息交换。如:DeviceNet 6 表示层 将两个应用不同数据格式的系统信息转化为能共同理解的格式 5 会话层 依靠低层的通信功能来进行数据的有效传递。 4 传输层 两通讯节点之间数据传输控制。操作如:数据重发,数据错误修复 3 网络层 规定了网络连接的建立、维持和拆除的协议。如:路由和寻址 2 数据链路层 规定了在介质上传输的数据位的排列和组织。如:数据校验和帧结构 1 物理层 规定通讯介质的物理特性。如:电气特性和信号交换的解释 CAN能够使用多种物理介质,例如双绞线、光纤等。最常用的就是双绞线。信号使用差分电压传送,两条信号线被称为“CAN_H”和“CAN_L”,静态时均是2.5V左右,此时状态表示为逻辑“1”,也可以叫做“隐性”。用CAN_H比CAN_L高表示逻辑“0”,称为“显形”,此时,通常电压值为:CAN_H = 3.5V 和CAN_L = 1.5V 。 - 1 - 北京华控技术有限责任公司电话:(010)58859951~69转9906 传真: 58859818 http://www.huakong.com.cn CAN 有哪些特性? CAN具有十分优越的特点,使人们乐于选择。这些特性包括: 低成本 极高的总线利用率 很远的数据传输距离(长达10Km) 高速的数据传输速率(高达1Mbit/s) 可根据报文的ID决定接收或屏蔽该报文 可靠的错误处理和检错机制 发送的信息遭到破坏后,可自动重发 节点在错误严重的情况下具有自动退出总线的功能 报文不包含源地址或目标地址,仅用标志符来指示功能信息、优先级信息 Philips制造的CAN芯片有哪些? 表2 CAN芯片一览表 类别 型号 备注 CAN微控制器 P87C591 替代P87C592 XA C37 16位MCU CAN独立控制器 SJA1000 替代82C200 CAN收发器 PCA82C250 高速CAN收发器 PCA82C251 高速CAN收发器 PCA82C252 容错CAN收发器 TJA1040 高速CAN收发器 TJA1041 高速CAN收发器 TJA1050 高速CAN收发器 TJA1053 容错CAN收发器 TJA1054 容错CAN收发器 LIN收发器 TJA1020 LIN收发器 什么是CSMA/CD ? CSMA/CD是“载波侦听多路访问/冲突检测”(Carrier Sense Multiple Access with Collision Detect)的缩写。 利用CSMA访问总线,可对总线上信号进行检测,只有当总线处于空闲状态时,才允许发送。利用这种方法,可以允许多个节点挂接到同一网络上。当检测到一个冲突位时,所有节点重新回到‘监听’总线状态,直到该冲突时间过后,才开始发送。在总线超载的情况下,这种技术可能会造成发送信号经过许多延迟。为了避免发送时延,可利用CSMA/CD方式访问总线。当总线上有两个节点同时进行发送时,必须通过“无损的逐位仲裁”方法来使有最高优先权的的报文优先发送。在CAN总线上发送的每一条报文都具有唯一的一个11位或29位数字的ID。CAN总线状态取决于二进制数‘0’而不是‘1’,所以ID号越小,则该报文拥有越高的优先权。因此一个为全‘0’标志符的报文具有总线上的最高级优先权。可用另外的方法来解释:在消息冲突的位置,第一个节点发送0而另外的节点发送1,那么发送0的节点将取得总线的控制权,并且能够成功的发送出它的信息。 - 2 - 北京华控技术有限责任公司电话:(010)58859951~69转9906 传真: 58859818 http://www.huakong.com.cn CAN的高层协议 CAN的高层协议(也可理解为应用层协议)是一种在现有的底层协议(物理层和数据链路层)之上实现的协议。高层协议是在CAN规范的基础上发展起来的应用层。许多系统(像汽车工业)中,可以特别制定一个合适的应用层,但对于许多的行业来说,这种方法是不经济的。一些组织已经研究并开放了应用层标准,以使系统的综合应用变得十分容易。 一些可使用的CAN高层协议有: 制定组织主要高层协议 CiA CAL协议 CiA CANOpen协议 ODVA DeviceNet 协议 Honeywell SDS 协议 Kvaser CANKingdom协议 什么是标准格式CAN和扩展格式CAN? 标准CAN的标志符长度是11位,而扩展格式CAN的标志符长度可达29位。CAN 协议的2.0A版本规定CAN控制器必须有一个11位的标志符。同时,在2.0B版本中规定,CAN控制器的标志符长度可以是11位或29位。遵循CAN2.0B协议的CAN控制器可以发送和接收11位标识符的标准格式报文或29位标识符的扩展格式报文。如果禁止CAN2.0B,则CAN 控制器只能发送和接收11位标识符的标准格式报文,而忽略扩展格式的报文结构,但不会出现错误。 目前,Philips公司主要推广的CAN独立控制器均支持CAN2.0B协议,即支持29位标识符的扩展格式报文结构。 北京华控技术有限责任公司电话:(010)58859951~69转9906 传真: 58859818 http://www.huakong.com.cn 有需要CAN总线更详细知识和协议的可以留下您的邮件地址,我可以给你们发到邮箱。



本钢

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:52
  • 注册:2006年1月06日
发表于:2006-01-11 17:12:00
81楼
请给我发一份,谢谢!www.ning2824199@163.com

恋琴依然

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 14回
  • 年度积分:0
  • 历史总积分:22
  • 注册:2005年3月09日
发表于:2006-01-11 17:18:00
82楼
能给我发一份吗?谢谢了
 tianfaliang@163.com

蛋蛋屁

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 10回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2006年1月04日
发表于:2006-01-11 17:56:00
83楼

蛋蛋屁

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 10回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2006年1月04日
发表于:2006-01-11 17:58:00
84楼
请给我发一份啊 谢谢   jiangqinglin514@163.com

蛋蛋屁

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 10回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2006年1月04日
发表于:2006-01-11 17:59:00
85楼

新希望

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 5回
  • 年度积分:0
  • 历史总积分:73
  • 注册:2003年2月28日
发表于:2006-01-13 09:16:00
86楼
陈老师:上、下位机采用CAN总线通讯方式,但是经常出现上、下位机通讯故障。上位机提示下位机“停机”。只要到现场进行断电复位就恢复正常,请问发生故障的可能原因是什么?谢谢!!!

新希望

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 5回
  • 年度积分:0
  • 历史总积分:73
  • 注册:2003年2月28日
发表于:2006-01-13 09:17:00
87楼
陈老师:上、下位机采用CAN总线通讯方式,但是经常出现上、下位机通讯故障。上位机提示下位机“停机”。只要到现场进行断电复位就恢复正常,请问发生故障的可能原因是什么?谢谢!!!

cr_cheng

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 6回
  • 年度积分:0
  • 历史总积分:35
  • 注册:2005年10月17日
发表于:2006-01-13 09:46:00
88楼
谢了:我要一份cr_cheng11@163.com

小斗

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 27回
  • 年度积分:0
  • 历史总积分:30
  • 注册:2003年12月30日
发表于:2006-01-13 09:46:00
89楼
真是讨厌,要给就直接给嘛,干点什么事不可以直截了当,而一定要这样那样呢?!
CAN资料,中英文协议,介绍,芯片资料直接下嘛!
http://www.zlgmcu.com/philips/can/can_about.asp
http://www.zlgmcu.com/philips/philips-can.asp

luckwan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 14回
  • 年度积分:0
  • 历史总积分:20
  • 注册:2006年1月05日
发表于:2006-01-14 21:10:00
90楼
 请给我一份资料学习学习!  发至:luckwan1019@163.com,谢谢

aigo

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:67
  • 注册:2006年1月11日
发表于:2006-01-15 19:26:00
91楼
我是个初学者,想更多的了解CAN网络.请给我发一份吧,谢谢了~!
chenyongjinch@163.com

tiannhui

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 38回
  • 年度积分:0
  • 历史总积分:45
  • 注册:2003年4月25日
发表于:2006-01-18 19:16:00
92楼
xiexie

zsl919

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 17回
  • 年度积分:0
  • 历史总积分:70
  • 注册:2003年10月13日
发表于:2006-01-21 17:00:00
93楼
请也给我发一份吧,谢谢了!!!!!!!!!!!!!!!!!!!
zsl919@sina.com

419981664

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 28回
  • 年度积分:0
  • 历史总积分:28
  • 注册:2005年12月24日
发表于:2006-01-22 22:53:00
94楼
能给分详细的码?wu419981664@yahoo.com.cn

紫烟红尘

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 50回
  • 年度积分:0
  • 历史总积分:36
  • 注册:2005年12月04日
发表于:2006-02-28 11:44:00
95楼
vcaozhandongv@163.com
我现在正在学习,希望能得到你的帮助,谢谢

njlyg

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:13
  • 注册:2006年3月02日
发表于:2006-03-02 13:54:00
96楼
感觉can网通讯,节点多会丢失报文,请问哪知芯片较好,能否发一份资料给我,谢谢!
yonggang2287◎163.com

LOVEMCU

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 4回
  • 年度积分:0
  • 历史总积分:10
  • 注册:2005年10月12日
发表于:2006-03-02 16:06:00
97楼
   能请教楼主一个问题吗?
   我现在正在搞CAN,但是没调出。硬件电路是按照各种资料上给出的标准电路搭的(SJA1000+PCA82C250方案),有怀疑的地方是SJA1000的复位脚,我直接从ATMEGA8515的RST处给出,不知道有没有影响。 
  软件部分,看了资料,也看了很多例程,但就是调不通!我现在正利用ZLG的CAN232MB(也就是CAN与232的转换器,利用它可以直接在PC上通过串口调试软件与CAN设备进行通讯)调试,在我的程序里,CAN的发送已经完成,但是在上位机的串口调试软件中没有收到数据。下面是CAN初识化及发送部分的程序: 
/************************************************* 
          初始化SJA1000控制器子程序      
*************************************************/ 
void Init_CAN(void)                 

   uchar temp; 
   do 
   { 
      write_sja(MODE,0x01);   //进入复位模式 
   } 
   while(!(read_sja(MODE)&0x01));   //检测是否已进入复位工作模式 
   write_sja(BTR0,0x07);    //设置时钟分频器,速度为20KHZ 
   write_sja(BTR1,0x7f);             
   write_sja(OCR,0x1a);               //输出设置,正常模式 
   write_sja(CDR,0x88);            //设置PeliCAN模式,同时禁能CLOCKOUT  
   write_sja(RXERR,0x00);          
   write_sja(TXERR,0x00); 
   write_sja(ECC,0x00); 
   write_sja(RBSA,0x00);              //缓存器起始地址寄存器设置为0 
    
   write_sja(ACR0,0x00);    //设置ACR 
   write_sja(ACR1,0x00); 
   write_sja(ACR2,0x00); 
   write_sja(ACR3,0x00); 

   write_sja(AMR0,0xff);           //设置AMR,所有数据都可接收 
   write_sja(AMR0,0xff); 
   write_sja(AMR0,0xff); 
   write_sja(AMR0,0xff); 

   write_sja(IER,0x01);  
   write_sja(CMR,0x0c);      //设置命令寄存器,清除数据溢出和释放接收缓冲器 
   write_sja(MODE,0x08);    //进入工作模式                         


/************************************************* 
               SJA1000发送子程序 
*************************************************/ 
void CanTransmit(void)  
{  
   uchar status; 
   CLI();                               
   while(!(read_sja(SR)&0x10));   //判断是否正在接收           

           while(!(read_sja(SR)&0x04));   //等待reg2^2==1,即判断发送缓冲器的状态 
   write_sja(TXEFF,0x88);         //数据的第一个字节,设置成扩展帧,数据长度为8个字节 
   write_sja(TXID0,0xff);         //ID码 
   write_sja(TXID1,0xff); 
   write_sja(TXID2,0xff); 
   write_sja(TXID3,0xff); 
   write_sja(TXDATA0,0x00);       //8个字节的数据 
   write_sja(TXDATA1,0x11); 
   write_sja(TXDATA2,0x22); 
   write_sja(TXDATA3,0x33); 
   write_sja(TXDATA4,0x44); 
   write_sja(TXDATA5,0x55); 
   write_sja(TXDATA6,0x66); 
   write_sja(TXDATA7,0x77); 
   write_sja(CMR,0x01);            //启动发送 
   while(!(read_sja(SR) & 0x08));//判断发送是否完成 
   PORTD ^= BIT(5);              //改变小灯状态(程序已能正确运行到这里,每次起动发送后,小灯的状态变化正常) 
   SEI();                         
}

飞宏

  • 精华:0帖
  • 求助:0帖
  • 帖子:21帖 | 44回
  • 年度积分:3
  • 历史总积分:529
  • 注册:2005年11月30日
发表于:2006-03-03 19:37:00
98楼
请给我也发一份,谢谢
chinanew@sohu.com

临风听海

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:31
  • 注册:2006年3月10日
发表于:2006-03-10 22:52:00
99楼
请也给我发一份吧,十分谢谢
hjfsy@sohu.com

峰行天下

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 48回
  • 年度积分:0
  • 历史总积分:133
  • 注册:2005年12月15日
发表于:2006-03-12 16:28:00
100楼
你好,劳请也给我发一封
kingfun2008@yahoo.com.cn
谢谢

热门招聘
相关主题

官方公众号

智造工程师