STM32 CAN学习(二)

STM32 CAN 学习

  • CAN_TX和CAN_RX通过P24跳线接入到TJA1050芯片上,TJA1050芯片是一个CAN收发器,能将CAN控制器发来的数据转换成CAN_H和CAN_L的差分信号。
  • 在STM32单片机内部,集成了一个标准的CAN控制器,控制器通过CAN_TX端口发送数据到收发器芯片的TXD(1脚),CAN总线接收的数据通过RXD(4脚),发送到单片机内部的CAN总线控制器(CAN_RX),这样就实现了基本的收发。
  • CAN_H和CAN_L之间连接了一个120Ω的电阻,起到了稳定总线的作用,这两条线通过P25的端口(也就是端子),端子可以连接外部的双绞线和其他CAN总线设备连接。
  • CAN总线是一种总线结构,可以连接多个CAN总线设备,理论上同一条CAN总线上,所能连接的设备是无限多的。
  • CAN总线使用的线材是双绞线,双绞线具有很好的抗干扰能力
  • CAN总线的通讯距离可以达到10KM,在总线的两端需要连接两个120Ω的电阻,其中每个CAN设备的CAN_H都要连接到总线上的H端,每个CAN设备的CAN_L都要连接到总线上的L端,如果H和L接反了,总线将无法通信。
  • 只有两个设备时,可以使用简单的通讯方式,不需要使用单片机内部的CAN总线控制器硬件的相关功能,只要发送和接收数据即可,可以当作一个简单的USART串口来使用。其中一个设备发送数据,另一个设备接收数据即可。这样的应用,不需要涉及CAN总线内部复杂的协议,而且还能利用CAN总线的高稳定性和长远的传输距离,相当于把它当作一个稳定性更高,距离更远的USART串口来使用。
  • 当CAN总线上连接了很多个CAN设备,这个时候就要使用CAN总线协议来通信了。因为在一条总线上,设备很多,设备与设备之间需要传输大量数据,如果只是简单的收发,可能会导致通讯混乱,只有利用CAN的通信协议,使用CAN总线的内部功能邮箱、标识符、过滤器功能,才能更好地使用CAN总线。
  • CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO国际标准化的串行通信协议。

    在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统

    被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很

    多,线束的数量也随之增加。为适应"减少线束的数量"、"通过多个 LAN,进行大量数据的高速通信"的需

    要, 1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。

  • 此后, CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。

    • ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准
    • ISO11519-2是针对通信速率为125Kbps一下的低速通信标准
  • 现在, CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。

  • CAN 协议具有以下特点。

  • 多主控制

    • 在总线空闲时,所有的单元都可开始发送消息(多主控制)。
    • 最先访问总线的单元可获得发送权(CSMA/CA 方式)。
    • 多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。
    • CAN的设备不同于I2C,在I2C总线当中只允许有一个主设备和多个从设备,而在CAN总线当中每一个设备都可以是主设备,都可以主动发送数据。
  • 消息的发送

    • 在 CAN 协议中,所有的消息都以固定的格式发送。
    • 总线空闲时,所有与总线相连的单元都可以开始发送新消息。
    • 两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。
      • ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消
        息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的
        单元则立刻停止发送而进行接收工作。
  • 系统的柔软性

  • 与总线相连的单元没有类似于"地址"的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬

    件及应用层都不需要改变。

  • 通信速度

  • 根据整个网络的规模,可设定适合的通信速度。

  • 在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。

  • 远程数据请求

  • 可通过发送"遥控帧" 请求其他单元发送数据。

  • 错误检测功能-错误通知功能-错误恢复功能

    • 所有的单元都可以检测错误(错误检测功能)。
    • 检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
    • 正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
  • 故障封闭

    • CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部
      故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上
      隔离出去。
  • 连接

    • CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元
      数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接
      的单元数减少。
  • 波特率 tq

  • CAN总线中一次最多只能发送8个字节的数据,这是由CAN协议规定的

    • 多于8个的需要第二次发送,或者做一个上层的连续多数据发送的函数
    • 把一组数据拆分成多个单元,每个单元里面8个数据
  • CAN总线发送部分

    • 报文:CAN设备一次发送出去的完整数据信息
      • 可以理解为电报的正文
    • 邮箱:用于发送报文的发送调度器
      • 通过邮箱发送报文
    • 帧种类:不同用途的报文种类。有数据帧、遥控帧、错误帧、过载帧、帧间隔。
    • 帧格式:一个报文里包含的内容
    • 标识符(ID):CAN总线上的设备可以用此判断数据是不是发给自己的
      • 类似于I2C总线中的地址,但有所不同
  • 邮箱是数据发送的调度器

    • 在CAN总线中,可以通过邮箱来发送数据。
    • 在STM32的CAN总线控制器当中有3个邮箱,可以把邮箱理解为一个数据发送盒,当单片机软件想发送一个数据到CAN总线,CPU会把数据发送到CAN总线控制器。
    • CAN总线控制器收到数据之后,会把数据放入到优先级最高的空邮箱
      • 比如当前邮箱1、2、3均为空,邮箱1的优先级最高,邮箱3的优先级最低,所以CAN总线控制器会把数据先放入到邮箱1,假设上一步已经把数据传送给了邮箱1,邮箱1就从空的的状态转变为满的状态,邮箱变为满的状态,它就会立刻检测CAN总线的状态,一旦CAN总线空闲,邮箱就会立刻向CAN总线发送数据。从而把数据传送给需要的CAN设备。所以,一旦邮箱处于满状态,那么它就会处在正在发送数据或者等待发送数据的状态。如果这个时候,单片机又发来第二个数据,假设邮箱1的数据还没有发送完成,这个时候,按照规律,数据会放入优先级最高的空邮箱,因为邮箱1是满状态,所以第二个数据会发送到邮箱2当中,因为邮箱2在空邮箱中,优先级最高,数据一旦放入后,邮箱2也会变成满的状态,当邮箱1数据发送完成后,邮箱2就会接着向CAN总线发送数据。如果邮箱1和邮箱2都处于满的状态,又来了第三个数据,那么这个数据就会放入到邮箱3当中,如果第三个数据来之前,邮箱1的数据发送完成,重新变成了空的状态,这时第三个数据就又会发送到邮箱1当中去。因为CAN控制器中有3个邮箱可以存放数据,相当于起到了缓存的作用。单片机可以将数据发送给邮箱,之后就不需要管理了。邮箱会自动将数据按次序发送到CAN总线,不需要我们程序上的控制,这就大大提高了发送效率。如果控制器中只有1个邮箱,那么第一个数据放入邮箱之后,单片机还要循环等待,直到邮箱1的数据发送完成之后,再发送第二个数据,这样就降低了程序的执行效率。多个邮箱可以提高单片机的数据发送效率。
  • 在CAN总线中,数据的发送是通过邮箱,然后通过CAN总线的TX引脚以一定的波特率发送数据,接收端则以相同的波特率接收数据,送入到过滤器。CAN总线所发送或接收的数据就是报文。
  • 与I2C总线不同的是,CAN总线中所有设备都会接收报文,但标识符不符的报文会被过滤器删除
  • 在CAN总线中,没有地址的概念,而是通过识别符来识别数据的,识别符是包含在报文中的一部分内容,每一个报文当中都会包含一个识别符。当一个CAN设备发送报文时,其他所有设备都会接收报文的全部内容,接收完成后,再来通过识别符来判断数据是否是自己需要的,如果不是则删除,如果是则保留。
相关推荐
小码的头发丝、7 分钟前
Java进阶学习笔记|面向对象
java·笔记·学习
坊钰38 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
阿七想学习1 小时前
数据结构《排序》
java·数据结构·学习·算法·排序算法
NEWEVA__zzera222 小时前
利用光耦来隔离485芯片与串口引脚,实现自动收发485电路
单片机·嵌入式硬件
m0_748240542 小时前
STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
stm32·单片机·嵌入式硬件
沐欣工作室_lvyiyi3 小时前
基于单片机的多功能智能小车(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·单片机毕业设计
鸿喵小仙女3 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
lucy153027510793 小时前
MCU 功耗基准测试
科技·单片机·嵌入式硬件·智能家居·信号处理·工控主板
汤姆和佩琦4 小时前
2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。
学习·聚类·sklearn
m0_748240914 小时前
OpenMV与STM32通信全面指南
stm32·单片机·嵌入式硬件