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

devtools/2024/11/15 4:02:33/

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/GD32CAN配置对应的时序(还是上面那篇文章)

在这里插入图片描述

其实都差不多,只是把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.ppmy.cn/devtools/133764.html

相关文章

CLion配置QT开发环境

一、将qmake工程转为cmake工程&#xff08;方法一&#xff1a;用工具转换并做适当修改&#xff09; 1、工具链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1grW2QY3sW8X2JaHWM_ePPw 提取码&#xff1a;7at4 工具源码:https://github.com/milahu/qmake2cmake 2、执行…

发布 VectorTraits v3.0(支持 X86架构的Avx512系列指令集,支持 Wasm架构及PackedSimd指令集等)

文章目录 支持 X86架构的Avx512系列指令集支持Avx512时的输出信息 支持 Wasm架构及PackedSimd指令集支持PackedSimd时的输出信息VectorTraits.Benchmarks.Wasm 使用说明 新增了向量方法支持 .NET 8.0 新增的向量方法提供交织与解交织的向量方法YGroup3Unzip的范例代码 提供重新…

python实战(八)——情感识别(多分类)

一、任务目标 本文使用的是来自Kaggle的一个情感识别数据集&#xff0c;这个数据集的总数据量是5934条&#xff0c;标签为anger、fear、joy三种情感的其中一种&#xff0c;很明显是一个多分类任务。这里&#xff0c;我们将使用微调技巧进行深度学习建模&#xff0c;同时我们会比…

Makefile与CMake回顾

一、Makefile 1.gcc编译 预处理--->编译---->汇编---->链接 预处理&#xff1a;展开头文件&#xff0c;替换宏&#xff0c;删除注释 gcc -E ***.c -o ***.i 编译&#xff1a;检查语法的正确性&#xff0c;生成汇编文件 gcc -S ***.i -o ***.s 汇编&#xff1a;把汇编…

【Python进阶】Python网络协议与套接字编程:构建客户端和服务器

1、网络通信基础与网络协议 1.1 网络通信模型概述 网络通信是信息时代基石&#xff0c;它如同现实世界中的邮递系统&#xff0c;将数据从一处传递到另一处。其中&#xff0c;OSI七层模型与TCP/IP四层或五层模型是理解和构建网络通信的基础。 1.1.1 OSI七层模型与TCP/IP四层/…

Go语言的并发安全与互斥锁

线程通讯 在程序中不可避免的出现并发或者并行&#xff0c;一般来说对于一个程序大多数是遵循开发语言的启动顺序。例如&#xff0c;对于go语言来说&#xff0c;一般入口为main&#xff0c;main中依次导入import导入的包&#xff0c;并按顺序执行init方法&#xff0c;之后在按…

VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

如何对PHP的API接口权限认证

对PHP的API接口进行权限认证是确保只有授权的用户或应用程序可以访问特定API资源的重要环节。以下是一些常用的PHP API接口权限认证方法&#xff1a; 一、API密钥&#xff08;API Key&#xff09; API密钥是一种简单的鉴权方式&#xff0c;通常用于限制对API的访问。每个用户…