CANFD简介
随着汽车电子系统日益复杂,CANFD(Controller Area Network Flexible Data-Rate)通信协议因其更高的数据传输速率和带宽而成为车辆网络通信的关键技术。在本篇文章中,我们将探讨RH850微控制器如何高效实现CANFD通信。
什么是CAN(Controller Area Network)?
CAN(Controller Area Network,控制器局域网络)是一种用于车辆和工业自动化系统中的高效、可靠的通信协议。最初由德国公司博世(Bosch)在20世纪80年代开发,CAN协议旨在解决车辆电子系统之间的通信问题。它允许多个微控制器和设备在没有主机计算机的情况下相互通信,从而提高了系统的灵活性和可靠性。
CAN网络是一种多主总线系统,任何节点都可以在总线上发送和接收消息。它采用差分信号传输方式,抗干扰能力强,适合在噪声环境中使用。CAN协议的主要特点包括:
- 高可靠性:通过CRC校验和确认机制,确保数据传输的完整性。
- 实时性:优先级机制保证了高优先级消息能够及时传输。
- 灵活性:支持多种数据速率和拓扑结构,适应不同应用需求。
CAN与CANFD的区别
CANFD(CAN with Flexible Data-rate,灵活数据速率的CAN)是CAN协议的增强版本,由博世公司在2012年推出。CANFD在保持原有CAN协议优点的基础上,针对现代应用的需求进行了多项改进,主要区别如下:
- 数据速率:
- CAN:传统CAN协议的数据速率最高为1 Mbps。
- CANFD:在数据阶段,CANFD允许更高的数据速率,最高可达8 Mbps,提高了数据传输效率。
- 数据帧长度:
- CAN:每个数据帧最多只能传输8字节的数据。
- CANFD:每个数据帧最多可以传输64字节的数据,减少了传输延迟。
- 协议灵活性:
- CAN:固定的数据速率和帧结构,灵活性较低。
- CANFD:引入了灵活的数据速率和更大的数据帧,适应更多样化的应用需求。
- 兼容性:
- CAN:传统CAN节点无法直接与CANFD节点通信。
- CANFD:设计上考虑了向下兼容,CANFD控制器可以兼容传统CAN协议,但需要注意的是,CANFD帧在传统CAN网络中无法被识别。
- 错误检测和处理:
- CAN:采用CRC(循环冗余校验)和确认机制来保证数据传输的可靠性。
- CANFD:在错误检测和处理机制上进行了增强,提高了数据传输的可靠性和安全性。
数据帧
在CANFD协议中,数据帧由7个主要段构成:
- 帧起始段(Start of Frame, SOF):
- 表示帧的开始,通常是一个显性位(dominant bit)。
- 仲裁段(Arbitration Field):
- 包含标识符(Identifier)和远程请求位(RTR bit),用于确定总线上消息的优先级。
- 控制段(Control Field):
- 包含数据长度码(DLC),指示数据段的字节数,以及其他控制位。
- 数据段(Data Field):
- 包含实际传输的数据。在CANFD中,数据段的长度可以达到64字节,而传统CAN最多只能传输8字节。
- CRC段(Cyclic Redundancy Check Field):
- 包含CRC序列,用于检测数据传输过程中是否出现错误。
- 确认段(Acknowledge Field, ACK):
- 包含ACK位和ACK分隔符,用于接收节点确认是否正确接收到数据。
- 帧结束段(End of Frame, EOF):
- 表示帧的结束,通常是7个隐性位(recessive bits)。
使用RH850-F1KMS1进行CANFD通信
本章节我们将会使用RH850-F1KMS1进行CANFD 回显通信实验。
本次实验的平台是 霆宝科技 开发的RH850F1KM 评估板,TPD-R7F7016843AFP_v1.0.0。
功能设计
- 开发板上电后,通过CANFD发送一帧数据;
- 数据回显,上位机向开发板发送CANFD数据,开发板收到数据后将该数据重新转发到上位机。
硬件连接
本次实验,将使用CAN0通道完成,按照原理图连接好跳线、仿真器、调试工具。
软件设计
本次实验的开发环境为CS+ for CC V8.11
,可以拷贝一份我们提供的空白工程,然后使用Smart Configurator
进行配置;
RH850-F1KMS1有多种通信模式,本次实验使用FIFO的方式收发数据;
配置完毕后,导入CANFD
库进行应用开发,以下是详细说明。
Smart Configurator配置
我们提供的工程已经配置好时钟,需要注意,RS-CANFD
时钟需要设置成80MHz。
然后配置CANFD
通道引脚,
配置中断,
开启中断时,需要更改Interrupt Handler
的函数名,最后往开发环境导入CANFD
库文件,至此开发的准备工作已完成。
CANFD库介绍
该库由霆宝科技开发,旨在降低CANFD
的开发难度,缩短开发周期,以下是配置文件的功能介绍:
cfg_
开头的文件是使用时需要配置的文件cfg_canfd_test.c
:canfd测试文件,本次实验将在该文件上完成cfg_canfd0.c
:canfd的全局配置文件cfg_canfd0_ch0
:canfd 通道0的配置文件,如需其他通道,也可以按照代码格式移植cfg_canfd0_common_fifo.c
:common fifo的配置文件,也称为Transmit/receive FIFO
cfg_canfd0_receive_fifo.c
:receive FIFO的配置文件cfg_canfd0_transmit_buffer.c
:发送缓冲区的配置文件
使用该库的顺序一般为:
- 移植所需通道
- 配置CANFD全局设定
- 配置通道设定
- 配置通道规则表
- 配置所需的缓冲区
全局设定
首先找到cfg_canfd0_init
函数,按照项目需求填写全局配置,一般保持默认。
其中,如果需要使用接收缓冲区,则需要将NRXMB
设置成需要使用的缓冲区数量。
通道配置
本次实验的通道配置在cfg_canfd0_channel_init_ch0
函数内部,本次实验使用的波特率是 500Kbps ,寄存器的值可以根据数据手册的计算方法计算。
计算方法如下:
然后配置通道的接收规则(过滤器),
规则表配置项如下:
配置项 | 描述 |
---|---|
id | 想要接收的id |
GAFLLB | 接收规则目标消息选择(自身或者其他设备) |
frame_type | 想要接收到的帧类型 |
id_mode | 想要接收到的id模式(标准id或拓展id) |
id_mask | 需要屏蔽检查id的哪几位 |
frame_type_enable | frame_type 是否起作用 |
id_mode_enable | id_mode 是否起作用 |
minimum_dlc | 最小的接收数据长度(0为不检查) |
buffer_index | 接收此规则消息的receive缓冲区 |
receive_buffer_enable | 接收缓冲区使能 |
fifo_select_flags | 接收此规则接受的消息的RX FIFO |
默认使用0x20
作为接收ID,为了调试方便,掩码部分将全部关闭,接收使用 CANFD_RX_FIFO_0
。
配置接收FIFO
由于接收使用了CANFD_RX_FIFO_0
,所以需要对该FIFO进行配置,
注意,需要使能FIFO的中断,不然会导致无法接收。
配置发送缓冲区
配置中断向量
这部分是r_smc_intprg.c
文件中的代码,由Smart Configurator
生成,只需要在中断服务函数调用CANFD
库对应的中断服务函数即可。
编写应用代码
首先编写上电发送部分,发送CANFD数据之前,需要构建一帧数据,cfg_canfd_test.c
文件里有发送帧数据的模板,
默认使用的ID是0x18
,发送一帧CANFD的数据帧,数据长度是64,然后在DB
处填入需要发送的数据,
然后调用canfd0_transmit_by_buffer
函数,将数据发送出去。
对于接收到的数据,应该先缓存到变量内,因此,可以在接收中断函数里面编写,
最后,完成代码,下载调试,
调试
将调试工具连接电脑和开发板,启动设备,
开启之后,需要重启开发板,上位机将会收到以下数据,
可以看到,接收到的帧ID、数据长度、数据等内容,于我们配置的一致,这时候可以启动上位机的发送功能,
调试
将调试工具连接电脑和开发板,启动设备,
开启之后,需要重启开发板,上位机将会收到以下数据,
可以看到,接收到的帧ID、数据长度、数据等内容,于我们配置的一致,这时候可以启动上位机的发送功能,
设置好发送的数据之后,点击发送,可以看到开发板返回了刚刚通过上位机发出的数据,至此实验完成。
联系方式
如有需求请联系霆宝科技销售团队,邮件至sales@teampo.com,或致电0755-83187999。