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

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

3天内不再提示

英创信息技术EM9170嵌入式主板CAN通讯接口使用说明

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-15 11:43 次阅读

英创公司推出的基于WinCE 6.0操作系统嵌入式工控板卡EM9170,板上带有2路独立的CAN总线接口,均为FlexCAN模块。FlexCAN完全支持CAN 2.0B协议,支持对于标准帧和扩展帧的收发,同时FlexCAN还支持高优先级的报文优先发送的机制,可有效改善实时控制的相应时间。EM9170板上输出的两路CAN收发信号均为TTL电平,在实际使用时需要在外围电路中加上CAN驱动芯片,具体可以参考英创公司提供的“EM9170开发底板评估手册”。EM9170内核操作系统中已经实现FlexCAN底层驱动,系统一旦上电系统,将自动加载两路FlexCAN的驱动程序,客户在基于EM9170上编写CAN应用程序时,均可按照WinCE流式设备,打开关闭文件的方式对CAN接口进行操作,本文将着重介绍基于EM9170上FlexCAN的使用方法。

数据结构

EM9170的CAN通讯提供了两种数据结构,定义在flex_can.h文件中。一个是CAN通讯数据包的结构,一个是CAN通讯中对于滤波器的设置结构。

CAN数据包结构的定义如下:

typedef struct
{
// 定义数据帧的类型:0 - 标准帧;1 - 扩展帧
DWORD dwType;
// 标准帧或扩展帧的CAN ID。
// bit 0-28: CAN identifier (11/29 bit),其中标准帧11bit,扩展帧29bit
DWORD dwID;
// = 0:数据帧;= 1:远程帧
DWORD dwRTR;
// 发送优先级= 0 - 7,为最高优先级,对接收数据包无意义
DWORD dwPrio;
// 数据长度= 0 - 8
DWORD dwDatLen;
// 数据字节
UCHAR ucDat[8];
}CAN_PACKET, *PCAN_PACKET;

CAN滤波器数据结构的定义如下:

typedef struct
{
// 组号,恒为0
DWORD dwGroup;
// 定义数据帧的类型:0 - 标准帧;1 - 扩展帧
DWORD dwType;
// 定义标准帧或扩展帧需要比较过滤的CAN ID。
// bit 0-28: CAN identifier (11/29 bit),其中标准帧11bit,扩展帧29bit
DWORD dwID;
// = 0:数据帧;= 1:远程帧
DWORD dwRTR;
// 定义和dwID对应的需要检查或不检查的Mask位
// bit 0-28: (11/29 bit),其中标准帧11bit,扩展帧29bit
// = 0:该位不检查;= 1:该位须检查
DWORD dwMask;
}CAN_FILTER, *PCAN_FILTER;

滤波器数据结构设置距离如下:

CAN_FILTER Filter;
Filter.dwGroup = 0; // 保留,恒为0
Filter.dwType = CAN_PACKET_TYPE_STANDARD; // 标准帧
Filter.dwID = 0x00000002; // 设定的接收ID
Filter.dwMask = 0x00000003; // 检查接收报文ID的低2位
Filter.dwRTR = 0; // 数据帧

设置的Filter结构,表明对于接收到的CAN标准帧报文只检查报文CAN ID的低两位的值,这两位的值应该和Filter.dwID所设定的值相符合,即:

CAN_ID & Filter.dwMask = Filter.dwID

因此在上例中,所接收的CAN报文的ID的低两位必须为0x02。

CAN_API函数

英创公司提供的CAN通讯接口的驱动程序采用标准的驱动程序,和串口操作类似用户可以用标准的打开文件CreateFile( )、关闭文件CloseHandle( )的方式,来打开该CAN设备,数据的收发可调用ReadFile() WrtieFile( ),另外的一些对CAN操作通讯相关参数的设置可以通过调用DeviceIOCTL( )来实现。为了方便客户的使用,在CAN驱动程序的基础上,以源码的形式为客户封装了一套简单实用的API函数。各个函数的定义在can_api.h文件下,在该头文件中对于各个API函数均有相应的中文说明。

// 功能描述:启动CAN设备端口
// 输入参数hDevice: 已创建CAN流式设备的句柄。
// 返回值= TRUE: 启动CAN设备端口成功。
// = FALSE: 启动CAN设备端口失败。
BOOL CAN_StartChip(HANDLE hDevice);

// 功能描述:停止CAN设备端口。
// 输入参数hDevice: 已创建CAN流式设备的句柄。
// 返回值= TRUE: 停止CAN设备端口成功。
// = FALSE: 停止CAN设备端口失败。
BOOL CAN_StopChip(HANDLE hDevice);

// 功能描述: 软件复位CAN设备端口。
// 输入参数hDevice: 已创建CAN流式设备的句柄。
// 返回值 = TRUE: 复位CAN设备端口成功。
// = FALSE: 复位CAN设备端口失败。
BOOL CAN_SoftReset(HANDLE hDevice);

// 功能描述:设置CAN设备通讯的波特率。
// 输入参数hDevice: 已创建CAN流式设备的句柄。
// CAN_TIMING_10K : 10Kbps
// CAN_TIMING_20K : 20Kbps
// CAN_TIMING_50K : 50bps
// CAN_TIMING_60K : 60bps
// CAN_TIMING_100K : 100bps
// CAN_TIMING_125K : 125Kbps
// CAN_TIMING_250K : 250Kbps
// CAN_TIMING_500K : 500bps
// CAN_TIMING_1000K: 1Mbps
// 返回值= TRUE: 波特率设置成功。
// = FALSE: 波特率设置失败。
BOOL CAN_SetBaudRate(HANDLE hDevice, DWORD dwBaudRate );

// 功能描述: 设置CAN设备通讯接收过滤器配置。
// 输入参数hDevice: 已创建CAN流式设备的句柄。
// pFilter: 根据通讯报文格式定义过滤器的配置。
// 返回值= TRUE: 配置设置成功。
// = FALSE: 配置设置失败。
BOOL CAN_SetFilter( HANDLE hDevice, PCAN_FILTER pFilter );

// 功能描述: 获取CAN设备通讯事件
// 输入参数hDevice: 已创建CAN流式设备的句柄。
// dwTimeout: 超时时间,单位为ms
// 输出参数
// lpEvtMask: 得到的CAN事件类型= 1:接收到CAN数据包
// = 2:CAN错误事件
// 返回值= TRUE: 调用成功。
// = FALSE: 调用失败。
BOOL WaitCANEvent( HANDLE hDevice, LPDWORD lpEvtMask, DWORD dwTimeout );

// 功能描述: 清空CAN设备通讯接收、发送BUFFER。
// 输入参数hDevice: 已创建CAN流式设备的句柄。
// 返回值= TRUE: 设置成功。
BOOL CAN_Purge( HANDLE hDevice );

CAN出错处理

在CAN实际应用数据通讯过程中,可能会遇到CAN通讯出错的情况,调用API函数WaitCANEvent( HANDLE hDevice, LPDWORD lpEvtMask, DWORD dwTimeout )可以获取到CAN通讯出错的事件,对CAN的错误事件的处理可采用重启CAN设备的操作。

if( WaitCANEvent( pCAN->m_hCAN, &dwEvtMask, 2000 ) )
{
…..
if( dwEvtMask & 0x02 ) // 错误事件
{
CAN_StopChip( pCAN->m_hCAN );
CAN_StartChip( pCAN->m_hCAN );
}
}

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

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

    关注

    7

    文章

    6085

    浏览量

    35200
收藏 人收藏

    评论

    相关推荐

    什么是嵌入式?一文读懂嵌入式主板

    在现代科技浪潮中,嵌入式技术已成为支撑各种智能设备和系统运行的核心力量。那么,究竟什么是嵌入式嵌入式系统,顾名思义,是将计算机的硬件和软件嵌入
    的头像 发表于 10-16 10:14 480次阅读

    CAN/CANFD卡接口函数使用说明

    电子发烧友网站提供《CAN/CANFD卡接口函数使用说明.pdf》资料免费下载
    发表于 10-15 17:35 0次下载

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被称为嵌入式系统的核心组件,是一种用于控制和数据处理的计算机硬件,其设计旨在嵌入特定设备中执行专门任务。嵌入式
    的头像 发表于 09-30 10:05 360次阅读

    飞凌嵌入式技术创新日(深圳站)圆满落幕

    2024年8月26日下午,飞凌嵌入式技术创新日深圳站在深圳威尼斯迪格酒店盛大举行,此次活动汇聚了近200位嵌入式技术领域的专家和企业代表,
    的头像 发表于 08-30 15:42 289次阅读
    飞凌<b class='flag-5'>嵌入式</b><b class='flag-5'>技术</b>创新日(深圳站)圆满落幕

    飞凌嵌入式技术创新日(深圳站)精彩回顾

    2024年8月26日下午,飞凌嵌入式技术创新日深圳站在深圳威尼斯迪格酒店盛大举行,此次活动汇聚了近200位嵌入式技术领域的专家和企业代表,
    发表于 08-28 09:06

    嵌入式工控主板在金融智能设备行业应用

    嵌入式工控主板在金融智能设备行业的应用广泛且深入,其重要性不言而喻。以下是从几个关键方面来阐述嵌入式工控主板在金融智能设备行业的应用:
    的头像 发表于 07-11 09:38 250次阅读

    嵌入式系统怎么学?

    嵌入式系统怎么学? 随着物联网、智能制造等新技术的兴起,嵌入式系统的应用范围更加广泛。包括但不限于工业控制、汽车电子、医疗设备、智能家居、智慧城市、消费电子、通信设备等。学习嵌入式
    发表于 07-02 10:10

    嵌入式工控机主板应用场景

    嵌入式工控机主板在多个领域中有着广泛的应用,其特点包括体积小、集成度高、功耗低以及控制功能强等。以下是嵌入式工控机主板的一些主要应用领域:
    的头像 发表于 04-25 17:06 1221次阅读

    嵌入式主板,你了解多少?

    嵌入式主板,也称为嵌入式计算机主板,是一种专门设计用于嵌入式系统的计算机主板。与台式机和笔记本电脑中使用的常规
    的头像 发表于 04-17 15:11 1411次阅读

    嵌入式fpga是什么意思

    嵌入式FPGA是指将FPGA技术集成到嵌入式系统中的一种解决方案。嵌入式系统是一种为特定应用而设计的计算机系统,它通常包括处理器、内存、外设接口
    的头像 发表于 03-15 14:29 1189次阅读

    定制嵌入式主板,需要考虑的功能有哪些?

    随着科技的不断发展和进步,嵌入式系统在各行各业中得到了广泛的应用。嵌入式主板作为嵌入式系统的核心组件,起着至关重要的作用。在定制嵌入式
    的头像 发表于 02-29 17:38 488次阅读
    定制<b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>,需要考虑的功能有哪些?

    高端嵌入式实验平台

    一、整体概述 该嵌入式平台具有前沿性、专业性、高集成度、功能丰富等特点,平台涵盖嵌入式计算机技术嵌入式硬件接口嵌入式系统软件等关键
    的头像 发表于 01-29 09:55 486次阅读
    高端<b class='flag-5'>嵌入式</b>实验平台

    什么是嵌入式板卡?

    ,以便添加额外的功能或定制化的接口。总之,嵌入式主板是设计用于嵌入式系统的关键组件,它们的设计和功能可以根据特定的应用需求进行定制。这些板采用了各种
    的头像 发表于 12-20 16:17 799次阅读
    什么是<b class='flag-5'>嵌入式</b>板卡?

    菁蓉联获得首个openEuler嵌入式操作系统技术测评证书

    近日,成都菁蓉联科技有限公司(简称:菁蓉联)携手四川鲲鹏&欧拉生态创新中心完成首个openEuler嵌入式操作系统技术测评证书。
    的头像 发表于 11-28 10:18 1005次阅读
    菁蓉联<b class='flag-5'>创</b>获得首个openEuler<b class='flag-5'>嵌入式</b>操作系统<b class='flag-5'>技术</b>测评证书

    定制嵌入式主板:满足客户的实际需求

    随着物联网、智能家居、智能工厂等应用的不断发展,嵌入式系统的应用场景也越来越广泛。嵌入式系统的核心部分是嵌入式主板,而定制化的嵌入式
    的头像 发表于 11-24 11:51 869次阅读
    定制<b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>:满足客户的实际需求