CAN总线通讯中的位时序

本文深入探讨CAN通讯中的位时序概念,包括同步段、传播时间段、相位缓冲段等。同时,解释了时钟同步的硬同步和重同步机制,以及采样点在数据接收中的作用。此外,还介绍了波特率的计算方法,并通过实例验证了配置参数与波特率的关系。
摘要由CSDN通过智能技术生成

文章目录


0 前言

最近,在搭建HIL测试台架的过程中,遇到台架无法与域控制器进行正常CAN通讯的问题。

在确保CAN通讯介质连接正常的情况下,怀疑是波特率、采样点等通讯参数配置不正确导致的。

因此,通过查阅相关博客,对CAN通讯的位时序进行了学习,并在CANoe的CAN通道配置界面验证了自己当前的认知。

现整理出相关知识点,以便后续查看。


1 位时序的概念

CAN通讯,反映到总线介质上,是将1010这样的数据位(即高低电平序列)从发送节点传递给接收节点。由于CAN通讯属于异步通讯,没有时钟信号线,因此其可靠通讯需借助统一的位时序进行。

位时序,即CAN控制器在对总线介质上的每一个数据位进行接收时(时间为Tbit),其内部又细分为4个时序段,分别为:

  • 同步段(SS)
  • 传播时间段(PTS)
  • 相位缓冲段1(PBS1)
  • 相位缓冲段2(PBS2

就STM32而言,传播时间段与相位缓冲段1合并为一个时间段,则原来的4个时序段,变为3个时序段,分别为:

  • 同步段(SS)
  • 时间段1(BS1)
  • 时间段2(BS2)

其每个时序段对应的时间分别为:Tss、Tbs1 、Tbs2,则Tbit = Tss + Tbs1 + Tbs2 ,具体对应关系如下图所示。

SSPTSPBS1PBS2
        
SSBS1BS2
        
TssTbs1Tbs2

每个时序段又由若干个最小时间元(Tq)组成。其中,同步段有且仅有1个最小时间元。


2 时钟同步

电平信号的传输存在时间延迟,各通讯节点的时钟频率也存在差异。为了确保在这样的条件下,各节点也能正常、可靠地通讯,时钟同步机制应运而生。

时钟同步机制分为硬同步、重同步两种,其目标均是使数据位的跳变沿位于一个位时序的同步段内。

2.1 硬同步

硬同步采用的同步方式是平移自身的位时序。

当接收节点的CAN控制器检测到总线上帧起始位的跳变沿时,发现这个跳变沿并不位于自身内部位时序的同步段内,则判定自身的位时序与总线不同步。

为了消除这种不同步,CAN控制器会将自身当前的位时序进行平移,使得帧起始位的跳变沿对应到自身位时序的同步段内,从而实现硬同步,如下图所示。

硬同步仅发生在一帧报文的帧起始位处,对于该报文后续数据位的同步,则无能为力。

硬同步

2.2 重同步

重同步采用的同步方式是延长时间段1或者缩短时间段2。

1)位时序超前

在一帧报文后续数据位的传输过程中,若出现的跳变沿,且这个跳变沿位于接收节点CAN控制器当前位时序的时间段1内,则其判定这是一个慢速的CAN控制器发送的当前数据位的滞后跳变沿,自身的位时序出现了相对的超前现象。

为此,接收节点的CAN控制器会适当延长自身当前位时序时间段1的长度,使得后续数据位的跳变沿能够位于自身位时序的同步段内,从而使自身位时序重新获得同步,如下图所示。

相位超前

 

2)位时序滞后

在一帧报文后续数据位的传输过程中,若出现的跳变沿,且这个跳变沿位于接收节点CAN控制器当前位时序的时间段2内,则其判定这是一个快速的CAN控制器发送的下一个数据位的超前跳变沿,自身的位时序出现了滞后。

为此,接收节点的CAN控制器会适当缩短自身当前位时序时间段2的长度,使得后续数据位的跳变沿能够位于自身位时序的同步段内,从而使自身位时序重新获得同步,如下图所示。

相位滞后

在重同步时,接收节点的CAN控制器延长时间段1或缩短时间段2的长度不是无限制的,其存在一个向上的阈值。这个阈值被称为重新同步补偿宽度或同步跳变宽度,即SJW(reSynchronization Jump Width),其也由若干个最小时间元组成。


 

3 采样点的概念

为了保证接收节点可靠地接收数据,其CAN控制器会在一个位时序的特定位置进行采样。

若CAN控制器被配置为1个采样点,则该采样位置在一个位时序的时间段1与时间段2个交界点处。

若CAN控制器被配置为3个采样点,则该3个采样位置分别为一个时序的时间段1与时间段2个交界点处、交界点往前1个Tq处、交界点往前2个Tq处。

采样点通常用百分比表示,其计算公式为:[(Tbit - Tbs2 )/ Tbit ] × 100% 。


4 波特率的计算方法

首先,明确如下概念:

本文中的波特率:CAN控制器1秒钟能够发送或接收的数据位的数量。

根据波特率的定义,推导其计算公式如下:

若CAN控制器的时钟频率为f(单位:Hz),预分频器值为BRP(可以理解为基频的分频系数),则最小时间元Tq = BRP / f 。

若CAN控制器一个位时序由N个最小时间元组成,则其发送或接收一个数据位的时间为N×Tq,波特率的计算公式为:1 /(N × Tq)= f /(N × BRP)。


5 波特率、采样点的计算实例

在实际CAN控制器的应用中,通过配置其相关参数即可,包括SJW、BRP、SAM、BS1、BS2。

对于配置参数,说明3点:

①SAM可理解为采样模式,其值可确定采样点的个数,0:1个采样点;1:3个采样点。

②BS1、BS2分别为位时序中时间段1、时间段2对应的最小时间元的个数。

③上述5个参数,部分CAN控制器用2个移位寄存器存放(如恩智浦公司的82c200、SJA1000),分别为BTR0、BTR1,其布局如下图所示。

④上述5个参数,除SAM外,其配置值需比实际值小1。

 bit7bit6bit5bit4bit3bit2bit1bit0
BTR0SJW[1]SJW[0]BRP[5]BRP[4]BRP[3]BRP[2]BRP[1]BRP[0]
BTR1SAMBS2[2]BS2[1]BS2[1]BS1[3]BS1[2]BS1[1]BS1[0]

为了验证波特率的计算方法,可通过CANoe的CAN通道配置界面的数据进行验证。

其配置界面如下图所示,以图中红框标注的配置值进行计算。

由图可得,板载时钟的频率f = 16×10^6 Hz

BTR0 = 0x43,对应的二进制值为:0100 0011

BTR1 = 0x14,对应的二进制值为:0001 0010

根据其布局可知:BRP = 2 ×(3+1)= 8;SAM = 0 ;BS1 = 4+1 = 5;BS2 = 1+1 = 2

位时序的长度Tbit = (SS + BS1 + BS2)= (1 + 5 +2)Tq = 8Tq

采样点的计算为:[(Tbit - Tbs2 )/ Tbit ] × 100% = [(8Tq - 2Tq )/ 8Tq ] × 100% = 75%

波特率的计算为:f /(N × BRP)= 16×10^6 /(8 × 8)= 250000 Baud = 250 kBaud

计算出的采样点数据、波特率均与界面上自动给出的数据吻合,其计算方式得到验证。

感兴趣的朋友,可根据其它的配置值进行计算验证。

注:预分频器值需额外乘以2,具体原因还未知。


总结

若博客内容有错误之处,欢迎大家斧正。

感觉写博客跟写论文差不多,好累。感谢写博客,分享知识的大佬们。

本博客参考了如下博客的内容,感谢其作者:

CAN学习笔记---位时序

CAN通信学习笔记——位时序

CAN总线之通俗易懂----位时序

CAN波特率计算

  • 16
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
在STM32G0系列的微控制器,配置CAN-FD主要需要以下步骤: 1. 选择CAN时钟源:可以使用内部RC振荡器、外部晶振或PLL作为时钟源。 2. 配置GPIO:将CAN总线的引脚配置为CAN功能。 3. 配置CAN-FD时钟分频器:由于CAN-FD的时钟频率比CAN的时钟频率高,需要设置CAN-FD时钟分频器以提高总线的速度。 4. 配置CAN-FD速率:设置CAN-FD的数据传输速率和数据长度。 5. 配置CAN-FD过滤器:设置CAN-FD接收过滤器以筛选接收的数据。 以下是一个基本的CAN-FD配置示例: ```c //设置CAN时钟源 RCC->APB1ENR1 |= RCC_APB1ENR1_CAN1EN; //使能CAN1时钟 RCC->CCIPR |= RCC_CCIPR_CANSEL_1; //选择PLL作为CAN时钟源 //配置GPIO GPIOA->MODER &= ~(GPIO_MODER_MODE11_1 | GPIO_MODER_MODE12_1); //PA11和PA12配置为复用模式 GPIOA->MODER |= (GPIO_MODER_MODE11_0 | GPIO_MODER_MODE12_0); //PA11和PA12复用为CAN功能 GPIOA->AFR[1] |= (9 << ((11 - 8) * 4)) | (9 << ((12 - 8) * 4)); //PA11和PA12复用为CAN功能 //配置CAN-FD时钟分频器 CAN1->CCR &= ~CAN_CCR_CCLKEN; //禁用CAN时钟 CAN1->CCR |= CAN_CCR_CKABR; //使能自动波特率检测 CAN1->BTR |= CAN_BTR_TSEG1_0 | CAN_BTR_TSEG1_1 | CAN_BTR_TSEG2_0; //设置时间段参数 CAN1->BTR |= CAN_BTR_SILM | CAN_BTR_LBKM; //设置为静默模式和环回模式 //配置CAN-FD速率 CAN1->CCR &= ~CAN_CCR_FDOE; //禁用CAN-FD模式 CAN1->FDCTRL |= CAN_FDCTRL_FDRATE; //使能CAN-FD模式 CAN1->FDCTRL |= CAN_FDCTRL_TDCOFF; //设置时间域偏移 CAN1->FDCTRL |= CAN_FDCTRL_TDCMOD; //设置时间域模式 CAN1->FDCTRL |= CAN_FDCTRL_FDM; //设置为CAN-FD数据模式 CAN1->FDCTRL |= CAN_FDCTRL_FDEN; //使能CAN-FD //配置CAN-FD过滤器 CAN1->FM1R &= ~CAN_FM1R_FBM0; //设置为屏蔽模式 CAN1->FS1R |= CAN_FS1R_FSC0; //设置为单个32过滤器 CAN1->FFA1R &= ~CAN_FFA1R_FFA0; //设置为FIFO0 CAN1->sFilterRegister[0].FR1 = 0x00000000; //设置过滤器0的标识符 CAN1->sFilterRegister[0].FR2 = 0x00000000; //设置过滤器0的掩码 CAN1->FA1R |= CAN_FA1R_FACT0; //使能过滤器0 //使能CAN总线 CAN1->MCR |= CAN_MCR_INRQ; //进入初始化模式 while ((CAN1->MSR & CAN_MSR_INAK) != CAN_MSR_INAK); //等待进入初始化模式 CAN1->MCR &= ~CAN_MCR_SLEEP; //退出睡眠模式 CAN1->MCR |= CAN_MCR_NART; //禁用自动重传 CAN1->MCR |= CAN_MCR_TXFP; //使能发送FIFO优先级 CAN1->BTR |= CAN_BTR_BRP_0 | CAN_BTR_BRP_1 | CAN_BTR_BRP_2; //设置波特率预分频器 CAN1->BTR |= CAN_BTR_TS1_0 | CAN_BTR_TS1_1 | CAN_BTR_TS1_2; //设置时间段参数 CAN1->BTR |= CAN_BTR_TS2_0; //设置时间段参数 CAN1->MCR &= ~CAN_MCR_INRQ; //退出初始化模式 while ((CAN1->MSR & CAN_MSR_INAK) == CAN_MSR_INAK); //等待退出初始化模式 ``` 这只是一个基本的配置示例,具体的配置参数需要根据实际应用进行调整。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值