【嵌入式开发】单片机CAN配置详解

0 前言

  CAN外设作为一种传输速率较高,且连线较为简洁的通信协议,如今很多单片机内部都集成了CAN控制模块,这样只需要再外接一个CAN收发芯片,将TTL/CMOS电平转换成CAN协议的差分电平,就是一个完整的CAN收发节点。
  最近在做一个小项目,需要基于GD32的芯片来开发CAN应用,在CAN配置上遇到一些问题,遂整理成本文。

由于CAN节点的电路的核心就是CAN收发芯片,而且一般可以直接使用芯片数据手册的推荐电路,所以这个电路还是比较简单的,因此硬件设计不在本文讨论范围内。

1 终端电阻与接线

  CAN电路有两种形式,一种是开环形式,即两根信号线不连接,这种需要在总线上串联一个2.2kΩ的电阻,另一种是闭环的形式,这种需要在两根信号线上跨接(并联)一个120Ω的电阻。一般来说,闭环形式使用较多。
在这里插入图片描述

  因此,排查CAN总线电路是否正确的一个粗略方式就是拿电表测一下两根信号线之间的的阻值,正常应该是两个120Ω的并起来,即60Ω,如果不对的话,就可以考虑是不是多接了电阻。因为当挂载多个CAN节点时,有可能会多连电阻。

  另外,接线上,常规只需要连接两根线即可,CAN_L和CAN_H,但如果干扰比较严重的话,可以考虑再接上地线。

2 波特率配置

  CAN波特率的配置是首要的,这个直接决定了CAN分析仪是否能够收到数据。单片机中配置波特率的公式为

波特率 = A P B 1 C l o c k ( 1 + C A N _ B S 1 + C A N _ B S 2 ) ∗ C A N _ P r e s c a l e r \text{波特率}=\frac{APB1Clock}{\left( 1+CAN\_BS1+CAN\_BS2 \right) \,\,* CAN\_Prescaler} 波特率=(1+CAN_BS1+CAN_BS2)CAN_PrescalerAPB1Clock

这里最大的问题就是这个+1,到底要不要+1,哪个变量+1,需要深入理解CAN时序以及单片机的固件库。

  参考这篇文章,CAN的时序图如下所示。

在这里插入图片描述

即一个电平过程包含固定时间的SS段,以及可调时间的PTS段,PBS1段和PBS2段。之所以要调各个段的时间(单位时间的个数),主要是为了设置采样点所在的位置。因为实际的信号曲线绝不是横平竖直的方波,而是带曲率和波动的,那么什么时候采样就很重要。
  采样点之前的时间叫做建立时间,即信号稳定所需要的时间,采样点之后叫做保持时间,即采样之后这个信号保持多久。一般来说,频率越高,建立时间的比例要越长。保持时间的长短取决于芯片的硬件特性,即MOS管的导通时间,一般会有一个最低要求(ns级别),CiA(CAN in AUTOMATION,推广CAN协议的非营利性组织)推荐的比例(建立时间 / (建立时间+保持时间))为

波特率比例
>800K75%
>500K80%
<=500K87.5%

  再来看看STM32/GD32中CAN配置对应的时序(还是上面那篇文章)

在这里插入图片描述

其实都差不多,只是把PTS和PBS1合并成BS1了,BS2对应PBS2。然后再来看看数据手册(GD32F4)中配置这些参数的寄存器描述

在这里插入图片描述
在这里插入图片描述

以及固件库代码的写法:

在这里插入图片描述
所以可以发现一个问题:寄存器的值和实际表示的值相差1,这是因为计算机里面的范围都是从0开始算的,但是代码上通过宏定义来抹平了这个误差。CAN_BT_BS2_3TQ就是指BS2段占3个单位时间,不必再+1或-1。
  那BAUDPSC(也就是prescale参数)参数呢?应该也相 差1才对,比如这里是10位二进制,寄存器中数值范围应该是0-1023,但实际上调用时是直接传入真实值,即1-1024,这是因为在函数定义中,有对这个数值进行处理:

在这里插入图片描述

  那单位时间是怎么算的?显然,直接用总线时间除以总单位数即可,而总单位数等于SS+BS1+BS2,其中SS固定一个单位时间,所以最后看到的表达式为 总线时间 / (1+BS1+BS2)
  最后还有一个是SJW参数,这个是用来同步补偿的,值越大,可补偿的范围越大,可以理解为可以容忍的误差越大,这个需要根据实际系统情况进行调整,不影响波特率的计算

3 总线收发相关配置

  主要就是这个结构体内部字段的配置,只设置ENABLEDISABLE即可
在这里插入图片描述

可以根据实际需要进行设置。

4 过滤器配置

5 中断与接收

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/470744.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机安装Ubuntu 24.04服务器版(命令行版)

这个是专门用于服务器使用的&#xff0c;没有GUI&#xff0c;常用软件安装&#xff0c;见 虚拟机安装Ubuntu 24.04及其常用软件(2024.7)_ubuntu24.04-CSDN博客https://blog.csdn.net/weixin_42173947/article/details/140335522这里只记录独特的安装步骤 1 下载Ubuntu 24.04安…

ctfshow-web入门-SSTI(web361-web368)上

目录 1、web361 2、web362 3、web363 4、web364 5、web365 6、web366 7、web367 8、web368 1、web361 测试一下存在 SSTI 注入 方法很多 &#xff08;1&#xff09;使用子类可以直接调用的函数来打 payload1&#xff1a; ?name{{.__class__.__base__.__subclasses__…

Axure网络短剧APP端原型图,竖屏微剧视频模版40页

作品概况 页面数量&#xff1a;共 40 页 使用软件&#xff1a;Axure RP 9 及以上&#xff0c;非软件无源码 适用领域&#xff1a;短剧、微短剧、竖屏视频 作品特色 本作品为网络短剧APP的Axure原型设计图&#xff0c;定位属于免费短剧软件&#xff0c;类似红果短剧、河马剧场…

如何从头开始构建神经网络?(附教程)

随着流行的深度学习框架的出现&#xff0c;如 TensorFlow、Keras、PyTorch 以及其他类似库&#xff0c;学习神经网络对于新手来说变得更加便捷。虽然这些框架可以让你在几分钟内解决最复杂的计算任务&#xff0c;但它们并不要求你理解背后所有需求的核心概念和直觉。如果你知道…

JS 实现SSE通讯和了解SSE通讯

SSE 介绍&#xff1a; Server-Sent Events&#xff08;SSE&#xff09;是一种用于实现服务器向客户端实时推送数据的Web技术。与传统的轮询和长轮询相比&#xff0c;SSE提供了更高效和实时的数据推送机制。 SSE基于HTTP协议&#xff0c;允许服务器将数据以事件流&#xff08;…

HTML之表单学习记录

如果一个页面仅仅供用户浏览&#xff0c;那就是静态页面。如果这个页面还能实现与服务器进行数据交互&#xff08;像注册登录、话费充值、评论交流&#xff09;​&#xff0c;那就是动态页面。表单是我们接触动态页面的第一步。其中表单最重要的作用就是&#xff1a;在浏览器端…

WPF学习之路,控件的只读、是否可以、是否可见属性控制

C#的控件学习之控件属性操作 控件的只读、是否可以、是否可见&#xff0c;是三个重要的参数&#xff0c;在很多表单、列表中都有用到&#xff0c;正常表单控制可以在父层主键控制参数是否可以编辑和可见&#xff0c;但是遇到个别字段需要单独控制时&#xff0c;可以在初始化wi…

three.js 杂记

clip&#xff1a; 1&#xff1a; 着色器 #ifdef USE_CLIP_DISTANCE vec4 worldPosition modelMatrix * vec4( position, 1.0 ); gl_ClipDistance[ 0 ] worldPosition.x - sin( time ) * ( 0.5 ); #endif gl_Position projectionMatrix * modelViewMatrix * vec4( positio…

基于混合配准策略的多模态医学图像配准方法研究

摘要&#xff1a; 提出了一种由“粗”到“细”的混合配准策略&#xff0c;该配准策略吸取了以往配准方法的优点&#xff0c;且在细配阶段将基于特征的配准方法和基于灰度的配准方法结合在一起&#xff0c;提出了基于轮廓特征点集最大互信息的配准方法&#xff0c;从而在速度和精…

贪心算法入门(二)

相关文章 贪心算法入门&#xff08;一&#xff09;-CSDN博客 1.什么是贪心算法&#xff1f; 贪心算法是一种解决问题的策略&#xff0c;它将复杂的问题分解为若干个步骤&#xff0c;并在每一步都选择当前最优的解决方案&#xff0c;最终希望能得到全局最优解。这种策略的核心…

Autosar CP 基于CAN的时间同步规范导读

Autosar CP 基于CAN的时间同步规范主要用途 实现精确时间同步 提供了一种在CAN总线上准确分发时间信息的机制&#xff0c;确保连接到CAN网络的各个电子控制单元&#xff08;ECU&#xff09;能够共享精确的公共时间基准&#xff0c;对于需要精确时间协调的汽车系统功能&#xff…

前端常用布局模板39套,纯CSS实现布局

前端常用布局模板39套&#xff0c;纯CSS实现布局 说明 写博客、官网、管理后台都可以参考以下布局模板&#xff0c;实现模板布局的方式包含&#xff1a;flex、CSS、HTML5、Layout。 不需要下载积分&#xff0c;没有特殊库引用&#xff0c;不用安装任何插件&#xff0c;打开资源…

jmeter常用配置元件介绍总结之后置处理器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之后置处理器 8.后置处理器8.1.CSS/JQuery提取器8.2.JSON JMESPath Extractor8.3.JSON提取器8.4.正则表达式提取器8.5.边界提取器8.5.Debug PostProcessor8.6.XPath2 Extractor8.7.XPath提取器8.8.结果状态处理器 8.后置处理…

边缘计算在智能交通系统中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 边缘计算在智能交通系统中的应用 边缘计算在智能交通系统中的应用 边缘计算在智能交通系统中的应用 引言 边缘计算概述 定义与原…

Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件

Vue 项目打包后环境变量丢失问题&#xff08;清除缓存&#xff09;&#xff0c;区分.env和.env.*文件 问题背景 今天在导报项目的时候遇到一个问题问题&#xff1a;在开发环境中一切正常&#xff0c;但在打包后的生产环境中&#xff0c;某些环境变量&#xff08;如 VUE_APP_B…

十三、注解配置SpringMVC

文章目录 1. 创建初始化类&#xff0c;代替web.xml2. 创建SpringConfig配置类&#xff0c;代替spring的配置文件3. 创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4. 测试功能 1. 创建初始化类&#xff0c;代替web.xml 2. 创建SpringConfig配置类&#xff0c;代替spr…

(干货)Jenkins使用kubernetes插件连接k8s的认证方式

#Kubernetes插件简介 Kubernetes 插件的目的是能够使用 Kubernetes 配合&#xff0c;实现动态配置 Jenkins 代理&#xff08;使用 Kubernetes 调度机制来优化负载&#xff09;&#xff0c;在执行 Jenkins Job 构建时&#xff0c;Jenkins Master 会在 kubernetes 中创建一个 Sla…

俏美韵从心出发,与女性一道为健康生活贡献力量

近期发布的《2025 全球食品与饮料》报告中显示&#xff0c;“回归本源”为2025年食品饮料赛道的趋势之一&#xff0c;消费者对于产品成分要求越来越严格&#xff0c;尤其是女性消费者&#xff0c;对成分是否自然&#xff0c;营养含量等方面越来越看重&#xff0c;俏美韵品牌从产…

区块链技术在慈善捐赠中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 引言 区块链技术概述 定义与原理 发…

mongoDB的安装及使用

mongodb的安装参考&#xff1a; Centos系统中mongodb的安装详解_centos安装mongodb-CSDN博客 不要下载最新的版本&#xff0c;新的版本中mongo命令无法使用&#xff0c;也就是安装后不能通过mongo命令登录&#xff0c;我这里使用5.0.30版本&#xff1b; mongodb客户端demo: …