0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术SJA1000的CAN通讯接口函数介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-14 15:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

英创ARM9系列嵌入式主板一大特色就是提供了CAN接口,并实现了相应的驱动程序,用户只需直接调用CAN_API函数即可实现CAN数据报文的通讯操作。目前EM9000以及EM9X60系列板卡所提供的CAN接口均是采用的是SJA1000 CAN总线控制器,SJA1000是一款独立的控制器,主要用于汽车和一般工业环境中的控制器局域网络(CAN)芯片。CAN通讯接口可提供高达1Mbps的数据传输速率,当采用5Kbps的的数据传输速率时其通讯距离最高可达到10KM。硬件的错误检定特性也增强了CAN的抗电磁干扰能力,这给数据的远程可靠传输提供了有利保证。

硬件上来说,英创提供的CAN通讯接口根据用户的需要分为两种:一种带光电隔离,一种不带光电隔离。带光电隔离CAN总线通讯模块的CAN收发器端的所有信号电源与其它部分完全隔离,可承受至少1Kv(有效值)的电压冲击。

软件上英创出厂的带有CAN通讯接口的ARM9板卡均带有相应的驱动,基于WinCE系统配置了标准的WinCE流式驱动程序,基于Linux系统是将CAN接口配置为字符设备驱动程序。CAN通讯的数据收发均采用的中断方式,驱动程序中已自动完成了数据的收发,以及内部定义的CAN接收缓冲区和发送缓冲区的管理。

接收缓冲区

发送缓冲区

WinCE

64k

4k

Linux

64k

4k

为了方便用户的使用,在CAN驱动程序的基础上为客户封装了一套简单实用的API函数。各个函数的定义在can_api.h文件下,在该头文件中对于各个API函数均有相应的中文说明。本文将详细介绍各个接口函数的使用。

1、CAN接口API函数定义
英创公司提供的CAN通讯接口的驱动程序采用标准的驱动程序,用户可以用标准的打开文件、关闭文件的方式,来打开该CAN设备。相关的一些函数定义如下:

/*
* 功能描述:设置CAN控制芯片为操作模式。
* 输入参数:
* fd: CAN设备文件描述符
* 返回值:
* 0: 成功
* <0: 失败
*/

int CAN_StartChip( int fd );

/*
* 功能描述:设置CAN控制芯片为复位模式。
* 输入参数:
* fd: CAN设备文件描述符
* 返回值:
* 0: 成功
* <0: 失败
*/

int CAN_StopChip( int fd );

/*
* 功能描述:设置CAN通讯的波特率
* 输入参数:
* fd: CAN设备文件描述符
* Baud: 枚举变量,分别对应不同的波特率
* CAN_BAUDRATE_10K = 0: 10Kbps
* CAN_BAUDRATE_20K = 1: 20Kbps
* CAN_BAUDRATE_50K = 2: 50Kbps
* CAN_BAUDRATE_100K = 3: 100Kbps
* CAN_BAUDRATE_125K = 4: 125Kbps
* CAN_BAUDRATE_250K = 5: 250Kbps
* CAN_BAUDRATE_500K = 6: 500Kbps
* CAN_BAUDRATE_1000K = 7: 1Mbps
* CAN_BAUDRATE_60K = 8: 60Kbps
* 返回值:
* 0: 成功
* <0: 失败
*/

int CAN_SetBaudRate( int fd , CAN_BAUDRATE Baud );

/*
* 功能描述:设置CAN通讯验收滤波器配置
* 输入参数:
* fd: CAN设备文件描述符
* *AcceptanceFilter: 验收滤波器结构指针
* struct accept_filter
* {
* unsigned int accept_code;
* unsigned int accept_mask;
* unsigned char filter_mode;
* };
* accept_code: 滤波器接收码
* accept_mask: 滤波器屏蔽码
* filter_mode: 0-双滤波器 1-单滤波器
*
* 返回值:
* 0: 成功
* <0: 失败
*/

int CAN_SetGlobalAcceptanceFilter( int fd , accept_filter *AcceptanceFilter );

/*
* 功能描述:用于启动或关闭CAN自检测模式
* 输入参数:
* fd: CAN设备文件描述符
* Mode: 1-启动自检测模式
* 0-关闭自检测模式,返回正常模式
* 返回值:
* 0: 成功
* <0: 失败
*/

int CAN_SelfTest( int fd , int Mode );

/*
* 功能描述:获取CAN通讯时的错误编码
* 输入参数:
* fd: CAN设备文件描述符
* 输出参数:
* *ErrorPtr:错误编码
* 返回值:
* 0: 成功
* <0: 失败
*/

int CAN_GetError( int fd , DWORD *ErrorPtr);

/*
* 功能描述:获取CAN通讯中相关统计数据以及CAN控制芯片的状态寄存器
* 输入参数:
* fd: CAN设备文件描述符
* 输出参数:
* *DriverStatistics:得到相应统计结构数据
* 返回值:
* 0: 成功
* <0: 失败
*/

int CAN_GetCANDriverStatistics( int fd , drv_statistics *DriverStatistics );

在can_api.h中还定义了一个CAN驱动的统计数据结构struct DRIVERSTATISTICS,这个结构中记录了CAN通讯的一些统计参数,包括CAN中断次数,CAN数据帧发送成功统计次数等等。这些参数可通过API函数中CAN_GetCANDriverStatistics来获取,这些参数可以作为分析CAN通讯的状态的一个重要参考。以下为这些参数的定义。

typedef struct
{
DWORD NumISTEvents; // CAN中断事件统计次数
DWORD NumRxDataFrameInt; // CAN数据帧接收中断统计次数
DWORD NumRxDataFramePutRing; // CAN接收数据帧放入接收环形数据
// BUF的统计次数
DWORD NumTxDataFramePutRing; // CAN发送数据帧放入发送环形数据
// BUF的统计次数
DWORD NumTxDataFrameInt; // CAN数据帧发送中断统计次数
DWORD NumTxSuccessful; // CAN数据帧发送成功统计次数
DWORD NumTxFailed; // CAN数据帧发送失败统计次数
DWORD NumErrorWarningInt; // CAN通讯错误报警中断的统计次数
DWORD NumErrorWarningLevel; // CAN通讯出错的统计次数,错误指至
// 少一个错误计数器满或由错误报警限
// 制寄存器(EWLR)定义的CPU报警
// 限制

DWORD NumErrorPassive; // CAN通讯中错误消极中断的统计次数
DWORD NumErrorBusOff; // CAN通讯错误中总线关闭错误的统计次数
DWORD NumSwitchedToNormalOperation; // CAN通讯中错误状态切换到正常
// 状态(总线开启)的统计次数
DWORD NumOverrunInt; // CAN通讯中数据溢出中断的统计次数
DWORD NumBusErrorInt; // CAN通讯中数据BUSOFF错误中断的统计次数
DWORD NumArbitrationLostInt; // CAN通讯中仲裁丢失中断的统计次数
DWORD MaxNumMsgsInRing; // CAN通讯中接收数据帧的数目
DWORD RXErrorCounter; // 读取CAN通讯芯片中RX错误计数器的值
DWORD TXErrorCounter; // 读取CAN通讯芯片中TX错误计数器的值
DWORD Status; // 读取CAN通讯芯片中状态寄存器的值
}DRIVERSTATISTICS;

2、CAN数据的接收和发送
在WinCE下,作为流式接口函数通常和文件系统的API函数(如CreateFile)紧密匹配的,因此在使用英创提供的CAN接口的API函数时,首先需要调用CreateFile(…)来获取CAN接口设备的句柄handle,如使用CAN1通讯口,可以调用以下函数:
m_hCAN=CreateFile(_T(“CAN1:”), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

在Linux下,调用的方式如下:

m_fd=open('/dev/em9x60_can1',O_RDWR | O_NOBLOCK );

在创建CAN设备得到有效的handle之后,就可以调用can_api.h中定义的相应函数来启动CAN设备接口。

BOOL CAN_StartChip (HANDLE hDevice);

在进行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_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(…)即可,该函数的功能只是将需要发送的数据填入驱动的发送数据缓冲区,真正的数据发送是由驱动程序中的发送线程自动完成的。若用户需要查看数据是否发送成功,可以通过检查驱动的相关统计数据DriversStatistics来判断,其中NumTxSuccessful为CAN数据帧成功发送统计数,每成功发送一次CAN数据帧,该计数值自动加1。

3、CAN通讯的出错处理
在can_api.h文件对于CAN通讯所返回的错误代码分别定义如下:

错误代码

定义

CANCONTROLLER_NORMAL 表明CAN通讯工作正常
CANCONTROLLER_WARNING_LIMIT_REACHED 表明出错,至少接收或发送错误计数器中的一个已达到或超过了由错误报警寄存器(EWLR)定义的报警限,缺省为96
CANCONTROLLER_ERROR_PASSIVE 表明SJA1000达到错误消极状态,也就是说至少一个错误计数器超过规定值127
CANCONTROLLER_BUS_OFF 表明该接口脱离总线
CANCONTROLLER_OVERRUN 数据溢出错误
RING_BUFFER_FULL 表明接收或发送缓冲区满

错误代码可通过API函数CAN_GetError(HANDLE hDevice, DWORD *ErrorPtr)来获取。一般来说出现前面两个错误:CANCONTROLLER_WARNING_LIMIT_REACHED和CANCONTROLLER_ERROR_PASSIVE,CAN通讯口还可恢复,一旦CAN接口成功接收或发送一帧数据,CAN接口又可回到正常工作状态。而对于出现其余的三项错误,我们建议在应用程序最好是做复位CAN接口的操作,即通过函数调用先关闭CAN口然后再重新初始化该接口。

在英创公司提供的应用光盘中有具体CAN接口的测试代码,可供客户参考测试。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    217934
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

    36947
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    龙芯中科助力2025教育信息技术应用创新大赛成功举办

    2025年11月13日-15日,由中国教育技术协会主办、浙江大学与中国教育技术协会网络安全专业委员会联合承办,中国电子工业标准化技术协会信息技术应用创新工作委员会、浙江高校信
    的头像 发表于 11-21 16:23 592次阅读

    诚迈科技信电脑助力2025第二届教育信息技术应用创新大赛圆满收官

    11月15日,由中国教育技术协会主办、浙江大学与中国教育技术协会网络安全专业委员会联合承办,中国电子工业标准化技术协会信息技术应用创新工作委员会、浙江高校信
    的头像 发表于 11-17 17:58 330次阅读
    诚迈科技信<b class='flag-5'>创</b>电脑助力2025第二届教育<b class='flag-5'>信息技术</b>应用创新大赛圆满收官

    宝马南京信息技术有限公司开业

    今日,宝马(南京)信息技术有限公司在南京正式“挂牌运行”。这家华晨宝马全资子公司由领悦数字信息技术有限公司南京分公司“迭代”而来,代表着一次里程碑式的“进化”。这次升级不仅加速了宝马在华数字化转型进程,更通过深化本土创新,为“未来智慧出行”的发展谱写了核心“代码”。
    的头像 发表于 10-29 15:17 401次阅读

    CAN 接口的“老炮”本色:ARMxy BL410 工业通讯全攻略

    深圳市钡铼技术有限公司ARMxy系列BL410控制器,内置工业级CAN接口,支持多节点广播、强抗干扰与高实时性,适用于储能系统BMS、AGV、变频器组网等复杂环境。配合RS485、LAN等多
    的头像 发表于 08-12 09:35 613次阅读

    易华录入选国家级信息技术应用创新典型解决方案

    近日,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)公布了“2024年信息技术应用创新解决方案”评选结果。易华录申报的“基于节能高效蓝光的超级智能存储解决方案”凭借显著的
    的头像 发表于 08-07 15:35 1244次阅读

    佛瑞亚如何通过信息技术推动业务增长

    在数字化、信息化的浪潮下,信息技术已经不仅是后台工具,更成为驱动企业发展的关键力量。本期Women Inspiring Mobility,我们采访了佛瑞亚中国区信息技术总监马瑛,了解她和团队如何将
    的头像 发表于 07-29 14:00 723次阅读

    飞腾主板为信产业发展提高硬实力

    信息技术飞速发展的当下,信产业已成为我国实现科技自立自强、保障国家信息安全的关键领域。信,即信息技术应用创新,其核心目标是实现
    的头像 发表于 07-22 18:20 554次阅读

    DEKRA德凯成为沙特通信和信息技术设备技术法规认证机构

    近日,DEKRA德凯成功获得沙特标准、计量和质量组织(SASO)认可,正式成为沙特通信和信息技术设备技术法规(Technical Regulation for Communications
    的头像 发表于 07-15 14:27 722次阅读

    科普|信是什么?一文读懂“信息技术应用创新”战略

    什么是信?信,即“信息技术应用创新”,是国家推动IT系统自主可控、安全可控的重要战略工程。它不仅是技术层面的创新,更承载着保障国家网络安全、推动产业升级和实现数字主权的重任。简单来
    的头像 发表于 06-13 10:06 6284次阅读
    科普|信<b class='flag-5'>创</b>是什么?一文读懂“<b class='flag-5'>信息技术</b>应用创新”战略

    上海雷卯提供1KV的CAN浪涌方案 CAN接口浪涌损坏测试

    CAN接口
    上海雷卯电子
    发布于 :2025年03月07日 19:13:43

    龙芯中科荣获2024年度信息技术应用创新工作委员会卓越贡献成员单位

    近日,中国电子工业标准化技术协会信息技术应用创新工作委员会(以下简称“信工委会”)在北京召开2024年度工作总结座谈会暨信“大比武”总结大会。中国工程院院士、信
    的头像 发表于 01-23 10:50 981次阅读

    芯盛智能荣获2024年信息技术应用创新工作委员会卓越贡献成员单位

    日前,中国电子工业标准化技术协会信息技术应用创新工作委员会(以下简称 “信工委会”)2024 年度总结座谈会于北京隆重举行。此次会议对在信工作中作出突出贡献的成员单位予以表彰。江苏
    的头像 发表于 01-20 09:56 927次阅读

    飞腾助力首届教育信息技术应用创新大赛圆满落幕

    近日,由中国教育技术协会主办,教育部教育管理信息中心教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信工委会支持,北京航空航天
    的头像 发表于 12-24 09:57 768次阅读

    有方科技参编的信息技术团体标准发布

    近日,有方科技参编的《信息技术产品供应链成熟度 共性指标 第1部分:企业背景评价》《信息技术产品供应链成熟度 共性指标 第2部分:技术掌控评价》《信息技术产品供应链成熟度 共性指标 第
    的头像 发表于 12-23 10:44 899次阅读

    龙芯中科助力2024首届教育信息技术应用创新大赛成功举办

    近日,2024首届教育信息技术应用创新大赛在北京航空航天大学成功举办。本次大赛由中国教育技术协会主办,教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信
    的头像 发表于 12-19 17:02 818次阅读