搜索不是的FDCAN错误

始终可以使用CAN进行操作很简单,但是出了点问题(在KDPV上的设备中)...

图片

最近,我经常设法使用STM32H750VB微控制器,在一个设备中我需要使用CAN总线,但是我所做的第一次尝试显示出我所有的自信心都带来了奇怪的结果。 故事描述如下。

因此,首先是关于电路。 在KDPV上,它用绿色圈出,当然,罪魁祸首是微控制器,CAN并没有什么复杂的问题-它根据

图片

MAX3051用作物理层(嗯,我喜欢它..),如下所示:

图片

以前,STM32F107不在STM32H750VB中,而是在同一系统中,但这位老人无法应付这些任务,因此决定将其替换为更现代年轻的任务

但是,这是不幸的-旧的微控制器具有bxCAN,而新的微控制器已经具有FDCAN。 尽管存在差异,但是从代码的角度(和工作-总线上的设备很旧)来看:更换非常简单。 对于那些谁愿意,您可以比较:
已成为
  MX_CAN1_Init(); 
  MX_FDCAN1_Init(); 
     hcan1.Instance = CAN1;
     hcan1.Init.Prescaler = 4;
     hcan1.Init.Mode = CAN_MODE_NORMAL;
     hcan1.Init.SyncJumpWidth = CAN_SJW_4TQ;
     hcan1.Init.TimeSeg1 = CAN_BS1_15TQ;
     hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
     hcan1.Init.TimeTriggeredMode = DISABLE;
     hcan1.Init.AutoBusOff =启用;
     hcan1.Init.AutoWakeUp =禁用;
     hcan1.Init.AutoRetransmission =禁用;
     hcan1.Init.ReceiveFifoLocked =禁用;
     hcan1.Init.TransmitFifoPriority = DISABLE; 
   hfdcan1.Instance = FDCAN1;
   hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
   hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
   hfdcan1.Init.AutoRetransmission =启用;
   hfdcan1.Init.TransmitPause = DISABLE;
   hfdcan1.Init.ProtocolException = ENABLE;
   hfdcan1.Init.NominalPrescaler = 1;
   hfdcan1.Init.NominalSyncJumpWidth = 3;
   hfdcan1.Init.NominalTimeSeg1 = 11;
   hfdcan1.Init.NominalTimeSeg2 = 4;
   hfdcan1.Init.DataPrescaler = 1;
   hfdcan1.Init.DataSyncJumpWidth = 3;
   hfdcan1.Init.DataTimeSeg1 = 11;
   hfdcan1.Init.DataTimeSeg2 = 4;
   hfdcan1.Init.MessageRAMOffset = 64;
   hfdcan1.Init.StdFiltersNbr = 0;
   hfdcan1.Init.ExtFiltersNbr = 0;
   hfdcan1.Init.RxFifo0ElmtsNbr = 4;
   hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
   hfdcan1.Init.RxFifo1ElmtsNbr = 4;
   hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
   hfdcan1.Init.RxBuffersNbr = 4;
   hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
   hfdcan1.Init.TxEventsNbr = 4;
 如果(HAL_CAN_Init(&hcan1)!= HAL_OK){ 
 如果(HAL_FDCAN_Start(&hfdcan1)!= HAL_OK){ 

一般来说,化妆品上的差异。 在我看来,它可以一次全部正确地工作。

但是,它并没有立即起作用...

CAN控制器无法设置主导级别并进入总线关闭状态,并且没有从总线接收任何数据(尽管总线上的另一个设备每秒稳定发送两次数据包)。

好吧,我以为,调试线来了,并焊接了CAN-RX和CAN-TX线上的配线(实际上,查看总线本身看起来很合逻辑-该设备处于静默状态,而所连接的其他设备按约定发送了数据包)。

之后,首先打开FDCAN_MODE_BUS_MONITORING模式。 而且,瞧,我立即看到了公共汽车上的包裹! (在此模式下,CAN控制器仅侦听数据,但不传输任何数据)。 太好了...

接下来,打开FDCAN_MODE_EXTERNAL_LOOPBACK模式(相反,在此模式下,我们只听自己的声音,然后将所有内容传输到总线上)。 在CAN_RX和CAN_TX线上,所有数据包都出现了-既由设备本身发送,又从总线接收,此处
在下图中(来自微控制器的灰色数据TX,橙色数据线RX),它们显示为峰值:

图片

因此,在进行了该实验后,很明显电路正常工作,微处理器中的CAN控制器可以接收和发送数据。

但是,当尝试同时接收和发送数据时,系统仍然变为总线关闭,并且错误控制寄存器(FDCAN协议状态寄存器(FDCAN_PSR))中出现错误LEC [2:0] = 5-这意味着从数据表中获取Bit0Error:消息的传输(或确认位或活动错误)
标志或过载标志),则设备希望发送显性级别(数据或标识符位)
逻辑值0),但监视的总线值是隐性...

经过两天的折磨(很清楚错误是什么,但不清楚如何解决),并对数据表,勘误表和大量第三方代码和手册进行了认真的研究,我的理解是启迪 -我做对了一切,但是没有用!

好吧,我想,也许问题出在技术上,并且...替换了微控制器本身(用同一批中的另一个)。 而且...有效! 好吧,也就是说,这里没有麻烦的小手鼓,没有源代码,而且应该是第一次。

简要总结


显然,发现了这样一个狡猾的标本。 但是另一方面,我设法深入研究了FDCAN的总体工作,这可以归因于优点。 并归因于缺点...归因于它们的浪费时间(控制器可以附加到另一个项目上),以及对现代控制器在现代方式下也具有强大力量的越野车的理解(或者这也是一个优点吗?)。

Source: https://habr.com/ru/post/zh-CN483590/


All Articles