CAN总线位时序

本文介绍了I.MX6ULL的FlexCAN控制器如何遵循CAN2.0B协议,详细讲解了CAN总线的位时序结构,包括同步段、传播时间段、相位缓冲段以及Tq时间量子。重点讨论了如何通过位时序设置实现多单元采样和仲裁功能,确保数据传输的优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.  简介

前面文章学习了 CAN总线协议,即五种数据帧格式。

I.MX6ULL 带有 CAN 控制器外设,叫做 FlexCAN,FlexCAN 符合 CAN2.0B 协议。

本文来学习一下 CAN总线的位时序。

  

二.  CAN总线位时序

CAN 总线以帧的形式发送数据,但是最终到总线上的就是 “0” 和 “1” 这样的二进制数据,这里就涉及到了通信速率,也就是每秒钟发送多少位数据,前面说了 CAN2.0 最高速度为 1Mbps/S。对于 CAN 总线,一个位分为 4 段:
①  同步段(SS)
②  传播时间段(PTS)
③  相位缓冲段 1(PBS1)
④  相位缓冲段 2(PBS2)

这些段由 Tq(Time Quantum)组成,Tq CAN 总线的最小时间单位。帧由位构成,一个位由 4 个段构成,每个段又由若干个 Tq 组成,这个就是位时序
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如下图所示:

1 个位的构成如下图所示:

上图中的采样点是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。根据这个位时序,我们就可以计算 CAN 通信的波特率了。具体计算方法,我们等下再 介绍,前面提到的 CAN 协议具有仲裁功能,下面我们来看看是如何实现的。

在总线空闲态,最先开始发送消息的单元获得发送权。
当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送实现过程,如下图 所示:

上图中单元 1 和单元 2 同时开始向总线发送数据,开始部分他们的数据格式是一 样的,故无法区分优先级,直到 T 时刻,单元 1 输出隐性电平,而单元 2 输出显性电平,此时单元 1 仲裁失利,立刻转入接收状态工作,不再与单元 2 竞争,而单元 2 则顺利获得总线使用权,继续发送自己的数据。
这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。
关于 CAN 协议就讲到这里,关于 CAN 协议更详细的内容请参考《CAN 入门教程》。

  

### CAN 总线位时序参数概述 CAN (Controller Area Network) 协议中的位时序参数决定了数据传输的速度和可靠性。这些参数主要影响信号的采样点位置以及同步机制,从而确保网络上的所有节点能够正确接收并解码消息。 #### 仲裁阶段与时隙划分 在标准 CANCAN FD 中,帧结构分为两个部分:仲裁字段(Arbitration Field)与数据域(Data Field)。对于支持 CAN FD 的控制器而言,在这两个不同的阶段可以采用两种独立的数据速率设置[^1]。这意味着当进入数据载荷发送之前,通信速度可以从较低的基础比特率切换到更高的扩展比特率。 #### 关键位定时参数解释 - **Sync Segment 同步段**: 定义了用于实现硬同步的时间间隔长度。 - **Prop Seg 传播时间段**: 补偿由于物理介质引起的延迟差异;此段时间越长,则允许的最大电缆长度也越大。 - **Phase Seg1/Seg2 相位缓冲区一/二**: 提供额外调整空间来适应实际硬件响应特性变化的影响,并且帮助维持精确度较高的边沿检测精度。 - **SJW Synchronization Jump Width 同步跳跃宽度**: 控制相位缓冲区内可移动范围大小的一个重要指标,它限定了最大可能发生的再同步偏移量。 为了使能 CAN FD 数据速率功能,除了常规的第一组位定时外还需要指定第二套适用于高速模式下的配置选项。 ```c // 配置 CAN 控制器以启用 CAN FD 模式的例子 void configure_can_fd_bit_timing(CanController *controller, uint32_t f_clock, uint8_t tseg1, uint8_t tseg2, uint8_t sjw, bool is_fd_mode){ if(is_fd_mode){ // 设置 CAN FD 特定的高波特率设定 controller->setBitTiming(f_clock, tseg1, tseg2, sjw); // 开启 CAN FD 支持 controller->enableFdMode(); }else{ // 只有单一低速波特率的情况 controller->setNominalBitTiming(f_clock, tseg1, tseg2, sjw); } } ``` 通过上述方法可以根据具体应用场景灵活调节 CAN 或者 CAN FD 接口的工作频率及其稳定性表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值