CAN 总线波特率的自适应算法设计_stm32 can 自适应波特率-程序员宅基地

技术标签: 科技  算法  自动化  

原创 陈海峰、苏永辉等 嵌入式系统专家之声 2023-12-23 07:00 发表于北京

嵌入式系统专家之声

嵌入式系统专家之声依托嵌入式系统联谊会专家团队,汇集嵌入式系统产、学、研和媒体的专业资源,为物联网、人工智能、智能制造和智能系统技术和产业发展出谋划策,重点关注嵌入式系统基础软件、处理器和芯片技术、生态和产业发展。

50篇原创内容

公众号

0

引言

CAN 总线是目前应用十分广泛的现场总线,其仅通过一对差分信号线即可实现网络中各节点之间的互联和信息交互,具有极强的抗干扰能力[1-3]。CAN 总线采用非破坏性仲裁技术和自动重发机制,不仅能有效避免总线冲突,还能确保各节点数据的可靠传输[4-5]。此外,CAN 总线还具有实时性强、可靠性好、标准化程度高等优势[6-7]。基于此,CAN总线被广泛应用于工业控制、汽车制造、仪器仪表、煤矿智能系统等多个领域。

CAN网络中的节点不分主从,因此通信方式灵活,网络扩展性强,受限于CAN总线驱动电路,目前CAN网络组网节点数最大可达110个。对于确定的CAN网络,往往会因为应用需求而向其中引入新的功能节点,为了使新节点能够与网络中原有节点进行可靠通信,必须确保新节点的波特率与CAN总线波特率一致。通常,新节点的程序已固化在存储器中,波特率的修改或配置困难,从而可能导致新节点的波特率无法匹配网络波特率。为解决 CAN 总线波特率的匹配问题,参考文献[8]和[9]通过对设定阈值与产生的错误计数值和接收到的正确报文数进行比较来修改和匹配波特率,该方法存在阈值选取合理性问题,且采用 FPGA 开发,不易推广;参考文献[10]采用波特率轮询法,通过检测 CAN 控制器是否产生错误来调整和匹配波特率,方法简单,易于实现,但在收、发双方波特率较接近时,可能产生误判问题;参考文献[11]通过控制器分类及判断波特率切换次数来实现波特率自适应,该方法未对切换次数达上限时进行处理,存在波特率适配不成功的可能。参考文献[12]结合轮询法和探测法,在 Linux下实现了波特率自适应。为了兼顾算法的可用性及波特率匹配的成功率,本文提出了改进的波特率自适应算法,经实际测试,新增节点能够通过发送测试报文或者接收广播报文,较快地适配网络波特率,可靠性高。

STM32F407IGT6是采用Cortex M4内核的32位高性能单片机,其内部集成两个支持CAN2.0A和2.0B协议的CAN控制器[13],用户只需外扩简单的 CAN 收发器电路即可将其接入到 CAN 网络中,从而实现与网络中各节点间的数据通信。本文基于 STM32F407IGT6 嵌入式开发平台设计了 CAN 波特率自适应算法。

1

硬件设计

STM32F407IGT6 嵌入式开发平台采用 TJA1050 作为CAN 收发器,该收发器完全兼容ISO11898标准,最高速度可达1 Mb/s,此外,还具有电磁辐射低、抗干扰能力强、接口简单等优点。该嵌入式开发平台中STM32F407IGT6与JTA1050之间的连接电路图如图1所示。

图片

图1  STM32F407与TJA1050连接电路图

STM32F407IGT6的PA11、PA12引脚可复用为片内CAN控制器收发数据的通道。由图1可知,PA11和PA12引脚分别连接 TJA1050 的串行数据线 RXD 和 TXD,然后通过收发器内部两个具有差动接收和发送能力的总线终端CANH和CANL连接到总线线路上。实验中CAN 模块均作为终端使用,为了提高网络的抗干扰能力、降低反射能量,在CANH和CANL之间连接了120Ω终端电阻。TJA1050具有两种工作模式:高速模式和静音模式,通过控制线S进行选择。为了使开发平台能够通过CAN总线实现数据收发,将控制线S连接到GND,收发器的工作模式配置为高速模式。Vref为参考电压输出端,悬空即可。

2

软件设计

CAN总线协议中位的同步通过位时序逻辑实现,位时序逻辑监视串行CAN总线,执行采样并调整采样点位置。STM32F407IGT6片内bxCAN模块通过CAN_BTR寄存器实现位时序的设置,位时序图如图2所示。

图片

图2 bxCAN 模块位时序图

在CAN 通信中,一个数据位所持续的时间称为标称位时间。由图2可知,标称位时间由同步段、位段1和位段2三部分构成,每一部分均包含若干个tq (最小时间单位),其中同步段固定为一个tq。波特率计算关系如式(1)~式(5)所示:

图片

式(3)中,tPCLK 为主控制器 APB 总线时钟的时间周期,该值在系统初始化时确定。BRP[9:0]、TS1[3:0]和TS2[2:0]为CAN_BTR 寄存器中对应的位域,其中,BRP[9:0]用于实现CAN 总线波特率预分频,TS1[3:0]和 TS2[2:0]用于确定位段1及位段2所包含的tq个数。此外,为了尽可能消除由于硬件问题带来的波特率误差,提高网络容忍度并保证总线中收发节点采样的准确性,自定义波特率时还会引入SJW(再同步跳转宽度)参数,通常 SJW 取值为1个tq。图2中,采样点位置对应位段1结束位置,通常采样点位于标称位时间75%~87.5%的位置[14-16]。

基于式(1)~(5)及采样点的设置规则,确定实验所用的波特率列表,列表中共包含15个常用波特率,取值分别为:20kb/s、33.33kb/s、40kb/s、50kb/s、66.66kb/s、 80kb/s、100kb/s、125kb/s、200kb/s、250kb/s、400kb/s、 500kb/s、666kb/s、800kb/s和1000kb/s。


CAN 总线上的节点不存在主从关系,当收、发节点波特率一致时,为了保证接收节点能够接收到发送节点的特定报文,接收节点必须结合期望报文包中的ID(消息标识符)正确配置筛选器。CAN2.0协议支持两种数据帧格式,分别是ID为11位的标准帧和ID为29位的扩展帧。本文实验根据ID的取值范围对两种帧格式下的筛选器进行了设置,因此支持对两种帧格式报文的接收。

2.1 发送报文自适应波特率

当新节点作为发送节点加入到未知 CAN 网络中时,若该节点的波特率与 CAN 网络的波特率不一致,则会导致测试报文发送失败,用户通过查询对应的 TXOKx 位,即可获取报文的最终发送状态。若确定当前波特率与网络波特率不匹配,则可通过轮询波特率列表来更改波特率,然后再次发送测试报文,若发送成功,则波特率匹配成功。发送报文实现波特率自适应的软件流程图如图3所示。

图片

图3 发送报文波特率自适应流程图

图3中,设置轮询次数为100次,也可适当减小该值以加快波特率的匹配。在发送测试报文后,通过查询CAN_TSR 寄存器中 TXOKx 位来判断发送状态,这里需要注意的是,在执行查询操作前一定要留足够的等待时间确保硬件能够完成数据的传输。由于波特率列表包含的最小波特率为20 kb/s,即传输一位所需要的时间为50μs,而一帧报文(含填充位)的最大长度不会超过150位,当 APB 总线时钟频率为42 MHz时可计算出查询状态所需的等待时间不会超过7.5 ms。在初次确定波特率正确后,通过重置轮询次数对识别结果进行再次确认,目的是尽可能提高识别的准确性,避免误判。若第二次仍能满足波特率匹配条件,则说明当前波特率与网络波特率确实一致,匹配成功。

2.2 接收报文自适应波特率

通常,原有 CAN 网络的节点都是会通过总线向网络广播报文的,因此,加入网络的新节点也可以根据接收报文的状态来修正波特率,从而达到自适应网络波特率的目的。bxCAN 模块为用户提供了错误状态寄存器 CAN_ ESR,通过查询该寄存器,可以获取总线当前的网络状态及错误信息。采用接收报文匹配波特率时,需要将新节点配置为静默模式,此时节点可以接收数据帧,但不具备发送功能。此外,为了保证新节点能够接收到任意数据包,需要将筛选器配置为标识符掩码模式,并设置掩码为0。然后,定期查询 CAN_ESR 寄存器的状态,若查询到节点产生持续错误,则可认定新节点的波特率与网络波特率不匹配,修正波特率直到查询的状态无误为止。通过接收报文实现新节点波特率自适应的软件流程图如图4所示。

图片

图4 接收报文波特率自适应流程图

错误状态寄存器 CAN_ESR 包含了接收错误计数器 REC、发送错误计数器 REC、上一次错误代码 LEC 等错误信息,并且还能根据收、发错误计数器的值对错误警告标志 EWGF、错误被动标志 EPVF及总线关闭标志 BOFF 进行设置。由于采用接收报文匹配波特率时CAN的模式被设置为静默模式,因此不会产生发送错误,也不会标记 BOFF 位。而错误代码及其他标志的设置,均由 REC 的值决定,当接收期间产生错误时,REC 值会增加,而成功接收数据后该值能够按1 递减,若能连续接收成功,则该值最终会递减到0。因此,为简化波特率匹配条件,图4 中根据 CAN_ESR 是否为0来记录错误次数。

图4中,报文的接收并未开启中断,原因是在波特率不匹配时会因为接收错误而频繁进出中断,一定程度上会增加CPU的开销。在自适应波特率期间,若查询到 FIFO(FirstInFirstOut)中有报文,则应及时从 FIFO 输出邮箱中读取报文并释放邮箱,以保证其他邮箱中的报文能够被正确读取。在确认波特率匹配成功后,CAN 的工作模式需配置为正常模式以实现收、发报文功能,筛选器也需根据接收报文的需求重新进行设置。此外,为了提高报文接收效率,应开启接收中断。

3

测试

为了方便对波特率自适应算法进行测试,这里定义10个消息标识符,其中标准ID和扩展ID各占5个。消息标识符具体定义如下:

uint32_tmsg_id[10]=

{0x111,0x222,0x333,0x444,0x555,0x11111,0x22222, 0x33333,0x44444,0x5555};

此外,设计10条报文,对应的数据部分定义如下:

uint8_tmsg_data[10][8]=

{"one","two","three","four","five","six","seven", "eight","nine","ten"};

3.1 发送报文自适应波特率测试

新节点接入 CAN 网络后,每隔50 ms发送一次测试报文。为了在波特率匹配成功时能够直观地看到接收节点收到的测试报文,这里取测试报文的ID 为0x111(可取 ID 列表中任意值),测试报文的内容取"hello"。匹配成功后,新节点每隔50 ms从 msg_data[10][8]中读取一条报文并广播到网络,接收节点收到报文后通过串口打印出来。通过发送报文实现波特率自适应的测试结果如图5所示。

图片

图5 发送报文自适应波特率的测试结果

图5中,左侧部分为新增节点轮询波特率列表时的输出结果,当波特率切换为100kb/s时,与 CAN 网络的波特率匹配成功并完成了系统初始化。右侧部分为接收节点输出结果,当波特率匹配成功后,接收节点正确地打印了新增节点发送的数据。

3.2 接收报文自适应波特率测试

新增节点接入 CAN 网络后,配置工作模式为静默模式,并监听网络上所有数据包,之后在规定时间内每隔10 ms读取一次接收状态,并根据接收状态修改或匹配波特率。当波特率匹配成功时,新节点将接收到的报文数据通过串口打印出来,以表明正确匹配了网络波特率。通过接收网络报文实现波特率自适应的测试结果如图6所示。

图片

图6 接收报文自适应波特率的测试结果

图6中,左侧部分为原网络中发送节点的输出信息,可知此时网络的波特率为 20kp/s;右侧部分为接收节点的结果,当波特率不匹配时轮询波特率列表,当波特率也是20kp/s时实现波特率匹配,之后将接收到的报文数据通过串口正确地输出。

4

结语

本文通过对 STM32F407IGT6 片内 bxCAN 模块的研究,设计了 CAN 网络新增节点通过发送报文或接收报文实现网络波特率自适应的算法。实验结果表明,本文算法具有识别率高、稳定可靠、速度快、简单易实现等优点,能有效解决 CAN网络波特率未知时新增节点的波特率配置问题,一定程度上提高了 CAN 网络通信的灵活性。

【参考文献】

[1] 黄聪.一种基于 CANFD 的长报文传输协议[J].工业控制计算机,2023,36(5):14 15.

[2] 王颖,郭丽伟,于正同,等.基于 CAN 总线的深入研究及实现[J].现代车用动力,2023(1):31 34.

[3] 韩玉龙.基于 CAN 总线的电机动态性能分析[J].太原学院学报(自然科学版),2023,41(1):63 67.

[4] 刘洁,曾海林.CAN 总线波特率自适应程序设计[J].智能制造,2020(5):54 58.

[5] 杜川川.研究嵌入式系统的 CAN 总线汽车仪表[J].汽车时代,2023(3):152 154.

[6] 黄增波.便 携式煤矿井下 CAN 总线分析仪的设计与实现[J].煤矿安全,2022,53(1):134 138.

[7] 张宏涛.一种CAN Ethernet混合网络网关自适应高度算法 [J].数字制造科学,2023,21(2):157 162.

[8] 何鑫,张会新,刘文怡,等.多通道波特率自适应 CAN 总线监测系统[J].仪表技术与传感器,2022(1):62 65,70.

[9] 李青涛,钱枫,王明达,等.CAN 总线协议自适应算法研究[J].农业装备与车辆工程,2023,61(8):120 124.

[10] 包演生,姜涛,谢钧安.CAN 波特率自适应在屏蔽门系统中的应用[J].电子设计工程,2020,28(19):7 11,16.

[11] 邓莹,徐家明,牛方兴,等.基于 CAN 通信自适应的商用车诊断系统的开发与应用[J].汽车电器,2020(8):44 47.

[12] 史小燕,朱建鸿.波特率自适应的 CAN 驱动在嵌入式Linux下 的实现[J].计算机系统应用,2018,27(1):231 234.

[13] 洪泽,张铆,陈振娇.基于 STM32F407 的 Ethernet CAN总线转换器设计[J].电子设计工程,2023,31(14):46 50.

[14] 肖彬.CAN 总线载波侦听点位测量方法研究[J].计测技术,2021,41(6):59 65.[15]CiA.CANopenapplicationlayerandcommunicationprofile[S].Nuremberg:CANinAutomation (CiA)e.V.,2011.

[16]SAE.Physicallayer,250Kbps,twistedshieldedpair[S].Warrendale:SAEInternational,2016.

[17]王颖,郭丽伟,于正同,等.基于 CAN 总线的深入研究及实现[J].现代车用动力,2023(1):31 34.

(本文由《单片机与嵌入式系统应用》杂志授权发表,原文刊发在2023年第12期)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_71057114/article/details/135209043

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签