can(controller area network)即控制器局域网,由于具有高性能、高可靠性以及简单的网络结构,在工业系统中越来越受到人们的重视,并迅速成为了目前国际上应用最广泛的现场总线之一。
英创提供的em9000系列arm9嵌入式主板,包括em9000、em9260、em9360等多种型号,都预装了正版wince操作系统,且带有标准can通讯接口。与板上其他标准通讯接口一样,英创公司为所有em9000系列嵌入式主板的can接口配置了标准的wince流式驱动程序,应用程序可以通过打开文件的进行读写的标准方式实现对can总线接口的数据通讯。本文侧重于介绍can通讯接口,下面以em9000嵌入式主板为例,介绍如何利用英创的arm9嵌入式主板快速构建双can接口的方案。
硬件组成
英创提供的系列arm9嵌入式主板,除em9160嵌入式主板外,所有的arm9主板上均可直接支持一个can接口。eta701是英创公司提供的基于isa总线扩展的一个can模块,可以通过isa总线外接一个eta701模块,即可构成一个双can系统。
em9000嵌入式主板和eta701模块提供的can均采用了philips半导体公司的sja1000t can总线控制器,sja1000是一款独立的控制器,主要用于汽车和一般工业环境中的控制器局域网络(can)芯片。它是philips半导体pca82c200 can控制器(basiccan)的替代产品,而且它增加了一种新的工作模式(pelican),这种模式支持具有很多新特性的can 2.0b协议。
em9000嵌入式主板和eta701模块的can通讯接口可提供高达1mbps的数据传输速率,当采用5kbps的的数据传输速率时其通讯距离最高可达到10km。硬件的错误检定特性也增强了can的抗电磁干扰能力,这给数据的远程可靠传输提供了有利保证。
在em9000嵌入式主板和eta701模块的can通讯接口根据用户的需要分为两种:一种带光电隔离,一种不带光电隔离。带光电隔离can总线通讯模块的can收发器端的所有信号和电源与其它部分完全隔离,可承受至少1kv(有效值)的电压冲击。
can接口驱动函数
一、can报文的帧格式
在can2.0b中存在两种不同的帧格式,其主要的区别在于标识符的长度,具有11位标识符的帧称为标准帧,而包括有29位标识符的帧称为扩展帧。下面分别介绍数据帧的格式。
1、can2.0b标准帧
can标准帧信息为11个字节,包括两部分:信息和数据部分。前3个字节为信息部分,如图所示:
注:
1、字节1为帧信息。d7位表示帧格式,在标准帧中,ff=0;d6位表示帧的类型,rtr=0表示为数据帧,rtr=1表示为远程帧,在一般的数据通讯中,只使用数据帧;dlc表示数据帧实际的数据长度。
2、字节2、字节3为报文识别码,11位有效。
3、字节4~字节11为数据帧的实际数据,远程帧时无效。
2、can2.0b扩展帧
can标准帧信息为13个字节,包括两部分:信息和数据部分。前5个字节为信息部分,如图所示:
注:
1、字节1为帧信息。d7位表示帧格式,在扩展帧中,ff=1;d6位表示帧的类型,rtr=0表示为数据帧,rtr=1表示为远程帧;dlc表示数据帧实际的数据长度。
2、字节2~字节5为报文识别码,29位有效。
3、字节6~字节13为数据帧的实际数据,远程帧时无效。
二、启动can通讯接口
英创公司提供的can通讯接口的驱动程序采用的是wince下流式驱动程序(stream device driver),并在此驱动程序的基础上为客户封装了一套简单实用的api函数。各个函数的定义在can_api.h文件下,在该头文件中对于各个api函数均有相应的中文说明。
作为流式接口函数通常和文件系统的api函数(如createfile)紧密匹配的,因此在使用英创提供的can接口的api函数时,首先需要调用createfile(…)来获取can接口设备的句柄handle,如使用can1通讯口,可以调用以下函数:
m_hcan=createfile(_t(“can1:”), generic_read|generic_write, 0,null, open_existing, 0, null);
对于can2通讯接口,只需将其中的名称换成 _t(“can2:”)即可。在创建can设备得到有效的handle之后,就可以调用can_api.h中定义的相应函数来启动can设备接口。
bool can_startchip (handle hdevice);
至此can通讯接口进入工作模式。
三、设置can通讯接口参数
在进行can数据通讯之前,需要设置和can通讯相关的一些参数,包括can通讯的波特率设置以及对接收过滤器的设置。
bool can_setbaudrate(handle hdevice, byte *index);
// 用于设置can通讯的波特率,波特率的设置范围包括:10kbps~1mbps。具体的定义请参见can_api.h文件中的注释说明
通过配置接收过滤器,can通讯接口可以实现只接收标识符也接收过滤器预设值相一致的报文。接收过滤器由接收码寄存器acrn和接收屏蔽码寄存器amrn来定义的,还可以选择两种不同的过滤器模式,单过滤器模式或者双过滤器模式。关于acr、amr中各位的定义,请参见sja1000的数据手册,这里就不再赘述。在英创提供的api函数中,用户可以调用以下函数来实现接收过滤器的设置:
bool can_setglobalacceptancefilter( handle hdevice, byte *acceptancefilter, byte size)
四、can通讯接口的数据收发
在英创公司提供的双can方案中,can通讯的数据收发均采用的中断方式,驱动程序中已自动完成了数据的收发,以及内部定义的can接收缓冲区和发送缓冲区的管理。对于用户开发应用程序来说,只需要调用英创公司提供的can通讯api函数中的收发函数即可。下图为can驱动程序的数据流和事件的关系图。
在进行can通讯应用程序的开发时,对于can通讯数据接收线程可以采用两种方式:一种可以采用定时查询,即定时调用函数can_getnextreceivedframe( …)检测是否有接收到can报文数据;一种可以利用操作系统的消息机制,采用事件响应的方式,一旦硬件接收的数据报文,底层的驱动接收程序会自动读取报文,同时发送一个接收事件。作为应用程序的接收线程在等待到该事件后,调用can_getnextreceivedframe(…)即可进行can数据报文的读取。需要注意的是函数can_getnextreceivedframe每执行一次,只是读取了一帧can数据报文,如果在应用程序中需要将最新的数据全部读出,只需反复调用该函数,直到该函数的返回值为false。
接收线程部分代码:
dword cem9000_can::readthreadfunc( lpvoid lparam )
{
cem9000_can *cecan = (cem9000_can*)lparam;
bool bresult;
while( 1 )
{
if(waitforsingleobject(cecan->m_hreadcloseevent,0 )==wait_object_0 )
{
break;
}
// 等待接收事件触发,使用以下代码
waitforsingleobject( cecan->m_hrxevent, infinite );
// 若采用定时查询,则调用sleep(..)即可,sleep的时间由应用程序确定
// sleep( 50 );
cecan->m_nrxcounter = 0;
for( ; ; )
{
// 读取已接收的所有数据帧
bresult=can_getnextreceivedframe(cecan->m_hcan,
&cecan->rxmframe[cecan->m_nrxcounter] );
if( !bresult )
{
break;
}
cecan->m_nrxcounter++;
}
if(cecan->m_nrxcounter>0 )
{
// 调用回调函数,进行必要的数据处理
cecan->onread( cecan->m_pcanowner );
}
}
return 0;
}
can数据报文的发送比较简单,应用程序直接调用函数can_sendframe(…)即可。
英创公司针对can总线的应用提供图形化的测试程序,用户可以直接利用该程序进行can接口通讯基本收发测试。em9000下的测试界面如下图所示:
ADI宽带RFIC实现重大技术突破,大大简化设计
努比亚Z17、小米6对比评测:同是骁龙835价格又相近的努比亚Z17京东已有现货,小米6却还要抢购,米粉们的心酸!
24位ADC在热电偶测温中的应用
Arm 扩大开源合作伙伴关系,加强投入开放协作
苹果本周发布新品,市值突破1万亿美元
如何利用英创ARM9嵌入式主板快速构建双CAN接口的方案
雷达物位计使用注意事项及安装检查方法详解
AMD桌面与服务器处理器夺得2023年度五大奖项
按钮怎样与树莓派连接
提供稳定的电压触摸检测芯片VKD233HR资料
电视背光、显示屏等订单需求上涨,晶圆下半年液晶有望回温
王源《看不见的TA》首播化身OPPOR11王源限量版
数字货币资金盘的Plustoken钱包事件究竟是怎么回事
冬季高压输电线路导线覆冰如何监测?
E资讯:OPPO未来科技大会连续两天,新品可不仅是Find N2
国产功率半导体芯片亟待突破
量化自动机器人是什么
教你解决PLC控制系统抗干扰方法,拿去不谢
电动汽车动力系统工作原理及解决方案
荣耀副总裁谈手机拍照,只看像素是片面的