Can通信协议学习笔记

文章目录

  • 前言
  • CAN协议简介
    • 物理层
    • 协议层
  • STM32F407 CAN 介绍
    • 简介
    • 寄存器配置及其功能
    • 总结


前言

因为这样那样的原因,我现在开始学习can通信协议,本文也是从CSDN上的大佬文章学习的,主要作为自己的学习笔记,侵权删

CAN协议简介

CAN(Controller Area Network)即控制器局域网,是一种高速的、短距离的、点对点的通信协议。

物理层

  • 通信方式 :使用两条差分线进行异步通信,一条线用于发送数据,另一条线用于接收数据。
  • 两种环形网络
    • 闭环总线网络:它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个“120 欧”的电阻
    • 开环总线网络:它的最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2千欧”的电阻
  • 差分信号传输数据:CAN 协议采用差分信号传输数据
    • 发送数据时:控制器将数据编码成差分电平信号,并通过CAN_Tx 输出至收发器,收发器再将信号转换成数据,并通过CAN_Rx 输出至控制器,控制器再将数据处理后输出至应用层。
    • 接收数据时:控制器将CAN总线上的信号转换成差分电平信号,并通过CAN_Rx 输出至收发器,收发器再将信号解码成数据,并通过CAN_Tx 输出至控制器,控制器再将数据处理后输出至应用层。
  • 差分信号简述
    • 两根信号线进行数据传输,这两根信号线的振幅相等,相位相反,通过通过两根信号线的电压差值来表示逻辑 0 和逻辑 1,如下图
    • 差分信号的优点:
      • 抗噪声能力强,因为外界的干扰会同时作用在两根信号线上,但两根信号线的电压差值不变,所以可以抵消噪声
      • 能有效抑制它对外部的电磁干扰
      • 时序定位精准:差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。
  • 差分信号协议
    如图

    • 显性隐性的由来:因为所有的CAN通信设备都接入同样的两条总线,根据线与的特性,加入同一时间一个输出低电平,另一个输出高电平,那么总线上就是高电平,显性有优先的含义

协议层

  • 简述,异步通信没有时钟线,按照约定好的波特率进行通信,特别的,CAN通信会使用位同步来消除误差
  • 位时序:一个数据的时序分为四段,分别为SS段,PTS段,PBS1段,PBS2段,最小时间单位是TP,由8~25个TP组成一位
    • 同步段(SYNC SEG):SS段的大小固定为1TP用于检测边沿, 如果信号边沿再SS段内,则是同步的
    • PTS段(PROP SEG):传播时间段,用于补偿时间,是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS 段的大小可以为 1~8Tq
    • PBS1段(PHASE SEG1):相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以***加长***。 PBS1 段的初始大小可以为 1~8Tq
    • PBS2段(PHASE SEG2):另一个相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以***缩短***。 PBS2 段的初始大小可以为 1~8Tq

    SJW (reSynchronization Jump Width):重新同步补偿宽度,即在重新同步的时候,PBS1 和 PBS2 段的允许加长或缩短的时间长度,SJW 加大后允许误差加大,但通信速度下降。SJW 为补偿此误差的最大值(即每一次误差补偿都不能超过这个值,1~4Tq)。

  • 同步
    • 硬同步:在起始帧信号后进行一次时序的同步
    • 重新同步:在检测到总线上的时序与节点使用的时序有相位差时(即总线上的跳变沿不在节点时序的 SS 段范围),通过延长 PBS1 段或缩短 PBS2 段,来获得同步。
  • 数据帧:在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,作为一个数据帧
    • 类型:总计有5种类型的数据帧
      帧类型说明
      数据帧用于发送数据
      遥控帧用于请求数据
      错误帧用于发送校验错误,请求重新发送上一个数据
      过载帧用于通知远程节点:未做好接受准备
      帧间隔用于将数据帧及遥控帧与前面的帧分开来
    • 结构组成:
      1. 数据帧:数据帧是在 CAN 通讯中最主要、最复杂的报文,以一个显性位 (逻辑 0) 开始,以 7 个连续的隐性位 (逻辑 1) 结束,在它们之间,分别有仲裁段、控制段、数据段、CRC 段和 ACK 段。
        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
      • 帧起始: 帧起始位 (Start Of Frame, SOF) 是一个显性位, 它的值为 0。用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步
      • 仲裁段: 当有多个报文发送时,总线会更具仲裁段的内容来决定那个数据包能被传输。分为ID位,RTR位,IDE位,SSR位
        • ID位主要内容为本书矩阵的ID信息,数据帧具有标准格式和扩展格式两种,标准格式的帧ID为11位,扩展格式的帧ID为29位,其中ID为11位的帧称为标准帧,ID为29位的帧称为扩展帧。
          争夺原理:当总线发生争议时,根据线与的特性,首先出现隐形电平的会市区对总线的占有,因此ID小的优先级更高,如图
          外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
        • RTR位: RTR位 (Remote Transmission Request) 用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧
        • IDE位: IDE位 (Identifier Extension) 用于区分标准帧和扩展帧的,当它为显性电平时表示标准帧,隐性电平时表示扩展帧
        • SSR位: SSR位 (Substitute Safeguard Request) 只存在于扩展格式, 它用于替代标准格式中的 RTR位。由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
          控制段:在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段 (Data Length Code),译为数据长度码,它由 4 个数据位组成,用于表示本报文中的数据段含有多少个字节, DLC 段表示的数字为 0~8。
          数据段:数据段中包含了实际要传输的数据,由0~8个字节组成,MSB先行。
          CRC段:CRC段 (Cyclic Redundancy Check) 用于检验数据是否出现错误,它由 15 个数据位组成,一旦接收节点算出的CRC 码跟接收到的 CRC 码不同,则它会向发送节点发送错误帧,CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK段间隔起来。
          ACK段:ACK段 (Acknowledgement) ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。
          帧结束:帧结束位 (End Of Frame, EOF) 发送七个隐性位表示结束
      1. 其他
        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

STM32F407 CAN 介绍

简介

  • 有bxCAN 控制器 (Basic Extended CAN),支持CAN协议 2.0A 和 2.0B 标准
  • 支持最高通讯速率位 1Mb/s
  • 支持标准帧和扩展帧
  • 有3个发送邮箱,软件控制优先级,并可以记录时间
  • 2个3级深度的接收FIFO,可配置过滤器指定接受或者不接收某些ID的报文
  • 可配置自动重发自动唤醒
  • 不支持DMA数据收发
  • 注意有CAN1 和 CAN2 如果想要使用CAN2切记打开CAN1时钟
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

寄存器配置及其功能

  • CAN主控制寄存器(CAN_MCR):用于配置CAN的工作模式,包括使能CAN,关闭自动唤醒,关闭自动重发,关闭总线监控等

    DBF(Debug freeze) 调试冻结功能:仅在调试模式使用

    • 工作状态,当 DBF 位被置位时,CAN 控制器进入调试模式,CAN 控制器的工作状态不受影响,CAN 控制器的接收和发送功能都可以正常工作。
    • 禁止收发,CAN 控制器的接收和发送功能都被禁止,此时可访问FIFO中的数据
      TTCM(Time triggered communication mode) 时间触发模式:使用内部定时器产生时间戳,保存在CAN_RDTxR、CAN_TDTxR 寄存器,每个 CAN 位时间累加,在接收和发送的帧起始位被采样,并生成时间戳
      ABOM(Automatic bus-off management) 自动离线管理:接受错误或者接受错误一定次数后,会进入自动离线,可以由软件恢复运行或者使用此功能,让CAN通信在适当的时间自动恢复运行
      AWUM(Automatic wakeup mode) 自动唤醒模式:使用软件让CAN进入睡眠模式后,CAN 控制器在接收到有效的帧时,会自动唤醒,不需要软件的干预
      NART(No Automatic Retransmission) 禁止自动重发:禁止CAN控制器自动重发错误的帧, 无论结果如何,错误消息只会发送一次, 否则当报文发送失败时会自动重传直至成功
      RFLM(Receive FIFO Locked mode) 接收FIFO锁定模式:在接收FIFO溢出时,CAN 控制器进入锁定状态,丢弃刚刚接收到的那个数据,此时接收FIFO中的数据不会被清除,直到接收FIFO空出空间才会解锁;若不锁定,下一个接受的报文会覆盖已有的报文
      TXFP(Transmit FIFO Priority) 发送FIFO优先级:设定发送优先级的规则判定,可指定按照ID优先级还是报文存进邮箱的顺序来发送
  • 位时序寄存器(CAN_BTR)

    Slient Mode(debug) - SLIM: 静默模式,开启后只能王总线上发送隐性位
    Loop back mode(debug) -LBKM: 回环模式,开启后CAN发射器会将自己发送的信号回送到接收器上一份
    两者结合就有了以下几种模式:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 位时序
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    • 同步段(SYNC SEG):SS段的大小固定为1TP用于检测边沿, 如果信号边沿再SS段内,则是同步的
    • BS1段:可在同步期间增长
    • BS2段:可在同步期间缩短
    • CAN波特率=Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler) 这里的pclk位42M
      可以使用波特率计算软件来计算CAN的波特率
  • 邮箱
    • 发送邮箱:有3个发送邮箱,可以缓存3个待发送的报文,注意:当报文使用扩展标识符的时候,标识符寄存器 CAN_TIxR 中的 STDID[10:0] 等效于 EXTID[18:28] 位,它与 EXTID[17:0],以下是发送邮箱里的寄存器图
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    • 接收邮箱:有2个FIFO,每个FIFO有3个邮箱,可以缓存6个报文,有计数器来记录当前缓存的报文数量,以下是接收邮箱寄存器图
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  • 滤波器:有2个滤波器,CAN1和CAN2共用,可以配置接收哪些ID的报文,以下是滤波器寄存器图
    • 两种ID长度
      • STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位,一共 31 位。
      • STDID[10:0]、RTR、IDE 和 EXTID[17:15],一共 16 位
    • 筛选器模式:
      • ID表筛选:滤波器根据标准帧的 ID 或者扩展帧的 ID 进行匹配,匹配成功后,该帧会被放入接收邮箱
      • ID掩码列表:把报文 ID 的某几位作为查询匹配的对象,可以称之为掩码,如下图,1,0,x(随意值)
        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
        _ 如图
        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  • HAL库代码
    • 初始化
    typedef struct
    {
        uint32_t Prescaler;  /* 配置 CAN 外设的时钟分频,可设置为 1-1024*/
        uint32_t Mode;       /* 配置 CAN 的工作模式,回环或正常模式 */
        uint32_t SyncJumpWidth;  /* 配置 SJW 极限值 */
        uint32_t TimeSeg1;   /* 配置 BS1 段长度 */
        uint32_t TimeSeg2;   /* 配置 BS2 段长度 */
        FunctionalState TimeTriggeredMode;   /* 是否使能 TTCM 时间触发功能 */
        FunctionalState AutoBusOff;     /* 是否使能 ABOM 自动离线管理功能 */
        FunctionalState AutoWakeUp;   /* 是否使能 AWUM 自动唤醒功能 */
        FunctionalState AutoRetransmission;  /* 是否使能 NART 自动重传功能 */
        FunctionalState ReceiveFifoLocked;   /* 是否使能 RFLM 锁定 FIFO 功能 */
        FunctionalState TransmitFifoPriority;/* 配置 TXFP 报文优先级的判定方法 */
    } CAN_InitTypeDef;
    
    • 发送接收结构体:通过发送和接收结构体来传递报文数据
    typedef struct
        {
        uint32_t StdId;    /* 存储报文的标准标识符 11 位,0-0x7FF.  */
        uint32_t ExtId;    /* 存储报文的扩展标识符 29 位,  0-0x1FFFFFFF. */
        uint32_t IDE;      /* 存储 IDE 扩展标志 */
        uint32_t RTR;      /* 存储 RTR 远程帧标志 */
        uint32_t DLC;      /* 存储报文数据段的长度,0-8 */
        FunctionalState TrasmitGlobalTime; 
        } CAN_TxHeaderTypeDef;
    typedef struct
        {
        uint32_t StdId;    /* 存储报文的标准标识符 11 位,0-0x7FF. */
        uint32_t ExtId;    /* 存储报文的扩展标识符 29 位,0-0x1FFFFFFF. */
        uint32_t IDE;      /* 存储 IDE 扩展标志 */
        uint32_t RTR;      /* 存储 RTR 远程帧标志 */
        uint32_t DLC;      /* 存储报文数据段的长度,0-8 */
        uint32_t Timestamp; 
        uint32_t FilterMatchIndex; 
        } CAN_RxHeaderTypeDef;
    
    注意:当报文是遥控帧时 DLC值为 0。
    • 筛选器结构体
    typedef struct
        {
          uint32_t FilterIdHigh;         /*CAN_FxR1 寄存器的高 16 位 */
          uint32_t FilterIdLow;         /*CAN_FxR1 寄存器的低 16 位 */
          uint32_t FilterMaskIdHigh;   /*CAN_FxR2 寄存器的高 16 位 */
          uint32_t FilterMaskIdLow;    /*CAN_FxR2 寄存器的低 16 位 */
          uint32_t FilterFIFOAssignment;  /* 设置经过筛选后数据存储到哪个接收 FIFO */
          uint32_t FilterBank;            /* 筛选器编号,范围 0-27,数据手册上说0-27是CAN1/     CAN2共享,但是实测发现并不是这样,CAN1是0-13,CAN2是14-27 */
          uint32_t FilterMode;            /* 筛选器模式 */
          uint32_t FilterScale;           /* 设置筛选器的尺度 */
          uint32_t FilterActivation;      /* 是否使能本筛选器 */
          uint32_t SlaveStartFilterBank;  
        } CAN_FilterTypeDef;
    
    结构体成员内容简图

总结

呼呼呼呼呼,好难呀,加油!!!
😄😃😆😊

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值