基于ATmega128的CAN_NODE总线驱动程序设计
摘要:CAN_NODE实验板是一款功能强大的8位AVR单片机实验板,采用的是基于AVR RISC结构的8位低功耗CMOS微处理器ATmega128。该文简要阐述了现场总线技术的概况、CAN_NODE实验板硬件结构和ATmega128的特点,着重介绍了基于该实验板的CAN总线驱动程序。
关键词:CAN_NODE实验板;ATmega128;CAN总线驱动程序
中图分类号:TP305文献标识码:B 文章编号:1009-3044(2011)16-3952-03
CAN_NODE Bus Drivers Design Based on Atmega128
LIU Bin, LIU Jun-liang, MA Jin-bo, WANG Jun-qing
(2332 Laboratory, College of Engineering, Ocean University of China, Qingdao 266100, China)
Abstract: CAN_NODE is a powerful 8-bit AVR microcontroller experiment board, it is based on AVR RISC structure 8-bit low-power CMOS microprocessor ATmega128. This paper briefly expounds the profile of the fieldbus technology, hardware structure of CAN_NODE experimental board and characteristic of ATmega128, then the CAN bus drivers based on the experimental board is focused on.
Key words: CAN_NODE experiment board; ATmega128; CAN bus drivers
1 概述
现场总线(Fieldbus)技术是当前自动化技术的热点之一。现场总线技术集先进的嵌入式系统、现代通信、自控理论、网络技术于一身,充分体现出先进技术的进步能够为人类带来的便利。
CAN:全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络,比如,发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。
AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。
2 CAN_NODE实验板硬件结构
CAN_NODE实验板上提供了CAN总线通讯所需要的硬件,和一些按键,LED,USB接口等常用的功能部件,还提供了为系统扩展而预留的扩展功能接口,也提供了SPI接口和JTAG接口以方便下载和调试。
2.1 CAN_NODE实验板功能框图
图1为系统结构框图。
2.2 ATmega128的特点
其先进的指令集以及单周期指令执行时间, 使得ATmega128 的数据吞吐率高达1 MIPS/MHz。同时ATmega128具有:128K 节的系统内可编程Flash(具有在写的过程中还可以读的能力,即RWW)、4K 字节的EEPROM、4K 字节的SRAM、53 个通用I/O 口线、32个通用工作寄存器、实时时钟RTC、4 个灵活的具有比较模式和PWM 功能的定时器/ 计数器(T/C)、两个USART、面向字节的两线接口TWI、8 通道10 位ADC(具有可选的可编程增益)、具有片内振荡器的可编程看门狗定时器、SPI 串行端口、与IEEE 1149.1 规范兼容的JTAG 测试接口(此接口同时还可以用于片上调试)。
3CAN总线驱动程序设计
软件开发采用的是ImageCraft公司开发的ICCAVR,软件的下载采用双龙ATMEL_ISP下载软件。ICCAVR是一种使用符合ANSI 标准的 C 语言来开发ATMEL公司生产的微控制器(MCU)程序的一个工具,它有以下几个主要特点:
1)ICCAVR 是一个综合了编辑器和工程管理器的集成工作环境(IDE),其可在Windows9X/NT下工作,源文件可被组织到工程中,文件的编译和工程的构筑也是在这个环境中完成。
2)编译错误显示在状态窗口中,并且当你用鼠标单击编译错误时,光标会自动跳转到编辑窗口中引起错误的那一行。这个工程管理器还能直接产生您希望得到的可以直接使用的INTELHEX 格式文件,INTEL HEX 格式文件可被大多数的编程器所支持,用于下载程序到芯片中去。
集成开发环境如图2所示。
CAN总线驱动程序主要包括四个部分:CAN控制器初始化、接收数据、发送数据和总线异常处理。
图3为主程序流程图。
主要程序设计如下所示:
3.1 初始化
Can控制器初始化的操作包括:中断控制,硬件使能,软件复位,工作模式等。
初始化程序如下
unsigned char can_state;
IOWR(CAN_IP_0_BASE,CAN_IER,0x00);//禁止中断
IOWR(CAN_IP_0_BASE,CAN_MOD,0x09);//进入复位模式,单验收滤波器
can_state=(unsigned char)IORD(CAN_IP_0_BASE,CAN_MOD);
while((can_state&0x01)==0x00)//检测是否进入复位模式
{
IOWR(CAN_IP_0_BASE,CAN_MOD,0x09);//进入复位模式,单验收滤波器
can_state=(unsigned char)IORD(CAN_IP_0_BASE,CAN_MOD);
}
IOWR(CAN_IP_0_BASE,CAN_CDR,0xC1);//peliCAN,禁止时钟输出,禁止TX1,RX1c8
IOWR(CAN_IP_0_BASE,CAN_ACR0,local_code1);//验收码1
IOWR(CAN_IP_0_BASE,CAN_ACR1,local_code2);//验收码2
IOWR(CAN_IP_0_BASE,CAN_ACR2,local_code3);//验收码3
IOWR(CAN_IP_0_BASE,CAN_ACR3,local_code4);//验收码4
IOWR(CAN_IP_0_BASE,CAN_AMR0,0xff);//屏蔽码1
IOWR(CAN_IP_0_BASE,CAN_AMR1,0xff);//屏蔽码2
IOWR(CAN_IP_0_BASE,CAN_AMR2,0xff);//屏蔽码3
IOWR(CAN_IP_0_BASE,CAN_AMR3,0xff);//屏蔽码4
IOWR(CAN_IP_0_BASE,CAN_BTR0,0x01);//同步跳转3个周期,系统时钟4倍周期
IOWR(CAN_IP_0_BASE,CAN_BTR1,0x1C);//采样点3,段一6,段二3
IOWR(CAN_IP_0_BASE,CAN_OCR,0x1A);//控制寄存器
IOWR(CAN_IP_0_BASE,CAN_MOD,0x08);//进入工作模式,单验收滤波器
can_state=(unsigned char)IORD(CAN_IP_0_BASE,CAN_MOD);
while((can_state&0x01)==0x01)//检测是否进入复位模式
{
IOWR(CAN_IP_0_BASE,CAN_MOD,0x08);//进入工作模式,单验收滤波器
can_state=(unsigned char)IORD(CAN_IP_0_BASE,CAN_MOD);
}
IOWR(CAN_IP_0_BASE,CAN_IER,0x01);//开接收中断
}
CAN是一种基于广播的通讯机制,广播通讯依靠报文(Message)的传送机制来实现,因此CAN并未定义站及站地址,而仅仅定义了报文,这些报文依靠报文确认区(Identifier)来进行识别,一个消息报文确认区在一个网络中必须是唯一的,它不但描述了某一报文的意义,而且还定义了报文的优先级,当很多站都在访问总线时,优先级是很重要的,因此,CAN是通过报文的确认区来决定报文的优先级的。
CAN节点之间的数据传输采用的协议是报文格式,其29位的帧标识符和报文数据部分的规定如图4所示。
3.2 数据接收
接收数据可以采用查询方式或中断方式。在某一段时间内CAN总线并不是总在活动,为了提高效率,可采用中断方式。
程序如下:
alt_u8 can_irq_reg;
//can_irq_reg=IORD(CAN_IP_0_BASE,CAN_IR);
//if ((can_irq_reg & 0x01)==1)
{
can_rx_reg[0]=IORD(CAN_IP_0_BASE,CAN_TX_SFF_EFF_H);//发送帧
can_rx_reg[1]=IORD(CAN_IP_0_BASE,CAN_TX_SFF_EFF_C1);//验收码1
can_rx_reg[2]=IORD(CAN_IP_0_BASE,CAN_TX_SFF_EFF_C2);//验收码2
can_rx_reg[3]=IORD(CAN_IP_0_BASE,CAN_TX_EFF_C3);//验收码3
can_rx_reg[4]=IORD(CAN_IP_0_BASE,CAN_TX_EFF_C4);//验收码4
can_rx_reg[5]=IORD(CAN_IP_0_BASE,21);
can_rx_reg[6]=IORD(CAN_IP_0_BASE,22);
can_rx_reg[7]=IORD(CAN_IP_0_BASE,23);
can_rx_reg[8]=IORD(CAN_IP_0_BASE,24);
can_rx_reg[9]=IORD(CAN_IP_0_BASE,25);
can_rx_reg[10]=IORD(CAN_IP_0_BASE,26);
can_rx_reg[11]=IORD(CAN_IP_0_BASE,27);
can_rx_reg[12]=IORD(CAN_IP_0_BASE,28);
}
can_rx_flag=1;
IOWR(CAN_IP_0_BASE,CAN_CMR,0X04);//释放接收缓冲区
can_irq_reg=IORD(CAN_IP_0_BASE,CAN_IR);
while ((can_irq_reg & 0x01 )==0x01)
{
IOWR(CAN_IP_0_BASE,CAN_CMR,0X04);
can_irq_reg=IORD(CAN_IP_0_BASE,CAN_IR);
}
3.3 数据发送
将待发送的数据打包成符合CAN协议的帧格式后,写入发送缓冲区,然后发送。
程序如下所示:
if(can_rx_flag==1)
{
can_tx_count=0;
can_rx_flag=0;
//IOWR(CAN_IP_0_BASE,21,0x55);
//IOWR(CAN_IP_0_BASE,21,0xaa);
//data_reg=IORD(CAN_IP_0_BASE,21);
IOWR(CAN_IP_0_BASE,CAN_TX_SFF_EFF_H,0x88);//发送帧
IOWR(CAN_IP_0_BASE,CAN_TX_SFF_EFF_C1,local_code1);//验收码1
IOWR(CAN_IP_0_BASE,CAN_TX_SFF_EFF_C2,local_code2);//验收码2
IOWR(CAN_IP_0_BASE,CAN_TX_EFF_C3,local_code3);//验收码3
IOWR(CAN_IP_0_BASE,CAN_TX_EFF_C4,local_code4);//验收码4
IOWR(CAN_IP_0_BASE,21,can_rx_reg[5]);//数据
IOWR(CAN_IP_0_BASE,22,can_rx_reg[6]);//数据
IOWR(CAN_IP_0_BASE,23,can_rx_reg[7]);//数据
IOWR(CAN_IP_0_BASE,24,can_rx_reg[8]);//数据
IOWR(CAN_IP_0_BASE,25,can_rx_reg[9]);//数据
IOWR(CAN_IP_0_BASE,26,can_rx_reg[10]);//数据
IOWR(CAN_IP_0_BASE,27,can_rx_reg[11]);//数据
IOWR(CAN_IP_0_BASE,28,can_rx_reg[12]);//数据
IOWR(CAN_IP_0_BASE,CAN_CMR,0x01);//发送
}
3.4 异常情况处理
总线发生故障时,下行的CAN节点可能脱离总线。可通过读取错误计数器对计数器递减计数的情况进行监测并作相应处理。若前面传输到CAN控制器的数据未被读出,而接收缓冲区又没有及时释放,就有可能引起后面信息的丢失。这时必须通过写命令寄存器来清除CANSR的数据溢出位。这两种异常可通过异常中断来处理,只要在中断子程序中加入处理代码即可。其他的总线异常处理可根据使用情况决定是否在软件中处理。
4 结束语
本设计对CAN模块软硬件结构及ATmega128的特点进行简要的描述,主要对基于ATmega128单片机的CAN_NODE总线驱动程序的进行设计。现场总线技术以其独有的技术优势和特点,在现代分布式测量与控制技术领域中应用已愈来愈广泛。各种现场总线的主控制器一般都内嵌有相当完善的、开放式的互联通信协议,它具有通信速度快、误码率低、开发设计简单及网络使用维护方便等诸多特点,是实现网络化现场测量与控制技术的一个发展方向。
参考文献:
[1] 周立功.iCAN现场总线原理与应用[M].北京:北京航空航天大学,2007.
[2] 范伟成.基于ATmegal28单片机的CAN总线接口设计及应用[M].上海:上海齐耀动力技术有限公司,2008.
[3] 刘滨.基于单片机的CAN_NODE的设计与实现[M].青岛:中国海洋大学,2011.
[4] 周立功.ARM与嵌入式系统基础编程[M].广州:周立功单片机发展有限公司,2004.
[5] 邬宽明.CAN总线原理和应用系统设计[M].北京:北京航空航天大学出版社,2002:240-257.
上一篇:视频采集系统基础理论研究