STM32笔记---CAN采样点设置和报错

采样点设置

以前配置CAN参数的BS1BS2参数时认为总线波特率符合要求就可以了,其实同一个波特率可能对应多组参数设置的情况,这时就要从采样点的角度来考虑了。
采样点计算: ( 1 + B S 1 ) / ( 1 + B S 1 + B S 2 ) (1+BS1) / (1 + BS1 + BS2) (1+BS1)/(1+BS1+BS2)
CiA推荐的采样点设置:当波特率 > 800K采样点75%,当波特率 > 500K采样点80%, 当波特率 <= 500K采样点87.5% 。

再同步补偿宽度(SJW)设置

再同步补偿宽度(SJW)的设置范围位1-4TQ,相当于CAN总线的采样点可以根据实际情况在1-4个TQ范围内进行调整,这个值大可以增大CAN波特率的容错范围。
可以参考参考手册中位时序部分的描述。
在这里插入图片描述
在这里插入图片描述

参考连接:https://zhuanlan.zhihu.com/p/38299092

参考文章:
http://www.zlgcan.com/cancaiyang/68/

报错分析

之前使用CAN总线一直没详细搞清楚,使能的错误中断都具体对应的是什么,使用的时候一下把所有的CAN错误中断都使能上,正好今天遇到的CAN总线的一些问题,详细看了下。
使能所有的CAN错误中断:

/* 使能CAN错误中断 */
  HAL_CAN_ActivateNotification(&hcan, CAN_IT_ERROR | CAN_IT_BUSOFF | CAN_IT_ERROR_PASSIVE | CAN_IT_ERROR_WARNING | CAN_IT_LAST_ERROR_CODE);

CAN中断使能寄存器

在这里插入图片描述
在这里插入图片描述
这里我们要搞清楚ERRIE和后面LCEIE,BOFIE,EPVIE,EWGIE几个中断使能的关系:ERRIE相当于错误使能的总开关,其它的错误中断使能相当于分开关,这里我们可以在HAL库的CAN中断处理的部分找到依据,ERRIE中断使能后出错时会将主状态寄存器(MSR)中的ERRI位置位,然后再依次判断有哪些分开关管理的错误中断触发了。

/* Error interrupts management *********************************************/
  if ((interrupts & CAN_IT_ERROR) != 0U)
  {
    if ((msrflags & CAN_MSR_ERRI) != 0U)
    {
      /* Check Error Warning Flag */
      if (((interrupts & CAN_IT_ERROR_WARNING) != 0U) &&
          ((esrflags & CAN_ESR_EWGF) != 0U))
      {
        /* Set CAN error code to Error Warning */
        errorcode |= HAL_CAN_ERROR_EWG;

        /* No need for clear of Error Warning Flag as read-only */
      }

      /* Check Error Passive Flag */
      if (((interrupts & CAN_IT_ERROR_PASSIVE) != 0U) &&
          ((esrflags & CAN_ESR_EPVF) != 0U))
      {
        /* Set CAN error code to Error Passive */
        errorcode |= HAL_CAN_ERROR_EPV;

        /* No need for clear of Error Passive Flag as read-only */
      }

      /* Check Bus-off Flag */
      if (((interrupts & CAN_IT_BUSOFF) != 0U) &&
          ((esrflags & CAN_ESR_BOFF) != 0U))
      {
        /* Set CAN error code to Bus-Off */
        errorcode |= HAL_CAN_ERROR_BOF;

        /* No need for clear of Error Bus-Off as read-only */
      }

      /* Check Last Error Code Flag */
      if (((interrupts & CAN_IT_LAST_ERROR_CODE) != 0U) &&
          ((esrflags & CAN_ESR_LEC) != 0U))
      {
        switch (esrflags & CAN_ESR_LEC)
        {
          case (CAN_ESR_LEC_0):
            /* Set CAN error code to Stuff error */
            errorcode |= HAL_CAN_ERROR_STF;
            break;
          case (CAN_ESR_LEC_1):
            /* Set CAN error code to Form error */
            errorcode |= HAL_CAN_ERROR_FOR;
            break;
          case (CAN_ESR_LEC_1 | CAN_ESR_LEC_0):
            /* Set CAN error code to Acknowledgement error */
            errorcode |= HAL_CAN_ERROR_ACK;
            break;
          case (CAN_ESR_LEC_2):
            /* Set CAN error code to Bit recessive error */
            errorcode |= HAL_CAN_ERROR_BR;
            break;
          case (CAN_ESR_LEC_2 | CAN_ESR_LEC_0):
            /* Set CAN error code to Bit Dominant error */
            errorcode |= HAL_CAN_ERROR_BD;
            break;
          case (CAN_ESR_LEC_2 | CAN_ESR_LEC_1):
            /* Set CAN error code to CRC error */
            errorcode |= HAL_CAN_ERROR_CRC;
            break;
          default:
            break;
        }

        /* Clear Last error code Flag */
        CLEAR_BIT(hcan->Instance->ESR, CAN_ESR_LEC);
      }
    }

    /* Clear ERRI Flag */
    __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_ERRI);
  }

CAN错误状态寄存器

在这里插入图片描述
在这里插入图片描述
这个位置就是发生CAN错误时,实际要重点关注的位置,这个位置描述了具体是什么错误状态,然后寻找对应的解决办法。

  • 29
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F-J1939 CAN通信协议是一种适用于物联网设备的协议,该协议是基于CAN总线实现的。其主要应用于移动设备与汽车之间的通信,旨在提高通信效率和可靠性。 该协议使用标准的J1939协议,并通过STM32F系列单片机实现CAN总线通信。通过该协议,不仅能够实现数据的高速传输,还能够保证数据的完整性和准确性。 当使用STM32F-J1939 CAN通信协议时,需要注意的是必须按照协议要求设置CAN节地址、数据帧格式等参数才能正常使用。此外,在实际应用中还需要进行一些必要的调试和测试工作,以确保数据传输的可靠性和稳定性。 总之,STM32F-J1939 CAN通信协议是一种可靠高效的通信协议,其在物联网和汽车领域具有广泛应用价值,未来会有更多厂商将其应用于各种智能设备和系统中。 ### 回答2: STM32F-J1939是一种嵌入式系统模块,支持CAN通信协议。CAN(Controller Area Network控制器局域网)是一种用于高速数据传输和实时控制的通信协议。它最初是为汽车行业开发的,但现在已广泛应用于许多不同的应用程序领域。 STM32F-J1939模块是在STM32系列微控制器上实现的,它配备了可编程的CAN控制器,可以很好地支持CAN通信标准。这意味着模块已经具备了CAN通信所需的硬件资源并且通过软件可以进行配置和控制。 J1939是一种基于CAN通信协议的高层协议,最初用于商用车辆和重型机械设备中。这种协议定义了一组通用的信号类型和数据格式,用于在车辆和机器之间传递信息。STM32F-J1939模块可以很好地支持这种高层协议,并且可以通过J1939协议指定和处理消息。 总结来说,STM32F-J1939模块通过CAN通信协议和J1939高层协议,使嵌入式系统在车辆和机械设备中实现快速、可靠的数据传输和实时控制。同时,它也为开发人员提供了方便的软件配置和控制接口。 ### 回答3: STM32F-J1939是一种可以实现CAN通信协议的芯片。J1939通信协议被广泛应用于重型商用车辆和机械设备的网络通信中,因为它具有高效稳定、安全可靠、数据传输速度快等优。这种协议的实现需要支持CAN通信的硬件和软件,并需要作者根据实际需求进行编程。 利用STM32F-J1939芯片实现CAN通信协议非常方便,可以实现广泛的应用场景,例如汽车和设备之间的数据传输、监控、诊断等。同时,通过使用CAN通信协议,可以避免数据传输中的干扰和信号丢失等问题,从而提高了通信的稳定性和可靠性。 总之,STM32F-J1939芯片的CAN通信协议实现将为重型商用车辆和机械设备带来更高效、更安全的通信方式,这种协议具有广泛的应用前景和市场前景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值