stm32单片机外设学习之 CAN通信

以下只是记录一下自己学习了解CAN通信的一些学习历程 希望对大家有帮助 


什么是CAN

Controller area network 控制器局域网

有开环和闭环两种形式

闭环是高速短距离 开环是低速远距离

异步通信方式

通过 电压差表示信号 逻辑1为隐性 逻辑0为显性

5fab9dcb3f834460b73f76852f38b229.png

6d1d6c8e55b0493eaa369e234ea661b9.png

003f4f1b3b784cd9a997c417581c08d0.png串行(串行是一位位发送 而并行是多位一起发送)通信协议 差分信号--通过电位差来判断总线电平

总线上没有主从概念 ,同一时间只能有一个发送,Can总线上的一个节点通常由can控制器(负责实现协议数据帧 通常是mcu的片上外设)和收发器(一般是另外的芯片 负责实现MCU和Can总线逻辑电平的转化)


 

CAN协议 && 数据帧

数据帧和遥控帧

数据帧和遥控帧都有有标准和扩展两种2f1d2f4981ae425681d06409459c4e2d.png

d84027a47ab64f5783a93c9e87af7160.png

IDE位是拓展帧和标准格式的标志位

ACK位是分辨接收方和发送方的标志位

遥控帧没有数据所以DLC总是为0

扩展格式区别在与仲裁段和控制段

883142e70dd54e5bacca1fa162e856a4.png

仲裁时就看

  • 谁先输出显性电平0谁优先

  • 谁先发谁获得优先权

  • 相同ID的数据帧和遥控帧 数据帧先获得发送权 因为数据帧的RTR位为0 同时标准数据帧的IDE位为0

仲裁原理

在 CAN 总线中,显性位(Dominant bit)隐性位(Recessive bit) 是通过物理层的电气特性来区分的。具体来说,CAN 总线上的两个状态对应以下物理电平:

  • 显性位(Dominant bit, 逻辑 0):电平差较大,通常是由 CAN_H(高电平)和 CAN_L(低电平)之间形成的显性电平。

  • 隐性位(Recessive bit, 逻辑 1):电平差较小,通常 CAN_H 和 CAN_L 电平接近。

由于 CAN 控制器在总线上设计时,显性位的信号强度更高,因此当一个节点发送显性位时,其他节点发送隐性位的信号会被显性位“覆盖”,这就是为什么显性位能够在仲裁过程中起作用的原因。

1. 为什么显性位强度更高:

  • CAN 总线是一种 线与逻辑,即总线的物理实现上是“与”(AND)逻辑。当多个节点同时发送时,如果有任何一个节点发送显性位,总线的电平就会被拉到显性状态(逻辑 0)。因此,即使一个节点发送隐性位,显性位仍然能够主导总线的电平

  • 这种设计确保了仲裁过程中的优先级判定是清晰的,即显性位可以“盖过”隐性位。

2. 避免其他设备在发送过程中打扰:

  • 在 CAN 总线的帧结构中,特别是在发送 标识符(ID) 和仲裁阶段,所有节点在检测总线状态的同时也在发送数据。每个节点会对每一位都进行检测,如果发现自己的数据与总线不匹配(比如发送隐性位但总线为显性位),它会立即停止发送

  • 因此,不会发生设备在仲裁过程中继续发送错误数据的情况,因为任何检测到自己优先级较低的节点都会自动停止,避免冲突

3. 如何判断别人发完了:

  • CAN 协议中定义了帧结束位。当一个节点完成数据帧的发送时,帧结束由特定的比特序列(称为结束帧字段,EOF,End of Frame)来标识。所有节点都能识别这个结束帧。

  • 空闲状态:当总线空闲时,总线保持在隐性位(逻辑 1)状态。如果一个节点检测到总线处于空闲状态,并且它有数据要发送,它就可以在检测到总线空闲的第一个时隙内开始发送。

  • 如果总线处于隐性状态并且没有其他节点开始发送数据,那么该节点可以接管总线,开始发送自己的数据帧。

4. 如何避免多个节点同时启动发送:

  • CAN 总线是一种多主架构,没有中央控制器调度何时发送。因此,多个节点可能同时开始发送数据,但是通过仲裁机制,只有优先级最高的节点可以继续发送。

  • 其他节点在仲裁中输掉后,必须等待总线再次变为空闲状态,才可以重新尝试发送。

总结:

  • 显性位的强度更高是由 CAN 总线物理层的电气特性决定的,显性位总是能够盖过隐性位。

  • 仲裁过程中,如果一个节点检测到自己发送的位与总线状态不符,它会自动停止发送,避免干扰。

  • 所有节点通过监视 CAN 帧的结束字段,判断其他设备是否发送完毕,并在总线空闲时发起新的数据传输。

这种机制使得 CAN 总线在多主、多节点情况下仍然能够稳定、有效地进行数据传输。

CAN控制器 片上外设

不同类型的CAN控制器(了解即可)

CAN通信知识梳理及在Stm32上的应用(HAL库)-CSDN博客

CAN 邮箱的理解_can邮箱读取-CSDN博客

【RoboMaster电控教程】课程5 CAN总线与电机 - 哔哩哔哩 (bilibili.com)

HAL库开发——CAN通信_hal_can_addtxmessage-CSDN博客

0838f298a68e4303a28e401faf27acb8.png

筛选器用于筛选进入接收fifo的数据 配置接收id和掩码 筛选由硬件实现节约资源 并且接收FIFO完全由硬件控制 接收到有效数据可以产生中断

  • 通过是否设置fifo锁定可以判断是否在消息存满时对新消息进行覆盖或者舍弃

每个CAN有3个发送邮箱可以实现自动重发

闭环系统只有两个终端节点需要焊接120R电阻

时间戳

其中接收时还可以会带上时间戳(所以我又补充了一点)

时间戳

CAN 控制器 接收到数据时产生的时间戳,通常指的是控制器或系统在接收到某个 CAN 数据帧时所记录的时间。这个时间戳不是 CAN 协议本身的一部分,而是控制器或接口硬件在内部生成,用于记录数据帧到达的时刻。

时间戳的生成过程:

  1. 接收数据帧

    • CAN 控制器监听 CAN 总线,当它接收到一个完整的 CAN 数据帧(包括起始位、标识符、数据字段、CRC 校验等),它会立即处理这个帧。

  2. 时间戳记录

    • 在接收到该数据帧的同时,CAN 控制器会读取当前的系统时间或者定时器值,将其作为该数据帧的时间戳,记录下帧到达的精确时间。

    • 这个时间戳通常是基于 控制器内部的时钟源 或者 主处理器的系统时钟

  3. 时间戳的存储

    • 控制器或 CAN 接口卡会将该时间戳与接收到的数据帧一起保存,通常与该帧的其他信息(如标识符、数据长度、数据字段等)一起传递给主处理器或主机软件。

时间戳的作用:

时间戳在很多实际应用中非常重要,特别是在需要同步事件或进行精确时间分析的场景中。以下是时间戳的一些典型用途:

  1. 诊断和调试

    • 时间戳帮助调试人员记录每个 CAN 帧的接收时间,可以用来分析系统中的消息延迟、网络拥塞或其他问题。

  2. 数据同步

    • 在某些应用中,时间戳可以用于不同 CAN 网络节点之间的事件同步,确保不同设备在相同的时间基准上工作。

  3. 日志记录

    • 在记录 CAN 消息日志时,时间戳能够精确标记消息的到达时间,便于后续的回溯和分析。

时间戳的具体实现:

具体的时间戳格式和精度取决于控制器或 CAN 接口硬件的设计。通常会有以下几种方式:

  1. 系统时钟

    • CAN 控制器或主机系统使用系统时钟生成的时间戳。这种方式通常以绝对时间(如从1970年1月1日开始的Unix时间戳)或相对时间(如开机后的时间偏移量)形式记录。

  2. 定时器计数

    • 一些 CAN 控制器使用高速定时器来记录接收数据帧的时间戳。这种计时器可以提供高精度的时间信息,通常以微秒级或纳秒级分辨率记录。

  3. 控制器或硬件驱动支持

    • 在某些高端 CAN 硬件接口卡中(如 PEAK Systems 或 Kvaser 等),这些卡片自身会为每个接收到的 CAN 帧生成一个高精度的时间戳,并将这些时间戳与 CAN 数据一起发送到主机。

示例:

假设有一个 CAN 控制器接收到一个数据帧,并且它的系统时钟是以毫秒为单位记录时间的。那么控制器接收到的帧可以如下表示:

  • 数据帧 ID:0x123

  • 数据:{0x01, 0x02, 0x03, 0x04}

  • 时间戳:2024-09-16 10:25:45.123

其中,时间戳记录了数据帧在2024年9月16日 10时25分45秒123毫秒时被接收到。

总结:

  • CAN 控制器接收数据时产生的时间戳是一个用于记录数据帧接收时间的附加信息,便于事件同步、调试、性能分析和日志记录。

  • 时间戳由 CAN 控制器的硬件、系统时钟或定时器生成,并与接收到的 CAN 数据帧一起传递。

  • 时间戳的具体格式和精度取决于 CAN 控制器或接口硬件的设计,通常可以达到微秒级甚至纳秒级的精度。

筛选器

F4系列两个CAN控制器有28个共用的筛选器组合 每个筛选器组由两个32位的寄存器组成

掩码模式和列表模式

  • 一个筛选器组的4种配置方式

  • 掩码位为1表示该位要和接收到的IDE中的位一致

  • 比如第一个模式相当于你先设置一个你要的id然后再写一个32位掩码来筛选看哪些位需要和你设置的id相同

  • 第二个模式则是满足你写的两个id中的一个才过筛

  • 16位同理

  • 用户可以为一个fifo设置多个筛选器 但是一个筛选器只能设置给一个fifo

  • 要在启动CAN之前先配置筛选器

  • 4c6f8fddce1848d2896f4737872030da.png

CAN中断

8bae3856850b4104b85b6f59a5777800.png发送邮箱和 每个fifo接收邮箱有对应的中断

ac5ff4ac7ce3456b80c8f0958a89ac24.png

位时序

参考学习链接

CAN总线通讯中的位时序_can位时序-CSDN博客

2005144f200542b9bf6b25b893694e51.png

关键词 :

  • 重新同步补偿宽度或同步跳变宽度,即SJW(reSynchronization Jump Width)

  • 最小时间元

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

为了解决电平传输延迟问题,使得各节点正常可靠传输,产生了时钟同步技术

  1. 先是根据分频系数得出Tq

  2. 然后根据每个时间段的Tq大小得出对应的标称位时间 取倒数得出波特率

a7f34e5a1d70479e93aad98767dca40f.png

e3ccc0eb7bfb489a9979bfb3e8b933ce.png

 

Q:为什么can的位时序要让跳变发生在SS段

在 CAN(Controller Area Network)协议中,位时序的设计是为了确保总线上多个节点能够可靠地同步通信。跳变(Edge) 发生在 同步段(Synchronization Segment, SS) 是 CAN 位时序的关键机制之一,它有助于保持通信的稳定性和可靠性。以下是具体原因:

1. 位时序的组成

CAN 协议将每个位的传输分为四个时段,分别是:

  1. 同步段(Synchronization Segment, SS):用于检测跳变位置。通常要求跳变发生在这里,以便接收节点同步到发送节点的信号。

  2. 传播时间段(Propagation Time Segment, Prop_Seg):用于补偿信号在总线上传输的延迟。

  3. 相位缓冲段 1(Phase Buffer Segment 1, Phase_Seg1):允许微调采样点,纠正总线上可能出现的定时误差。

  4. 采样点:在这一点上采样信号,确定位的逻辑值。

  5. 相位缓冲段 2(Phase Buffer Segment 2, Phase_Seg2):用于同步后期时钟偏移和调整信号。

2. 跳变发生在同步段的目的

同步段(SS) 是专门用于同步的,它确保 CAN 网络中的每个节点的时钟都能保持一致。这段时间期望检测到信号的跳变,跳变一般是从显性位(Dominant, 逻辑 0)到隐性位(Recessive, 逻辑 1),或反过来。

原因如下:

(1)确保节点时钟同步

CAN 是一种分布式通信协议,每个节点都有自己的时钟,而时钟之间可能存在微小的偏差。如果这些偏差不加以调整,接收节点会逐渐偏离发送节点的信号节奏,导致通信错误。跳变发生在同步段时,节点可以利用这个跳变对自身的时钟进行调整,使其重新与发送节点的时钟保持同步

(2)减少传输误差

通过将跳变定位在同步段,CAN 协议可以确保每个接收节点都能通过这个跳变事件进行同步,减少由于时钟漂移造成的误差。这样,接收节点能够准确地判断何时开始采样数据位,确保数据位不会因时钟漂移而出错。

(3)适应网络中的传播延迟

CAN 总线网络中的每个节点距离不同,信号在总线上传播需要一定的时间(传播延迟)。同步段的设计考虑了这些传播延迟,通过跳变事件使所有节点可以在传播延迟后依然同步到同一位时刻。

(4)位填充的作用

CAN 协议中使用位填充(Bit Stuffing)机制,即如果连续出现 5 个相同的位,则在数据流中自动插入一个反向位。这一机制也增加了网络中出现跳变的次数,确保接收节点有足够多的机会进行同步。

3. 跳变在其他时段的影响

如果跳变发生在其他时段,尤其是采样点之后,接收节点可能会错过关键的同步机会,进而导致时钟漂移累积,最终出现错误解码。这就是为什么跳变设计在同步段(SS)中,它是整个位时序中最理想的跳变点。

4. 硬件时钟的调整

当跳变发生时,CAN 控制器会检测到,并根据跳变位置来调整内部时钟,使其与总线上信号的实际到达时间重新同步。这种微调机制可以修正时钟的微小漂移,确保节点能够继续准确接收后续的数据位。

总结:

CAN 协议让跳变发生在 同步段(SS) 的主要目的是为了让所有节点通过这个跳变对时钟进行同步,从而保证可靠的通信。同步段内的跳变能够:

  • 确保多个节点的时钟保持同步,避免时钟漂移。

  • 减少传输误差,确保采样点正确定位。

  • 适应总线传播延迟,保证所有节点能够正确处理信号。

通过这一设计,CAN 总线能够在多节点的情况下实现稳定的、高效的通信。

总结:

  • 所有节点的位时间必须相同,以保证同步通信;这意味着每个 CAN 位所花费的总时间应该一致。

  • 时间量子(TQ)不一定相同:不同节点的时间量子长度或数量可以不同,具体取决于其时钟设置和分段方式。但通过配置波特率预分频器和其他时序参数,各节点的位时间依然可以保持一致。

  • CAN 控制器利用跳变边缘进行同步调整,确保即使存在微小的时钟偏差,节点之间也能保持同步通信。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值