基于MC9S12X的CAN 通讯的底层代码设计
2015-01-03蔡花朱宏翔
蔡花,朱宏翔
(西安兰德新能源汽车技术开发有限公司,陕西 西安 710043)
基于MC9S12X的CAN 通讯的底层代码设计
蔡花,朱宏翔
(西安兰德新能源汽车技术开发有限公司,陕西 西安 710043)
CAN 总线因其高实时性能、高可靠性、稳定的传输性能、高抗电磁干扰性,使得它在汽车业中应用非常普遍。MC9S12X是一款高性能的16位处理器,可作为整车控制器的MCU,带有5个CAN通讯模块,可实现多路CAN 通讯。论文给出了CAN底层代码的设计方法,并验证了代码,实现了MC9S12X与CAN助手之间的通讯,具有一定的实用价值。
MC9S12X;CAN通讯
CLC NO.: U462.1 Document Code: A Article ID: 1671-7988(2015)01-04-03
引言
MC9S12X单片机具有丰富的I/O模块和工业控制专用的通信模块,采用5V供电,总线速度可达40MHz,非常适合应用在汽车业中。在汽车级的控制器中,CAN总线是汽车各个控制单元之间联系的纽带,是实现数据交互的媒介,它的可靠运行是汽车正常行驶的前提。在选择控制芯片时,芯片具有的CAN 模块个数是一个重要的考虑因素,MC9S12X芯片带有5个CAN模块,满足多路CAN通讯的需求。
CAN通讯的实现是建立在软硬件基础上,硬件电路实现电气连接,软件部分驱动硬件工作,二者缺一不可。本文论述CAN通讯的软件实现,建立在具有CAN功能的MC9S12X芯片 和CAN收发器这两个硬件基础,实现MC9S12X 与CAN总线的通信,完成数据交互。
1、软件设计方案
软件设计主要是数据结构的设计和函数接口设计这两个方面。
CAN 通讯的实现需要三个函数完成:初始化函数、发送函数和接收函数。
程序代码用C 语言编写,使用的CAN控制器支持CAN2.0B通讯协议,可以实现标准帧和扩展帧两种类型的数据传输。
1.1 数据结构设计
(1)初始化数据结构设计:CAN 口初始化数据结构设计
其中BaudRateKb指CAN的工作频率,以Kb/S为单位,CanNum指CAN口编号。
(2)CAN报文数据结构设计:发送/收报文数据类型的设计
1.2 初始化函数设计
初始化函数接口:
该函数包含一个参数 *Config 结构体指针。结构体包含两个成员:BaudRateKb和CanNum。
初始化函数用来完成CAN模块的选择(即指定由哪一个CAN模块实现报文的发送或者接收),设置CAN通讯的波特率,以及设置模块的时钟源。MC9S12X的CAN有两种时钟源可选择,一个是板级晶振时钟,另一个是总线时钟,由于CAN通讯对总线传输速率的稳定性要求较高,所以在实际应用中,选择晶振时钟作为时钟源。
初始化函数流程如下图:
1.3 发送函数设计
发送函数接口:
该函数包含2个参数,其中一个是CAN模块的编号,另一个是指向CAN报文的数据类型的一个指针。
参数num是用来发送CAN报文的CAN模块号。*msg指针指向CAN报文数据结构,该结构包含5个成员。成员如下所述:
Extended参数是用来区分ID 类型,该参数取零值,表示ID是11位的;该参数取1,表示的是扩展ID(29位)。
Length参数用来设置发送数据的字节数,取值范围0~8。
Remote参数用设置报文是远程帧还是数据帧。
ID参数用来设置ID标识符。
Data[8]是存放数据的数组。
该函数的返回值是一个Can_ReturnType类型的值(0或1),表示总线正常或者不正常。
CAN发送函数的功能是实现报文发送,包括设置报文的类型(即数据帧或者远程请求帧等),ID 类型(标准帧或者扩展帧),发送数据的长度(以字节为单位),以及发送的数据。
发送函数流程图如下:
1.4 接收函数设计
接收函数接口:
该函数包含2个参数,其中一个是CAN模块的编号,另一个是CAN报文数据类型的一个指针。
该函数的返回值是一个Can_ReturnType类型的值(0或1),表示接收是否完成。
CAN 接收函数的功能是接收其他控制设备发送到CAN总线上的数据。
接收函数流程图如下:
2、软件实现比较
主要针对接收功能,发送数据时,两者的差异不明显。接收数据时,两者的差异较大。
差异一:
(1)初始化函数设计中,查询方式接收不要求使能接收中断使能位,接收完成标志位是在接收函数中清除的。
(2)中断接收时,初始化函数中必须使能中断使能位,接收完成标志位在中断函数中清除。
差异二:
查询方式接收时,整个过程中CPU一直查询CANRFLG_进制RFG状态,只有当它为1时,才接收数据,否则不接收。在这个过程中CPU不能做其他的事情,一直处于检测CANRFLG_RFG的状态,这样会造成代码运行效率低和CPU的浪费。
中断方式接收时,一旦中断标志位置1,CPU就转到中断函数去处理数据,当数据处理完成,CPU会转向原来的任务继续执行,这种方式不会造成CPU的浪费,提高了CPU的使用率。
3、软件验证
在CodeWarriorv5.1中编译和运行代码,通过CAN助手发送8字节数据(0x01,0x02,0x03, 0x55,0x05,0x06,0x07,0x08)到CAN总线,MC9S12X对数据处理 (扩大两倍) 之后再发送给CAN助手。试验结果如下图:
上图所用的接收方式是中断方式。
4、结论
代码设计和测试结果相一致,并且在MC9S12X上运行稳定,实现了CAN通讯功能。函数接口设计采用结构体指针方式,保证了函数接口的一致性,可移植性强。即使后期需要添加或者删除结构体成员时,也不会影响其他函数对此函数的调用,保证了接口的统一性。
[1] 孙同景,陈桂友.Freescale 9S12十六位单片机原理及嵌入式开发技术[M].北京:机械工业出版社,2008.5:(8-15),61.
Design of CAN communication underlying code based on MC9S12X
Cai Hua, Zhu Hongxiang
(Xi'an Lande New Energy Vehicle Technology Development CO., Ltd., Shaanxi Xi'an 710043)
CAN bus is very widely apply in automobile industry, which is because of its high real-time performance, high reliability, stable performance, high resistance to electromagnetic interference.MC9S12X is a 16-bit high performance processor of Freescale, can be used as a vehicle controller MCU, with five CAN communication modules, can realize multi CAN communication. This paper presents the design method of the underlying code, and verifies the code, realize the communication between the MC9S12X and CAN assistant, which has a certain practical value.
MC9S12X;CAN communication
U462.1
A
1671-7988(2015)01-04-03
蔡花,就职于西安兰德新能源汽车技术开发有限公司。