esp32移植canopen协议栈(二)

CANopen开发实战:对象字典与PDO配置详解 在工业自动化与嵌入式系统开发中,现场总线通信协议是实现设备互联互通的核心技术。CAN总线作为一种高可靠性的串行通信协议,广泛应用于汽车电子和工业控制领域。为了在CAN总线上实现标准化的设备互操作,CANopen协议应运而生,它通过定义一套通用的应用层协议,简化了设备间的数据交换与配置。理解CANopen协议的关键在于掌握其两大核心机制:对象字典和过程数据对象。对象字典是设备的标准化数据模型,定义了所有可访问的参数和变量,是设备自我描述的基础。PDO则负责高效、实时地传输这些数据中最关键的部分,如控制指令和状 阅读详情

前言


本文续接上一篇文章,之前我们已经搭建好了esp32的开发环境,以及初始工程。接下来我们开始实现can驱动相关,以及使用c++封装can接口。

一、编程之前先看原理图

在这里插入图片描述
can转换芯片的tx与rx分别接在TWAI_TX, TWAI_RX上,再看主控部分原理图
在这里插入图片描述
从原理图上看到

tx --> IO2 --> GPIO_NUM_2
rx --> IO42 --> GPIO_NUM_42

二、封装can驱动

先看下我们基础工程的目录结构
在这里插入图片描述
我们需要创建一个新的文件夹来存放我们的can驱动(他们一般叫组件),我们在项目根目录下创建一个名为components的文件夹,创好后的目录结构如下
在这里插入图片描述
我们在这个components组件目录下创建一个can文件夹,用来存放我们得can驱动。
然后在can文件夹下,创建一个can.hpp的c++文件,.hpp可以把源码和声明放在一起。可以先写成下图所示
在这里插入图片描述
此时假如我们编译,应该是要报错,报错原因是找不到can.hpp
在这里插入图片描述
我们在main目录下的CMakeLists.txt中加入can.hpp的路径,便可以编译通过
在这里插入图片描述
接下来我们接着封装can驱动
一般来说can需要指定TX,RX两个引脚,而在我们编程阶段这两个引脚一定是写死的,因为这个时候开发板都已经出来了,can的引脚也改变不了,这非常符合常量的定义,且是编译期常量,联系到c++,说到编译期,第一个想到的关键字是constexpr,然后就是模板。因为模板的参数可以是常量,与该场景非常契合,且效率无敌。于是我们可以将can类改为模板类,如下图所示
在这里插入图片描述
我们接下来封装can驱动,按照基本接口来,我们应该是需要4个接口,分别是
init, read, write, deinit。
init对应构造函数,deinit对应析构函数,read从总线读取数据,write为向can总线写入数据。
我们首先来写构造函数(init),在构造函数中我们需要传入can的速率,需要有参构造。
在这里插入图片描述

#pragma once 

#include "driver/twai.h"

template <int tx, int rx>
class Can {
   
   
private:
    twai_handle_t _handler {
   
   nullptr};
public:
    explicit Can(int kbps) {
   
   
        twai_general_config_t gConfig = TWAI_GENERAL_CONFIG_DEFAULT(static_cast<gpio_num_t>(tx), static_cast<gpio_num_t>(rx), TWAI_MODE_NORMAL);
        twai_timing_config_t tConfig;
        switch (kbps) {
   
   
            case 1:
                tConfig = TWAI_TIMING_CONFIG_1KBITS();
                break;

            case 5:
                tConfig = TWAI_TIMING_CONFIG_5KBITS();
                break;

            case 10:
                tConfig = TWAI_TIMING_CONFIG_10KBITS();
                break;

            case 16:
                tConfig = TWAI_TIMING_CONFIG_16KBITS();
                break;

            case 20:
                tConfig = TWAI_TIMING_CONFIG_20KBITS();
                break;

            case 25:
                tConfig = TWAI_TIMING_CONFIG_25KBITS();
                break;

            case 50:
                tConfig = TWAI_TIMING_CONFIG_50KBITS();
                break;

            case 100:
                tConfig = TWAI_TIMING_CONFIG_100KBITS();
                break;

            case 125:
                tConfig = TWAI_TIMING_CONFIG_125KBITS();
                break;

            case 250:
                tConfig = TWAI_TIMING_CONFIG_250KBITS();
                break;

            case 500:
                tConfig = TWAI_TIMING_CONFIG_500KBITS();
                break;

            case 800:
                tConfig = TWAI_TIMING_CONFIG_800KBITS();
                break;

            case 1000:
                tConfig = TWAI_TIMING_CONFIG_1MBITS();
                break;

            case 1024:
                tConfig = TWAI_TIMING_CONFIG_1MBITS();
                break;

            default:
                tConfig = TWAI_TIMING_CONFIG_500KBITS();
                break;
        }

        twai_filter_config_t fConfig = TWAI_FILTER_CONFIG_ACCEPT_ALL();
        ESP_ERROR_CHECK(twai_driver_install_v2(&gConfig, &tConfig, &fConfig, &_handler));
        ESP_ERROR_CHECK(twai_start_v2(_handler))
【经验分享】CANOPEN协议驱动移植(基于CANfestival源码架构) 基于STM32F4的CANOpen移植教程(超级详细)谈谈自己对CANOPEN协议的驱动移植理解。每个移植CANOPEN协议的请务必认真阅读《周立功CANopen 轻松入门》,其中的内容生动形象,对你移植CANOPEN代码会有很大帮助。CANopen的难点在于需要掌握的知识点比较多,如果没有移植过类似于Ethercat等协议,对新手来说并不算容易。如果移植过协议类驱动,那入手相对容易一些。 阅读详情

相关推荐

esp32移植canopen协议栈(四)

本文续接上一篇文章,上一个工程中我们已经实现了定时器,本文我们正式开始移植canfestival (canopen协议栈的一种),这个网上的介绍很多,感兴趣的可以搜一下,本文着重介绍其移植过程。本文成功移植canfestival,并让其工作起来。

qq_50267418的博客 1680

esp32移植canopen协议栈(一)

本文搭建一套esp32三与canopen的教程。关键字esp32s3 , espidf, 现代c++,canopen。本文从0开始搭建了esp32s3的esp-idf开发环境,能正常工作。

qq_50267418的博客 730

工业通信开源协议栈实战指南:EtherCAT、OPC UA、CANopen等主流方案解析

现场总线与工业以太网协议是工业自动化、嵌入式系统及物联网领域实现设备互联互通的核心技术基础。其工作原理在于定义了一套标准化的数据帧格式、通信时序与设备模型,确保不同厂商的控制器、驱动器与传感器能够可靠、实时地交换数据。掌握开源协议栈的技术价值在于,它提供了对通信过程前所未有的透明度与可控性,允许开发者深入底层调试,并大幅降低了原型开发与商业化的授权成本。在智能制造、边缘计算、设备联网等应用场景中,开源实现已成为构建灵活、可定制化通信解决方案的关键选项。本文聚焦于EtherCAT、OPC UA等主流协议的开源

weixin_33805992的博客 443

ESP32学习笔记22-TWAI-CAN

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLKS2F9o-1683446811252)(picture/image-20230422223419594.png)]通过配置twai_general_config_t 结构图中的tx_queue_len= 0,来设置。twai_general_config_t 这个结构体定义了twai的一些基本配置。2) 重复发送ping消息,直到收到来自slave的ping响应。4) 向slave发送停止命令并等待slave的停止响应。

Car12 3793

CANdemo:使用ESP32的Arduino内核的2节点CAN总线演示

坎德莫 使用ESP32的Arduino内核的2节点CAN总线演示 作者:迈克尔·西科拉(Michael Sikora) 硬件:2个带ESP32模块的Adafruit Huzzah32羽毛板。 2个带有SN65HVD230 CAN收发器的CJMCU-230板。 除去CAN_H和CAN_L之间的120欧姆电阻。 4倍电位器,我使用的是额外的A500K。 2个Adafruit的锂离子聚合物电池。 我使用的是2500 mAh和一个很小的电池(已擦掉mAh标签) 连接数 两种ESP相同ESP32 ----------------- CJMCU-230 A4 ----------------- CRX A5 ----------------- CTX 3V ----------------- 3V3 GND ----------------- GND 更新2018.02.23 A1,A2,A3

ESP32-CAN-Transmiter:设计基于ESP32的设置,以基于发动机RPM和喷油器占空比驱动液位计,螺线管,用于金属控制器的继电器

ESP32-CAN变送器 设计设置以从Mini Cooper CANBUS抓取文件并将其发送到智能手机上的Track Addict

CANOPEN主站的C和C++实现源代码.zip

CANopen主站 * 网络管理 *自动发现网络上的节点 *可动态加载的驱动程序 *具有加速和分段模式传输的SDO客户端 * EDS阅读器 * REST接口,用于基于EDS访问对象词典 *用于测试的虚拟CANopen节点 *具有加速和分段模式传输的SDO服务器 *虚拟节点可通过ini文件进行配置 * CAN-TCP桥接器 *通过TCP传输原始CAN帧 *交通监控 *包含用于监视和解释CANopen流量的工具 *支持Linux Socket CAN *可以轻松移植到其他平台

π_RL:解锁流匹配VLA强化学习后训练的关键技术与实战解析

本文深入解析了π_RL框架如何通过流匹配(flow matching)与强化学习(RL)的结合,解决视觉语言动作模型(VLA)在后训练中的关键挑战。详细介绍了Flow Noise和Flow SDE两大核心技术,以及它们在机器人控制任务中的实战效果,显著提升了模型的性能、数据效率和泛化能力。

weixin_29061531的博客 216

Unity海康视屏对接

通过对接海康SDK,获取视屏流回调。经过解码得到YUV格式的图片,最后通过Shader把YUV数据显示出来。也可以通过Rtsp协议,直接获取视屏流显示。这个貌似Unity中已经有插件支持了,UMP。------2018.4.20using UnityEngine;using System.Collections;using System;using UnityEngine.UI;using Sys...

Witness_K的博客 2019

MT9V034摄像头学习笔记(一)_mt9v034摄像头循迹代码(1)

函数名称:uint8_t SCB_RegRead(uint8_t Device,uint8_t Address,uint16_t *Data)* 函数名称:uint8_t SCB_RegWrite(uint8 Device,uint8 Address,uint16 Data)* 函数名称:uint8 SCCB_SendByte(uint8 Data)* 函数名称:uint8 SCCB_ReadByte(void)* 修改时间:2018年3月4日。* 修改时间:2018年3月4日。

2401_87555661的博客 897

中远麒麟堡垒机 SQL注入漏洞复现

中远麒麟堡垒机/baoleiji/api/tokens接口处存在sql注入漏洞,未经身份认证的攻击者可通过该漏洞获取数据库敏感信息及凭证,最终可能导致服务器失陷。

0xSec 2985

数学工具箱:Clarke与Park变换

本文详细解析了FOC(磁场定向控制)中的核心数学工具——Clarke变换与Park变换。首先阐述了坐标变换的必要性:将复杂的三相交流系统简化为直流系统,便于精确控制。Clarke变换将三相静止坐标系转换为两相静止坐标系,减少变量数量;Park变换进一步将两相静止坐标系转换为两相旋转坐标系,实现交流量到直流量的转换。文章提供了两种变换的数学公式、物理意义图解及C语言实现代码,并简要介绍了逆变换过程。这些变换为电机控制提供了关键的数学基础,后续将结合GD32F303的FPU特性进行优化实现。

汽车电子软件领域知识分享 167

在 ABAP 环境中创建 Job Catalog Entry 和 Job Template 的完整实践指南

摘要:本文介绍了SAP BTP ABAP环境中Application Job的云原生解决方案,对比传统后台作业模式。重点阐述了Job Catalog Entry和Job Template两大核心概念,通过库存重估业务场景演示如何实现可调度类、创建Job Catalog Entry及Job Template。文章详细说明了从ABAP类到Job Catalog Entry再到Job Template的完整链路,并分享实际项目中的设计经验和注意事项,帮助开发者将传统后台作业迁移到Application Job框架

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 225

38.XDMA寄存器详解2-H2C、C2H通道寄存器组剖析

目录 1.上节回顾 2. H2C寄存器剖析 2.1 H2C通道标识寄存器(0x00) 2.2 H2C通道控制寄存器(0x04) 2.3 H2C通道状态寄存器(0x40) 2.4 H2C通道完成描述符数量寄存器(0x48) 2.5 H2C通道对齐寄存器(0x4C) 2.6 H2C通道查询模式回写地址寄存器(0x88、0x8C) 2.7 H2C通道中断掩码寄存器(0x90)​ 2.8 H2C通道性能监视控制寄存器(0xC0) 2.9 H2C通道周期计数性能寄存器(0xC4、0xC8) 2

一个早起的程序员 5194

模型训练篇 | 手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程

手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程。本篇文章将带你学习 ResNet50 模型构建、ResNet50训练自己数据集、数据集处理、推理和验证、模型剪枝与模型改进等。 本篇教程适配各种分类识别任务,可以说是一个通用的教程,只需修改自己的数据集即可完成自己领域的任务和系统实现。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 706

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: esp32移植canopen协议栈(一)
下一篇: esp32移植canopen协议栈(三)
淋过很多场雨
博客等级 码龄6年 130粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值