如何使用esd NTCAN发送和接收29-bit CAN-ID的数据

在ISO 11898-1规范中的CAN2.0B定义了29-bit的CAN-ID,使用29-bit CAN-ID发送的CAN数据格式被称为Extended Frame Format(缩写为EFF)。与其对应的CAN2.0A中定义的11-bit CAN-ID的CAN数据格式被称为Standard Frame Format。目前市面上较新的CAN控制器都会同时支持CAN2.0A和CAN2.0B。esd自主开发的的CAN控制器esdACC当然也是会同时支持的CAN2.0A和CAN2.0B的。 

本文内容主要参考自ntcan_part1_function_api_manual_en_53_0.pdf(文档1)。

这篇文章将会向用户介绍一下如何使用esd NTCAN库提供的API来写应用程序发送和接收29-bit CAN-ID的EFF数据。在此之前,先要跟用户弄清NTCAN-ID的概念,以及其与CAN-ID的区别。您可以在(文档1)的第3.4章节中找到相关内容。NTCAN-ID是一个4 bytes(32 bits)的数据结构,NTCAN-ID以及data length (1 byte)和Payload数据都是用来在用户应用程序和NTCAN library之间进行数据交换的。也就是说用户在写自己的应用程序时,需要将自己要发送的CAN数据的CAN-ID转换成NTCAN-ID。

在下图中可以看到NTCAN-ID 32 bits的数据结构。其中黄色部分对应的是29-bit CAN-ID的数据格式。如果一个NTCAN-ID在第31 bit位和第30 bit位设为0,并且在第29 bit位上设为1的时候,后续的29 bits(从第28 bit位到第0 bit位)的数据会被NTCAN library识别为一个29-bit的CAN-ID。

【1】发送29-bit CAN-ID的数据

请参考tx_29bit_msg.c文件。假设应用程序要发送一个29-bit CAN-ID为0x1f000606的数据,CMSG内的id域设定需要用bit wise OR操作NTCAN_20B_BASE(定义在ntcan.h内),如0x1f000606 | NTCAN_20B_BASE。然后再用canWrite()函数将此CMSG数据发送出去,NTCAN library就会知道应用程序发送的是一个29-bit CAN-ID的数据。

将程序编译连接gcc -o tx_29bit_msg tx_29bit_msg.c -lntcan,然后执行一下。

在执行tx_29bit_msg程序同时,用esd CANreal软件抓取一下CAN bus的数据包,会发现tx_29bit_msg程序内定义的29-bit CAN-ID的CMSG数据被成功发送出来了。

【2】接收29-bit CAN-ID的数据

esd推荐使用Smart ID Filter(SIF)方式过滤接收到的CAN数据,这是目前esd NTCAN中较新的CAN-ID过滤方式。SIF过滤方式需要搭配使用版本号大于v3.9.x的CAN device driver。

请参考rcv_29bit_msg.c文件。以下代码片段使用了canIdRegionAdd()函数,可以让CAN-ID范围为(0x1f000600 – 0x1f00060f)的数据传入应用程序。

使用esd CANreal软件在CAN bus中发送CAN-ID范围在(0x1f000600 – 0x1f00060f)之间的CAN数据。在CANreal界面底部输入要发送的29-bit CAN-ID数据。

如果发送成功的话,在CANreal上部会显示从CAN bus中抓取的,刚刚发送成功的CAN数据。

将程序编译连接gcc -o rcv_29bit_msg rcv_29bit_msg.c -lntcan,然后执行一下。可以看到从esd CANreal中发送出来的29-bit CAN-ID的数据被成功接收到了。