首页 > 其他分享 >CANFD通信基础配置与介绍

CANFD通信基础配置与介绍

时间:2024-10-14 22:22:38浏览次数:10  
标签:控制器 错误 配置 CANFD 通信 传输 REC 节点

英飞凌TC397的CAN接口符合CAN 2.0B标准,支持高速、低速和单线CAN通信。它具有丰富的CAN控制功能、数据缓存、错误检测和纠错机制,可保证稳定、可靠的通信。该微控制器还支持CAN FD(Flexible Data-Rate)协议,可提供更高的数据传输速率和更灵活的通信方式。CAN通信是车载局域网通信的主要实时控制网络,目前行业内CANFD是主流的CAN通信方式,CAN FD帧具有向下兼容BasicCAN的特点,可以更快地传输的有效负载可缩短传输时间,即总线负载率降低。另一方面,可以同时传输更长的数据场,即只需使用一个CANFD帧。

在Can模块中主要是配置通道地址的选择,收发信号类型等,首先要确定你要配置哪个can通道,可以在对应的硬件手册中查到这个通道对应的CanController BaseAddress,一般情况下,CanBusoff,CanRx,CanTx,CanWakeup配置成中断形式。如果要配成INTERRUPT类型的,则需要Irq以及Os模块来配合使用。波特率的配置可以参考公式,根据你计算的值配置好就行,如果需要配置,则只需要在CanController FdBaudrateConfig中配置相应的参数即可。

1 CAN通信介绍

1.1 CAN电平

TC397MCU有3个CAN内核,每个kernel各有4个节点,理论上可以支持12路can

1.2 帧类型

CAN帧分类有数据帧,远程帧,错误帧》

1.3 CAN波形

数据传输正确的基本前提是网络中通信节点之间同步。起始位(帧起始-SOF)的隐性至显性的跳变沿用于同步CAN报文。之后重同步( resynchronization )机制用于保持同步,直到报文传偷结束为止。重同步机制基于对隐性至显性跳变沿的评估。位填充机制保证了传输过程中有足够的跳变沿。ISO 11898-1规定,发送方在传输确定续5个相同位后必须传输一个相反的位;即使连续5个相同位后本就是一个相反位,也需要添加填充位。由于位填充从以SOF的传输为开始,以CRC序列的最后一位的传输为结束,因此在传输包含8个数据字节的标准格式的数据帧时,在极限情况下,应有24个填充位。所以,理论上标准格式教据帧最多包含132位。

1.4 采样点

车载通信中CAN传输段波特率为500Khz,CANFD数据段波特率为2Mhz,采样点设置CAN 75%,CANFD为80%。

MCU配置的对应于CAN时钟为Fsys系统时钟,经过BRP分频系数分频后为Fcan,通过(3)可以算出传输一个tq的时间为:50ns,位时间为:2us,可以计算出传输一个bit一共需要40个,其中采样点80%可以由计算出Tprop

需要的时间23个Tq,相位缓冲段Tb1和Tb2需要的时间为8个Tq,CANFD数据段波特率和CAN计算相同。

1.5 报文过滤

节点通过控制器中过滤码(Filter Code )和掩码(Mask Code),再检验总线上消息的标识符,来判断是否接收该消息(Message Filtering)。FilterMask是Rx过滤器,通过对过滤器的设置可以过滤特定的CanID的数据,也可以接收任意CanID的数据。应用时,应根据实际接收的报文配置,最大限度降低Controller的性能损耗。

1.6 CAN错误跟踪

为在网络范围内确保数据一致,CAN网络中的每个节点都有权终止任何被认为是故障的CAN报文。将正确CAN报文错人为故障的CAN节点同样具有此权利。为防止传输介质发生拥堵,CAN协议规定了错误跟踪,用于确保CAN节点能够区分体偶发干扰和持久性干扰。

每个CAN控制器都有一个TEC (Transmit Error Counter,发送错误计数器)和一个REC (Receive Error Counter,接仅错误计数器)。如果数据帧或远程帧传输成功,相关的错误计数器将递减(TEC=TEC-1;REC=REC-1)。错误标志的检测和后续传输会导致相关错误计数器根据特定规则递增。对于发送方,适用以下规则:TEC=TEC+8。检测到错误的接收方将其REC递增一个单位(REC=REC+1)。对于引起错误的接收方,适用以下规则:REC=REC+8。

1)主动错误(ErrorActive)

根据特定的错误计数,CAN控制器可以切换错误状态。CAN控制器启动后将进入"主动错误"正常状态。在该状态下CAN控制器在检测到错误后发送六个显性位(主动错误标志)。超出限制(TEC>127;REC>127)时,CAN控制器将切换为"被动错误(Error Passive)"状态。

2)被动错误(Error Passive)

处于"被动错误"状态的CAN控制器只能通过发送六个相同的隐性位来指示检测到的错误。这可以防止检测错误的接收方将检测到的错误全局化。此外,发送两个连续的数据帧或远程帧时,处于"被动错误"状态的CAN控制器必须等待"暂停传输时间"(8个位)。

3)Bus Off

如果CAN控制器发生故障或错误累积过多,则会进入"Bus Off"状态,CAN控制器与CAN总线断开连接。只能通过软件恢复(强制等待时间为128x11位)或通过硬件复位来退出"Bus-Off"状态

2 CAN基础配置

驱动层的主要配置包括采样点、FilterMask、报文收发上下文处理和Mailbox的设计分配。

Mailbox分为Full CAN和Basic CAN,在CAN Driver中的Full CAN与Basic CAN是用来修饰HOH的类型参数,该参数可以通过CanObejctType进行定义。

Full CAN一般表示”一对一“仅存在1个的Hardware Object与之对应,且该Full CAN类型的Hardware Object与特定的CAN ID Message绑定(常用于应用报文);

Basic CAN一般表示”一对多“存在1个或者多个的Hardware Object与之对应,且该Basic CAN类型的Hardware Object与非特定的CAN ID Message或者一定范围内的CAN ID Message绑定;当硬件资源较为充足且无需过多考虑新数据可能覆盖老数据的场景,一般推荐将HOH配置成FULL CAN类型。(常用于NM和部分节点的NM报文);

2.1 引脚分配TX/RX

MCU控制的CAN Controller可以接在这些引脚上。

2.2 中断、轮询

1) 当节点采取轮询方式发送,需要添加 CanMainFunctionRWPeriods的配置 CanMainFunction Read/Write周期。

2) CanBusoffProcessing: BusOff 事件采用中断方式处理 CAN节点 。

3) CanRxProcessing/CanTxProcessing :设置CAN节点报文TX/RX为轮询/中断方式。

4)CanControllerBaseAddress :配置的 CAN节点的地址值,参考SRC中断源地址。

2.3 波特率配置

一路 CAN 节点可以对应多 组波特率配置,配置CanControllerBaudrateConfig参数,参考企标中DBC要求采样点和波特率设置。

CanControllerTrcvDelayCompensationOffset:配置 CAN 节点 CANFD 延时补偿时间。

配置项

仲裁场Baudrate Prescaler

4

仲裁场Baudrate

500Hz

仲裁场Prop Seg

23

仲裁场Seg1

8

仲裁场Seg2

8

仲裁场SJW

8

数据场Baudrate Prescaler

2

数据场Baudrate

2000Hz

数据场Prop Seg

11

SSP

15

数据场Seg1

4

数据场Seg2

4

数据场SJW

4

2.4 Can HardwareObject 配置

配置 CAN 节点的发送 MO(Message Object)参数。

1)CanHandleType :配置BASIC, FULL

2)CanIdType :配置帧类型EXTENDED, MIXED, STANDARD

3)CanObjectType :配置RECEIVE, TRANSMIT

4)CanMainFunctionRWPeriodRef:若CAN 节点是采用轮询方式收发,则隶属于该节点的 MO 需要添加轮询周期

2.5 滤波配置

接收节点通过控制器中过滤码(Filter Code )和掩码(Mask Code)。

根据can需要接收的Id范围,按位&运算获得掩码,过滤码关心bit为1,其它设为0。

3 IRQ配置

配置 CAN 节点发送中断,当CAN节点发送采用中断方式,需要配置 Irq 模块。

1)IrqCanSRnPrio  : 配置CANn发送中断优先级。

2) IrqCanSRnCat  :配置CAT1, CAT2​。​

3) IrqCanSR0Tos :配置CPU0, CPU1, CPU2, CPU3, CPU4, CPU5, DMA。

标签:控制器,错误,配置,CANFD,通信,传输,REC,节点
From: https://blog.csdn.net/wklweiran/article/details/142930495

相关文章

  • vite打包 删除console,还有拆分太大的包配置
    在Vite中,你可以通过使用Rollup插件来自动去除console.log语句。一个常用的插件是rollup-plugin-terser,它能够压缩和优化代码,包括去除调试语句。以下是如何在Vite中配置该插件的步骤:安装插件:首先,你需要安装terser和rollup-plugin-terser:npminstallterserrollu......
  • React组件通信
    React组件通信一、父传子方式1:​通过在子组件标签上设置属性值传递,子组件函数通过props参数接收如://定义子组件functionSon(props){//通过标签属性传递,属性以及对应的值都会通过props参数接收return<div>父组件传递的属性值:name={props.name}</div>......
  • C++在vscode中的code runner配置/环境配置
    C++在vscode中快捷运行(coderunner)一、配置tasks.json在vscode中创建文件夹或打开文件夹,会发现文件夹下多了一个.vscode文件夹,在该文件夹下创建tasks.json文件,并添加一下内容{"version":"2.0.0","tasks":[{"type":"shell","la......
  • Neo4j的下载与配置
    本篇文章为java8与配套的neo4j的下载与配置一、JDK的检查注意如果下载过多个java版本,需要使jdk1.8的环境变量在其他版本上面cmd中输入java,出现下面的显示,说明下载成功二、Neo4j的下载与环境变量配置1.Neo4j的下载从Neo4j官网中下载Neo4jcommunity版本(注意要下载3.xx版......
  • WebSecurityConfigurerAdapter 关于成功之后页面跳转的配置
    packagecom.feitai.auth.config;importcom.feitai.manager.PtfUserDetailsManager;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annota......
  • 但是将一个项目构建成image的挑战有很多: 依赖、环境变量、绝对路径、网路配置、打包
    但是将一个项目构建成image的挑战有很多:依赖、环境变量、绝对路径、网路配置.比如我具体遇到的报错:1.依赖问题:有一个pythonpackage使用的是github安装而不是pypi的包,所以需要自定义一下conda导出的依赖2. 环境变量问题:后台需要读取环境变量中的文件,如token、ap......
  • 华为交换机配置-链路聚合
    1.链路聚合(Eth-Trunk)等于思科的端口聚合1.模式手工模式(manaualload-balance):在这种模式下,Eth-Trunk的建立、成员接口的加入均由手动配置,系统之间不使用LACP进行协商。正常情况下,所有链路都是活动链路,都参与数据的转发并平均分担流量。如果某条活动链路发生故障,链路聚合组会自......
  • 配置supermap iportal数据库,银河麒麟arm架构SP3系统中离线编译安装postgres、postgis
     一、安装环境准备postgresql-11.2.tar.gz、postgis-2.5.0.tar.gz文件,geos-3.6.1-12.ky10.aarch64.rpm包,再准备一台有外网的机器。如果遇到缺少的包,去有外网的机器下载,再考到内网机器里安装。大部分安装都是编译安装,遵循配置、编译、安装这三步。注意安装后的软件目录postgre......
  • OpenHarmony的init程序、init配置与启动项配置
    1.init程序编译完后部署在/bin/init2.init程序的启动配置文件为/system/etc/init.cfg看一下内容与格式: 3.init程序的后续启动脚本放置目录为 /system/etc/init/里面是以.cfg结尾的文件,我们看一下其中的1个重要启动项配置文件appspawn.cfg:这个文件在源码中保存在:./b......
  • vue之间的传值问题---6eventbus 可以实现兄弟组件通信
    1.传递数据的组件:通过eventbus中的方法$emit来发布自定义事件,并且传递数据2.接收数据的组件:通过eventbus中的方法$on来订阅事件,并通过回调函数接收数据//手写发布订阅模式classEventBus{//记录事件和回调clientList={send:[()=>{},()=>{}],}//......