当前位置: 首页 > news >正文

ESP32在CAN(TWAI)波特率不同时收发数据,导致总线错误无法恢复

问题描述:

总线上有两个设备,主机:100ms周期发送数据。从机:以不同波特率发送数据,再把从机波特率调节至主机波特率一致无法通信。

环境:VSCODE + IDF-v5.0

问题分析:

我们先看下ESP32技术参考手册中TWAI中对错误状态计数器的描述。当TEC>255时,说明总线发生严重错误,此时ESP32的机制会关闭总线进入离线状态。这也是导致我们无法通信的原因。

问题解决方法:

在ESP32的技术参考手册上也描述了怎么恢复离线状态。

首先我们需要知道CAN(TWAI)的总线状态。这个我们可以通过IDF的API函数来获取中线的各种状态。

代码如下:

/*** @brief   Structure to store status information of TWAI driver*/
typedef struct {twai_state_t state;             /**< Current state of TWAI controller (Stopped/Running/Bus-Off/Recovery) */uint32_t msgs_to_tx;            /**< Number of messages queued for transmission or awaiting transmission completion */uint32_t msgs_to_rx;            /**< Number of messages in RX queue waiting to be read */uint32_t tx_error_counter;      /**< Current value of Transmit Error Counter */uint32_t rx_error_counter;      /**< Current value of Receive Error Counter */uint32_t tx_failed_count;       /**< Number of messages that failed transmissions */uint32_t rx_missed_count;       /**< Number of messages that were lost due to a full RX queue (or errata workaround if enabled) */uint32_t rx_overrun_count;      /**< Number of messages that were lost due to a RX FIFO overrun */uint32_t arb_lost_count;        /**< Number of instances arbitration was lost */uint32_t bus_error_count;       /**< Number of instances a bus error has occurred */
} twai_status_info_t;/*** @brief   Get current status information of the TWAI driver** @param[out]  status_info     Status information** @return*      - ESP_OK: Status information retrieved*      - ESP_ERR_INVALID_ARG: Arguments are invalid*      - ESP_ERR_INVALID_STATE: TWAI driver is not installed*/
esp_err_t twai_get_status_info(twai_status_info_t *status_info)

同时CAN(TWAI)总线的状态有以下几种状态。

/*** @brief   TWAI driver states*/
typedef enum {TWAI_STATE_STOPPED,             /**< Stopped state. The TWAI controller will not participate in any TWAI bus activities */TWAI_STATE_RUNNING,             /**< Running state. The TWAI controller can transmit and receive messages */TWAI_STATE_BUS_OFF,             /**< Bus-off state. The TWAI controller cannot participate in bus activities until it has recovered */TWAI_STATE_RECOVERING,          /**< Recovering state. The TWAI controller is undergoing bus recovery */
} twai_state_t;

当我们获取到现在的总线状态为OFF时,我们就可以知道我们的CAN(TWAI)中线已经离线,我们要开始进入恢复流程,我们直接调用IDF的API进入恢复流程,我们可以通过以下代码来实现。

/*** @brief   Start the bus recovery process** This function initiates the bus recovery process when the TWAI driver is in* the bus-off state. Once initiated, the TWAI driver will enter the recovering* state and wait for 128 occurrences of the bus-free signal on the TWAI bus* before returning to the stopped state. This function will reset the TX queue,* clearing any messages pending transmission.** @note    The BUS_RECOVERED alert can be enabled to alert the application when*          the bus recovery process completes.** @return*      - ESP_OK: Bus recovery started*      - ESP_ERR_INVALID_STATE: TWAI driver is not in the bus-off state, or is not installed*/
esp_err_t twai_initiate_recovery(void);twai_status_info_t twai_status_info;
twai_get_status_info(&twai_status_info);// 总线关闭
if(twai_status_info.state == TWAI_STATE_BUS_OFF)
{// 总线复位twai_initiate_recovery();
}

当我们执行完twai_initiate_recovery();函数之后CAN(TWAI)总线会清空所有错误计数,但是此时总线还不能直接收发数据,因为此时我们的总线状态为TWAI_STATE_STOPPED状态,我们此时需要切换到TWAI_STATE_RUNNING状态我们才能正常收发数据,这个状态的切换我们也是通过API函数来切换。代码如下:

twai_start();

问题总结:解决这个问题只需要在收发任务中加入以下代码就可以对总线状态进行监控。进入恢复流程。

// 读取总线状态
twai_status_info_t twai_status_info;twai_get_status_info(&twai_status_info);
// 总线关闭
if(twai_status_info.state == TWAI_STATE_BUS_OFF)
{twai_initiate_recovery();
}
// 总线停止
else if(twai_status_info.state == TWAI_STATE_STOPPED)
{twai_start();
}

如果帮到了你,请给我一个关注😍。

相关文章:

ESP32在CAN(TWAI)波特率不同时收发数据,导致总线错误无法恢复

问题描述&#xff1a; 总线上有两个设备&#xff0c;主机&#xff1a;100ms周期发送数据。从机&#xff1a;以不同波特率发送数据&#xff0c;再把从机波特率调节至主机波特率一致无法通信。 环境&#xff1a;VSCODE IDF-v5.0 问题分析&#xff1a; 我们先看下ESP32技术参…...

精简版背包问题|01背包、完全背包、多重背包

背包问题 01背包问题 有n个物品&#xff0c;它们有各自的体积w和价值v&#xff0c;现有给定容量W的背包&#xff0c;在总体积不超过背包承载上限的情况下&#xff0c;如何让背包里装入的物品具有最大的价值总和&#xff1f;&#xff08;每个物品最多可使用一次&#xff09; w(…...

五、核支持向量机算法(NuSVC,Nu-Support Vector Classification)(有监督学习)

和支持向量分类(Nu-Support Vector Classification)&#xff0c;与 SVC 类似&#xff0c;但使用一个参数来控制支持向量的数量&#xff0c;其实现基于libsvm 一、算法思路 本质都是SVM中的一种优化&#xff0c;原理都类似&#xff0c;详细算法思路可以参考博文&#xff1a;三…...

个人废品回收小程序制作步骤详解

在当今的环保时代&#xff0c;个人废品回收小程序的发展显得尤为重要。为了满足这一需求&#xff0c;本文将详细介绍如何制作一个个人废品回收小程序。 第一步&#xff0c;进入乔拓云网后台&#xff0c;点击【轻应用小程序】进入设计小程序页面。在这个页面&#xff0c;你可以看…...

Python爬虫自动切换爬虫ip的完美方案

在进行网络爬虫时&#xff0c;经常会遇到需要切换爬虫ip的情况&#xff0c;以绕过限制或保护自己的爬虫请求。今天&#xff0c;我将为你介绍Python爬虫中自动切换爬虫ip的终极方案&#xff0c;让你的爬虫更加高效稳定。 步骤一&#xff1a;准备爬虫ip池 首先&#xff0c;你需要…...

IDEA新建.xml文件显示为普通文本

情况如下&#xff1a; 1. 在XML文件中添加*.xml的文件名模式 2. 在文本中&#xff0c;选中*.xml进行删除...

linux的三剑客

1、grep命令 grep全称是Global Regular Expression Print&#xff0c;表示全局正则表达式版本&#xff0c;它的使用权限是所有用户。它是Linux系统中一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。 shell脚本中也经常使用g…...

微信小程序部分知识点总结【2】

微信小程序的原理是什么 微信小程序的原理是基于一种轻量级的应用程序模型&#xff0c;它允许开发者在微信客户端内部创建和运行应用程序。微信小程序采用了类似网页的技术栈&#xff0c;主要由两部分组成&#xff1a;前端和后端。 前端部分使用HTML、CSS和JavaScript等标准的…...

基于springboot+vue的云南旅游网(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

后缀表达式求值

后缀表达式&#xff0c;又称逆波兰式&#xff0c;指的是不包含括号&#xff0c;运算符放在两个运算对象的后面&#xff0c;所有的计算按运算符出现的顺序&#xff0c;严格从左向右进行。 运用后缀表达式进行计算的具体做法&#xff1a; 建立一个操作数栈S。然后从左到右读表达…...

基于springboot+vue的信息技术知识赛系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

基于YOLOv8模型的垃圾满溢检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的垃圾满溢检测系统可用于日常生活中检测与定位车辆垃圾&#xff08;garbage&#xff09;、垃圾桶&#xff08;garbage_bin&#xff09;和垃圾满溢&#xff08;overflow&#xff09;目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等…...

面试算法14:字符串中的变位词

题目 输入字符串s1和s2&#xff0c;如何判断字符串s2中是否包含字符串s1的某个变位词&#xff1f;如果字符串s2中包含字符串s1的某个变位词&#xff0c;则字符串s1至少有一个变位词是字符串s2的子字符串。假设两个字符串中只包含英文小写字母。例如&#xff0c;字符串s1为&quo…...

中国社科院大学-美国杜兰大学金融管理硕士暨能源管理硕士项目2023年毕业典礼

中国社科院大学-美国杜兰大学金融管理硕士暨能源管理硕士项目2023年毕业典礼 2023年9月16日&#xff0c;中国社会科学院大学-美国杜兰大学金融管理硕士项目暨能源管理硕士项目2023年毕业典礼在我校望京校区成功举办。 张波副校长致辞 中国社会科学院大学副校长张波教授、杜兰大…...

蓝桥杯 题库 简单 每日十题 day10

01 最少砝码 最少砝码 问题描述 你有一架天平。现在你要设计一套砝码&#xff0c;使得利用这些砝码 可以出任意小于等于N的正整数重量。那么这套砝码最少需要包含多少个砝码&#xff1f; 注意砝码可以放在天平两边。 输入格式 输入包含一个正整数N。 输出格式 输出一个整数代表…...

聊聊并发编程——多线程之synchronized

目录 一.多线程下数据不一致问题 二.锁和synchronized 2.1 并发编程三大特性 2.2引入锁概念 三.synchronized的锁实现原理 3.1 monitorenter和monitorexit 3.2synchronized 锁的升级 3.2.1偏向锁的获取和撤销 3.2.2轻量级锁的加锁和解锁 自适应自旋锁 轻量级锁的解锁…...

CompletableFuture-通用异步编程

演示Completable接口完全可以代替Future接口&#xff1a; CompletableFuture减少阻塞和轮询&#xff0c;可以传入回调对象&#xff0c;当异步任务完成或者发生异常时&#xff0c;自动 调用回调对象的回调方法。 package com.nanjing.gulimall.zhouyimo.test;import java.util…...

Vue3 封装 element-plus 图标选择器

一、实现效果 二、实现步骤 2.1. 全局注册 icon 组件 // main.ts import App from ./App.vue; import { createApp } from vue; import * as ElementPlusIconsVue from element-plus/icons-vueconst app createApp(App);// 全局挂载和注册 element-plus 的所有 icon app.con…...

超详细C语言实现——通讯录

目录 一、介绍 二、源代码 test.c: Contact.c: Contact.h: 代码运行结果&#xff1a; 三、开始实现 1.基本框架&#xff1a; 2.添加联系人&#xff1a; 3.显示联系人信息&#xff1a; 4.删除联系人信息&#xff1a; 5.查看指定联系人信息&#xff1a; 6.修改联系人…...

zabbix监控添加监控项及其监控Mysql、nginx

本届主要介绍添加监控项和修改中文乱码&#xff0c;监控mysql&#xff0c;nginx服务 一、zabbix监控添加监控项 1、配置agent服务器 在配置文件中添加&#xff1a; UserParameterlsq_userd,free -m | grep Mem | awk { print $3 } 服务器内存使用量 UserParameterdu,…...

Qwen3-TTS语音合成5分钟快速部署:10种语言+方言一键搞定

Qwen3-TTS语音合成5分钟快速部署&#xff1a;10种语言方言一键搞定 1. 快速部署指南 1.1 系统环境准备 在开始前&#xff0c;请确保您的系统满足以下基本要求&#xff1a; 操作系统&#xff1a;支持Linux/Windows/macOSPython版本&#xff1a;3.8-3.10内存&#xff1a;至少…...

ViTConvMAE-B(NeurIPS 2022)目标检测、实例分割模型环境配置ViTConvMAE-B(NeurIPS 2022)目标检测、实例分割模型数据集调整ViTConvMAE-B(Ne

ViTConvMAE-B&#xff08;NeurIPS 2022&#xff09;目标检测、实例分割模型环境配置 ViTConvMAE-B&#xff08;NeurIPS 2022&#xff09;目标检测、实例分割模型数据集调整 ViTConvMAE-B&#xff08;NeurIPS 2022&#xff09;目标检测、实例分割模型代跑训练 ViTConvMAE-B&…...

FFXIV_ACT_CutsceneSkip:副本动画智能跳过解决方案

FFXIV_ACT_CutsceneSkip&#xff1a;副本动画智能跳过解决方案 【免费下载链接】FFXIV_ACT_CutsceneSkip 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_ACT_CutsceneSkip 冗长动画如何影响副本体验&#xff1f; 在《最终幻想14》的高难度副本中&#xff0c;重复…...

LSM303DLHC驱动开发:磁力计校准与六轴姿态解算

1. LSM303DLHC 姿态感知核心&#xff1a;高精度磁力计与加速度计集成库深度解析LSM303DLHC 是意法半导体&#xff08;STMicroelectronics&#xff09;推出的紧凑型六轴惯性测量单元&#xff08;IMU&#xff09;&#xff0c;集成了三轴加速度计&#xff08;2g/4g/8g 可选量程&am…...

Phi-4-mini-reasoning部署避坑指南:CUDA OOM、端口映射、STARTING卡顿全解析

Phi-4-mini-reasoning部署避坑指南&#xff1a;CUDA OOM、端口映射、STARTING卡顿全解析 1. 模型简介 Phi-4-mini-reasoning是微软推出的3.8B参数轻量级开源模型&#xff0c;专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这个模型主打"小参数、强推理、长上下文、…...

张毕贺的音乐故事《越说越明》

张毕贺的音乐故事&#xff0c;始于一把吉他&#xff0c;成于不懈创作&#xff0c;最终汇成一条连接梦想与大众的河流。他的音乐历程&#xff0c;既是个人才华的绽放&#xff0c;也是对音乐教育与本土文化推广的坚定投入。 音乐之路&#xff1a;从翻唱走红到原创深耕 张毕贺的…...

Phi-4-mini-reasoning镜像部署案例:低成本GPU环境下高效推理落地实录

Phi-4-mini-reasoning镜像部署案例&#xff1a;低成本GPU环境下高效推理落地实录 1. 项目背景与模型介绍 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员&#xff0c;它特别针对数学…...

新手如何快速掌握多层板设计?从电源PCB叠层结构讲起

引言&#xff1a;从双板板到多层板&#xff0c;你准备好了吗&#xff1f;作为一名硬件工程师&#xff0c;你是否也经历过这样的困惑&#xff1a;刚学会画双板板&#xff0c;项目需求就变成了4层、6层甚至8层板&#xff1f;面对叠层结构的选择&#xff0c;你是否感到无从下手&am…...

PCIe AVIP架构

验证工程师可以用C语言接口快速实现仿真加速。C实现的仿真文件testbench可以直接访问AVIP&#xff0c;与总线功能模块BFM交换数据。PCIe AVIP的C接口就是一组C类&#xff1b;C程序或工具可以调用这些类的方法。C类可以实现如下功能&#xff1a;与BFM建立通信&#xff1b;向BFM发…...

OpenClaw + Seedance 2.0实战:从零搭建全自动AI视频生成流水线

OpenClaw Seedance 2.0实战&#xff1a;从零搭建全自动AI视频生成流水线 前言 这篇记录我用OpenClaw Agent串联Seedance 2.0满血版API&#xff0c;搭建全自动视频生产流水线的完整过程。包括架构设计、Skill编写、API调用细节和踩坑记录。 一、架构设计 用户输入&#xff…...