应⽤笔记:RH850-F1KMS1-CAN FD解决FIFO缓冲 区残留旧数据疑问

随着汽⻋电⼦系统⽇益繁琐,CANFD(Controller Area Network Flexible Data-Rate)通信协议因其更⾼的数据传输速率和带宽⽽成为⻋辆⽹络通信的关键技术。在本篇⽂章中,大家将探讨RH850微控制器如何解决CANFD通信中FIFO缓冲区残留旧数据问题


什么是FIFO

FIFO 是First In, First Out(先进先出),是⼀种数据缓冲结构,其核⼼思想是:最早进⼊的数据,最先被取出;后进⼊的数据,排在队尾等待处理。

它模拟了现实世界中的“排队”⾏为,例如:

  • 超市收银台结账队伍

  • 打印机任务队列

  • 汽⻋中控系统的报⽂接收缓存

在嵌⼊式系统、通信协议(如 CAN FD、UART)、操作系统、⽹络设备中,FIFO 是实现⾼效、可靠数据传输的关键组件。



FIFO缓冲区的处理机制

在 RH850/KMS1 的 CAN FD 控制器中,每个通道通常配备⼀个接收 FIFO 缓冲区(如RSCANFDRF0–RSCANFDRF5 对应不同通道或过滤器组),⽤于缓存接收到的 CAN FD 帧。

FIFO缓冲区⼀般具有以下优势:

1. 接收报⽂完整性保障:

  • ⽤于缓存从总线接收到的 CAN FD 帧;

  • ⽀持多帧缓存;

  • 当 FIFO 满时可安装为覆盖模式或产⽣溢出标志(Overflow Flag);

  • 每个 FIFO 单元存储⼀帧完整的 CAN FD 报⽂,包含:ID、DLC、数据载荷、时间戳、帧类型(CAN/FD)、BRS、ESI 等关键字段,确保报⽂结构完整。

2. 顺序性保证:

  • 采⽤硬件实现的先进先出(FIFO)策略;

  • 由硬件⾃动管理读写指针,确保报⽂按接收顺序被读取;

  • ⽀持时间戳功能,便于时序分析与故障诊断。

3. 中断触发机制:

  • ⽀持基于 FIFO 深度阈值的中断触发;

  • 开发者可配置在接收到 N 帧报⽂后触发中断,以平衡实时性与 CPU 负载;

  • 当 FIFO 全满时,亦可触发溢出中断,防⽌资料丢失。

处理框图


FIFO缓冲区旧资料残留原因

常⻅且隐蔽的故障源,可能导致协议解析错误、控制指令误触发、功能安全风险等问题。就是FIFO 缓冲区中的“旧内容残留”是指:在缓冲区未被完全清空或处理完毕的情况下,因复位、中断策略不当、指针管理错误等原因,导致上⼀轮资料残留在缓冲区中,影响新数据的正确性与系统逻辑。这在汽⻋电⼦(如 CAN FD)、⼯业控制、实时通信等⾼可靠性环境中

为帮助理解此类问题的具体表现形式,以下列举两个看似常⻅但成因完全不同的典型场景,分别从“复位处理不彻底”和“低功耗唤醒”两个⻆度进⾏剖析:

例1:CAN接收FIFO在系统复位后未清空

  • 在 CAN 发送或接收报⽂的过程中,因为系统进⾏“看⻔狗复位”、“软件复位”或“模块重启”时,仅重置了CAN控制器状态,但 FIFO 缓冲区未被清空或未被读取完。

  • 由于 CAN 总线具有 多节点竞争、异步传输 的特性,部分报⽂可能在复位前已进⼊接收FIFO,导致旧数据仍存在于缓冲区中,下次运⾏时被当作“新材料”读出。

例2:CAN控制器从低功耗模式唤醒后,FIFO中残留未处理报⽂

  • 当节点为省电进⼊低功耗模式时,CAN控制器可能被关闭或挂起,但接收FIFO缓冲区中的未读报⽂还存储在⾥⾯未被清除。

  • 唤醒后这些进⼊低功耗模式前存储的报⽂仍保留在缓冲区中,并在系统恢复⼯作后会被当作“新数据”读取。

使用RH850-F1KMS1启动FIFO接收

本章节我们将会使⽤RH850-F1KMS1进⾏CANFD中FIFO清除旧内容残留实验,本次实为通过上位机发送列表报⽂,⼿动制造旧数据残留场景。

本次实验的平台是 霆宝科技 开发的RH850F1KM 评估板,TPD-R7F7016843AFP_v1.0.0。

功能设计

1. 开发板上电后,采⽤上位机连续发队列报⽂,⼿动制造旧资料残留。

2. 素材回环,只把最新的报⽂重新向上位机发送。

硬件连接

本次实验,将使⽤ CAN0 通道搞定,按照原理图连接好跳线、仿真器、调试⼯具。

软件设计

本次实验的开发环境为 CS+ for CC V8.11 ,可以拷⻉⼀份我们提供的空⽩⼯程,然后使⽤Smart Configurator 进⾏配置;

RH850-F1KMS1有多种通信模式,本次实验使⽤FIFO的⽅式收发信息,使⽤的是 CAND FD通道0;

配置完毕后,导⼊ CANFD 库进⾏应⽤编写,以下是详细说明。

环境配置部分不做多赘述,在 霆宝科技 CSDN过往发布文章《 应⽤笔记 | RH850-F1KMS1-CANFD通信》(点击下方图片跳转)有具体配置,在此实验中主要研究如何解决FIFO旧信息残留问题。https://blog.csdn.net/Teampo/article/details/141263867?spm=1001.2014.3001.5501

全局设定


在 cfg_canfd0_init 函数中进⾏全局配置,这边选择默认配置



通道配置

实验通道配置在 cfg_canfd0_channel_init_ch0 函数内部,使⽤的波特率为500kb/s



配置接收规则表(过滤器),不设置id掩码,后续上位机发列表报⽂不会阻⽌接收别的id报⽂


配置FIFO

使⽤了FIFO接收,在 canfd_init 函数⾥必须进⾏对FIFO的初始化部署,这边使⽤的是FIFO的第0个缓冲区



在 cfg_canfd0_receive_fifo_init 函数⾥⾯调整信息深度,触发中断阈值,有效信息载荷

通道0就是在 cfg_canfd0_channel_init 函数选择使⽤的通道,本次实验使⽤的



编写功能代码

FIFO残留旧数据问题:

由于 FIFO 缓冲区不⽀持直接丢弃内容,当检测到旧数据残留时,应在处理新信息前主动读取并丢弃残留帧,确保缓冲区状态清洁;

可利用查询接收 FIFO 状态寄存器 RCFDCnCFDRFSTSx 的 RFEMP 位判断缓冲区是否为空:当 RFEMP = 1 时,表⽰ FIFO 为空。



编写⼀个清空旧数据函数,不断将旧数据赋值在 dumm_frame 结构体⾥⾯,消耗缓冲区的残留数据达到⽬的,在通过软件复位或者每次发送FIFO缓冲区的资料时都调⽤⼀次进⾏⼀次清空处理



通过提供的 cfg_canfd_test 测试函数测试功能

调试

1. 连接调试⼯具与开发板,启动上位机;

2. 选择列表发送模式,发送 ID 为 22, 23, 24, 25, 26 的报⽂;

将 ID 22~25 视为“旧数据”,模拟残留场景;

3. 观察上位机接收结果:

在上位机上观察结果

若将 cfg_canfd_test 函数中的 clear_receive_fifo调⽤注释掉

由于未清除残留数据,系统在第⼆次发送时将误读并回发旧报⽂

不改变 cfg_canfd_test 函数

由于每次发送前将旧内容消耗掉了,所以每次发送都是最新的数据



可以看到关于FIFO缓冲区残留旧资料问题解决,⾄此实验结束。

posted @ 2025-09-16 08:47  yjbjingcha  阅读(32)  评论(0)    收藏  举报