历史上的今天
返回首页

历史上的今天

今天是:2025年03月01日(星期六)

2018年03月01日 | AT90CAN的CAN通信模块驱动设计及C编程

2018-03-01 来源:eefocus

  CAN 总线 通信较之一般的通信总线而言,其数据通信具有突出的可靠性、实时性和灵活性,应用范围也早已不再局限于汽车行业,而是扩展到了机器人、数控机床、家用电器等领域。CAN控制器用来实现统一的CAN通信协议。CAN控制器分为两种: 一种是独立的控制 芯片 ,如SJA1100;另一种是将其集成在 微控制器 内部,例如 Atmel 公司最新推出的AT90CAN系列 单片机 。与使用独立的CAN控制器相比,自身集成了CAN 接口 的微控制器在简化硬件 电路 设计的同时,提高了软件开发的效率。

 

  1  AT90CAN单片机CAN控制器特性

  AT90CAN单片机的CAN控制器能够兼容CAN2.0A和CAN2.0B通信协议,内部设有120字节的邮箱空间,它由15个MOB(Message Object)与CAN DATA BUFFER组成。MOB用来描述一帧完整的CAN报文信息,每个MOB拥有独立的工作寄存器组(详见参考文献\[1\]),这些寄存器规定了CAN通信报文的帧格式与工作模式。CAN通用控制寄存器里的CANPAGE寄存器为15个MOB规定了相对应的BUFFER地址和指针,用来存放通信时发出或接收到的数据以及保存MOB寄存器组的设置。对MOB的寄存器组进行初始化设置后,CAN控制器根据MOB的不同设置,就可以分别实现数据的发送、接收以及过滤功能,整个工作过程不需要 CPU 干预,简化了软件代码的编写。而CPU通过访问CAN控制器状态寄存器或者由CAN控制器以中断的方式通知CPU,即可得到当前通信状态,从而大大节省了CPU的占用时间。

  2  CAN控制器的初始化

  要实现CAN通信,首先要对CAN控制器进行正确的初始化设置。初始化过程包括对CPU的引脚功能、CAN通信波特率、中断优先级和MOB寄存器的设置等。在编写驱动的过程中,需要注意的是在完成对CANPAGE寄存器的设置后,再进行MOB的设置;否则,MOB的初始值将不能被保存,导致系统初始化失败。

  其基本初始化流程如图1所示。其中阴影部分是必须初始化的部分,其他部分可以根据实际程序功能的需要予以设置。


  图1  CAN控制器初始化流程

  CAN控制器初始化程序:

  #define CAN_PORT_INPIND

  #define CAN_PORT_DIR DDR D

  #define CAN_PORT_OUT PORTD

  #define CAN_INPUT_PIN6

  #define CAN_OUTPUT_PIN5

  void CAN_INIT() {

  CAN_PORT_DIR &= ~(1<

  CAN_PORT_DIR &= ~(1<

  CAN_PORT_OUT |=(1<

  CAN_PORT_OUT |=(1<

  CANTCON=0x00;//CAN时钟寄存器清零

  CANGCON |= 0x01;//软件复位

  CANBT1=0x06;

  CANBT2=0x2a;

  CANBT3=0x13;//设置通信波特率为250kbps

  CANIE2 |= 0x60;//使能MOB5、MOB6

  CANIE1 |= 0x01;//使能MOB0

  CANGIE = 0xA0; //使能CAN中断

  CANGCON |= 0x02;//CAN控制器启动

  }

  3  AT90CAN单片机与PC机CAN通信实例

  下面以如何实现AT90CAN单片机与PC机间的CAN通信为例,进一步说明AT90CAN单片机的CAN功能模块驱动的编制流程,如图2所示,并给出C语言编写的CAN通信程序。它的功能是接收PC机经由专用的 PCI CAN模块扩展的CAN接口发出的数据,并将收到的数据与验收过滤器寄存器中设定的ID值比较。如果ID值相符,则将数据重新编制ID后发给PC机。


  图2  与PC机CAN通信软件流程

  以下程序已在实验中调试通过,通信效果良好,可以直接应用。

  #include "ioCAN128v.h"

  #include

  #include

  #define fosc 11059200// 晶振 11.0592 MHz

  unsigned char PCSJ\[8\]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//数组用来存放接收到的数据

  void main() {//主程序

  CLI();//关总中断

  void CAN_INIT();//CAN控制器初始化

  CANPAGE = 0x50;//设置MOB5

  CANSTMOB=0x00;//清状态寄存器

  CANIDT1 = 0x02;//CANIDT1~CANIDT4

  CANIDT2 = 0x01;//设置ID过滤寄存器

  CANIDT3 = 0x00;

  CANIDT4 = 0x00;

  CANIDM1 = 0xff;//CANIDM1~CANIDM4

  CANIDM2 = 0xff;//设置验收寄存器

  CANIDM3 = 0x00;

  CANIDM4 = 0x00;

  CANCDMOB = 0x98;//使能接收

  SEI();//打开总中断

  while(1) {

  CANPAGE=0x10;//设置MOB4

  CANSTMOB=0x00;

  CANIDT1 = 0x01;//CANIDT1~CANIDT4

  CANIDT2 = 0x01;//设置发送帧ID值寄存器

  CANIDT3 = 0x00;

  CANIDT4 = 0x00;

  for(i = 0;i<8;i++) {

  CANMSG=PCSJ[i]; //将接收到的数据发送回上位机

  }

  CANCDMOB=0x58;//使能发送

  CANSTMOB&=~(1<

  wait(2);

  }

  }

  实例中数据接收由MOB5产生中断完成,中断服务子程序如下:

  #pragma interrupt_handler can_isr:19//CAN控制器中断向量入口

  void can_isr(void) {

  if ((CANSIT2 & 0x20)==0x20) {//判断是否是MOB5产生中断

  CANPAGE=0x50;

  for(i = 0; i < 8; i++) {

  PCSJ[i] =CANMSG;

  }

  CANSTMOB = 0x00; //清状态位

  CANCDMOB = 0x98;//重新使能接收功能

  }

  }

  4  结论

  AVR系列单片机内部有可编程的 Flash ,自带 EEPROM ,支持 JTAG 接口片内调试和对Flash、EEPROM、熔丝位和锁定位的编程,因此成为众多单片 机芯 片的首选。其内部集成了独立CAN控制器的AT90CAN系列单片机,弥补了单片机在CAN总线通信应用中的缺陷,不必再扩展外围的CAN通信 控制芯片 ,简化了硬件电路设计。本文通过对AT90CAN系列单片机CAN 通信模块 的详细介绍,旨在说明如何对其进行编程实现CAN通信功能,为使用单片机进行CAN通信的初学者提供了编程参考。


推荐阅读

史海拾趣

CANDD公司的发展小趣事

在快速发展的过程中,CANDD公司始终注重企业文化的建设。公司倡导创新、协作、诚信和担当的核心价值观,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的培训和成长,为员工提供了广阔的职业发展空间。这些举措不仅激发了员工的工作热情,还为公司培养了一批忠诚、有能力的员工队伍。在企业文化的引领下,CANDD公司不断向前发展,成为了电子行业的佼佼者。

这些故事虽然基于虚构的CANDD公司,但它们所反映的电子行业发展趋势和企业管理理念是真实存在的。通过这些故事,我们可以更好地理解电子行业的发展历程和未来趋势。

Chicago Miniature公司的发展小趣事

为了满足不同客户的需求,CML不断扩展产品线,从最初的光电子产品逐渐拓展到显示器、开关、继电器等多个领域。通过多样化的产品策略,公司成功吸引了更多客户,并扩大了市场份额。同时,CML还积极开拓国际市场,将产品出口到全球多个国家和地区,进一步提升了公司的知名度和影响力。

Defense Supply Center Columbus公司的发展小趣事

在电子行业,供应链管理对于企业的运营效率至关重要。Defense Supply Center Columbus公司深知这一点,不断优化供应链管理流程。公司建立起一套高效的供应链管理系统,实现了从原材料采购、生产制造到产品销售的全程监控和管理。同时,公司还与供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。这些措施的实施,使得公司的运营效率得到了显著提升,降低了运营成本,提高了企业的竞争力。

American Power Management Inc公司的发展小趣事

为了进一步提升竞争力,APMI开始实施国际化发展战略。公司积极开拓海外市场,与国际知名电子制造商建立合作关系。同时,APMI还加强了与国际同行的技术交流与合作,吸收借鉴先进的管理经验和技术成果。通过国际化发展,APMI不仅拓宽了市场渠道,还提升了公司的国际影响力。

DUCATI公司的发展小趣事

随着技术的成熟,APMI开始着手市场拓展。公司积极与各大电子制造商合作,为其提供定制的电源管理解决方案。同时,APMI还加大了品牌宣传力度,通过参加行业展会、发布技术白皮书等方式,提高品牌知名度和影响力。凭借卓越的产品性能和完善的售后服务,APMI在市场上赢得了良好的口碑,客户群体不断扩大。

Electric Imp Inc.公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Electric Imp Inc.公司始终保持着敏锐的市场洞察力和持续的创新精神。公司不断推出新产品、新技术,以满足不同客户的需求。同时,公司还加强了内部管理和团队建设,提高了员工的专业素质和工作效率。这些努力使得公司能够保持持续的发展态势,并在电子行业中保持领先地位。

问答坊 | AI 解惑

单片机课件++++北航的

单片机课件++++北航的 很不错啊,真实体会!…

查看全部问答>

SD卡读EBOOT.BIN

本来有个2440的源码可以改的,以为SD卡部分可以不用改,轻松了.结果发现2440和我的2416在SD卡支持方面差别比较大. 大家帮忙讲讲SD卡读写方面的知识(SD设备,不是SPI也不是MMC).就当是复习吧,也可以告诉我哪有SD卡方面的资料看,这些资料网上比较少.…

查看全部问答>

16*16点阵屏的程序问题

求教: 本人做了一个16*16的LED屏,它是由89C52+74HC154控制 P0和P2口控制行(LED的阳级) P1口连接74HC154控制列(LED阴级) 现在问题是输出的字是看不懂,求高手指点. uchar code hanzi[]={ 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x ...…

查看全部问答>

关于RIL_Initialize的回调函数

hrRilInit   =  RIL_Initialize(1,                               FDNResultCallback,        ...…

查看全部问答>

有谁能改海王无线网卡的MAC地址

有谁能改海王无线网卡的MAC地址…

查看全部问答>

QQ硬电话

看到SKYPE有硬电话,就想QQ硬电话应该也蛮有市场的,就没看到腾有动作。谁有这方面的研究啊?…

查看全部问答>

LM2596-12制作-12v电源

我用了LM2596-12做一个-12v电源,芯片发热严重,输出端只有零点几负,问题出生什么地方?…

查看全部问答>

数码管显示闪烁

#include unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; void delay(unsigned int n) {   unsigned int i,j;   for(i=n;i>0;i--)    for(j=30;j>0;j--);   ...…

查看全部问答>

MSP430 Boot memory的疑惑?

想请教大神,MSP430 存储器有boot memory :地址0xc000h ~ 0x0fffh, 这段memory用户可以进行读写么?…

查看全部问答>