cuncaoxin 发表于 2018-7-27 15:52:21

STM32F042 CAN通信发生通信出错,波形被截断

    最近在使用一款STM32F042K6T6的片子在做充电器与锂电池的项目,在通信过程发现有个别数据帧中发生了错误,并产生了错误中断,TEC寄存器在累加。
    通过使用示波器观察通信波形,发现在发送数据过程中,有个别数据帧被从中间截断,没有完整发送一帧数据。因为打开了自动重传功能,所以马上又重发了一帧。但也有可能一直处于重传模式,无法进行正常通信。各位大神,麻烦帮忙指点一二,到底是什么情况会引起如下错误。具体波形如下:

      
                               发生错误时的波形


      
                                  错误帧展开

      
                              重传了一帧正常数据

      
            圈出来的为全部错误,后面才重传正常。



      

                                  电路原理图




cuncaoxin 发表于 2018-8-7 17:16:09

本帖最后由 cuncaoxin 于 2018-8-7 17:17 编辑

butterflyspring 发表于 2018-8-2 17:44
你软件是用的什么接口?中断?轮训?还是DMA?
CAN收发都是使用中断方式。以下是配置代码,接收数据我是在接收中断callback里面采集。

#include "userdefine.h"
#include "stm32f0xx_hal_can.h"

CANReceiveDataTypeDef       CAN_RXData;
CANComTypeDef               CAN_Com;                        //CAN½á¹¹ÌåÉùÃ÷
/* USER CODE END 0 */

CAN_HandleTypeDef hcan;

/* CAN init function */
void MX_CAN_Init(void)
{

hcan.Instance = CAN;
hcan.Init.Prescaler = 8;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SJW = CAN_SJW_1TQ;
hcan.Init.BS1 = CAN_BS1_5TQ;
hcan.Init.BS2 = CAN_BS2_6TQ;
hcan.Init.TTCM = DISABLE;
hcan.Init.ABOM = DISABLE;
hcan.Init.AWUM = DISABLE;
hcan.Init.NART = DISABLE;
hcan.Init.RFLM = DISABLE;
hcan.Init.TXFP = DISABLE;
HAL_CAN_Init(&hcan);

}

void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
{

GPIO_InitTypeDef GPIO_InitStruct;
if(hcan->Instance==CAN)
{
/* USER CODE BEGIN CAN_MspInit 0 */

/* USER CODE END CAN_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_CAN1_CLK_ENABLE();

    /**CAN GPIO Configuration   
    PA11   ------> CAN_RX
    PA12   ------> CAN_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_CAN;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* USER CODE BEGIN CAN_MspInit 1 */

/* USER CODE END CAN_MspInit 1 */
}
}

void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan)
{

if(hcan->Instance==CAN)
{
/* USER CODE BEGIN CAN_MspDeInit 0 */

/* USER CODE END CAN_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_CAN1_CLK_DISABLE();

    /**CAN GPIO Configuration   
    PA11   ------> CAN_RX
    PA12   ------> CAN_TX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);

    /* Peripheral interrupt Deinit*/
    HAL_NVIC_DisableIRQ(CEC_CAN_IRQn);

}
/* USER CODE BEGIN CAN_MspDeInit 1 */

/* USER CODE END CAN_MspDeInit 1 */
}

/* USER CODE BEGIN 1 */

/***********************************************

************************************************/

void CAN_Config(void)
{
   
CAN_FilterConfTypeDef         sFilterConfig;
static CanTxMsgTypeDef      TxMessage;
static CanRxMsgTypeDef      RxMessage;

/*##-1- Configure the CAN peripheral #######################################*/
hcan.Instance = CAN;
hcan.pTxMsg = &TxMessage;
hcan.pRxMsg = &RxMessage;

/*##-2- Configure the CAN Filter ###########################################*/
sFilterConfig.FilterNumber = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.BankNumber = 14;

if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
{
    /* Filter configuration Error */

}   
HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);         //Æô¶¯CANÖжϣ¬²¢½ÓÊÕÊý¾Ý

}
/***********************************************


************************************************/
uint8_t NOTokNUM = 0x55;

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
{
    if ((CanHandle->pRxMsg->IDE == CAN_ID_STD) && (CanHandle->pRxMsg->DLC == 8))
    {
      CAN_Com.CANRXID = CanHandle->pRxMsg->StdId;
      for(CAN_Com.CANRxBytesNum = 0;CAN_Com.CANRxBytesNum < 8;CAN_Com.CANRxBytesNum++)
      {
            CAN_Com.CANRxDataBuf = CanHandle->pRxMsg->Data;
      }
      if((CAN_Com.CANRXID == 0x0207)||(CAN_Com.CANRXID == 0x0217)||(CAN_Com.CANRXID == 0x0227)||(CAN_Com.CANRXID == 0x0237)||
            (CAN_Com.CANRXID == 0x0247)||(CAN_Com.CANRXID == 0x0257)||(CAN_Com.CANRXID == 0x0267)||(CAN_Com.CANRXID == 0x02D7)||
            (CAN_Com.CANRXID == 0x03FF)||(CAN_Com.CANRXID == 0x03FE))
      {
            CAN_Com.CANRxNewDataFlage = 1;
            ReceiveDataNum = 255;                                 //CANͨÐų¬Ê±¸³³õÖµ 280
            
      }      
   
   }
/* Receive */
if (HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0) != HAL_OK)
{
      NOTokNUM = 0x99;
    /* Reception Error */
}

}

cuncaoxin 发表于 2018-8-2 16:03:12

有没有ST原厂的专家指点一二。。。。

butterflyspring 发表于 2018-8-2 17:44:45

你软件是用的什么接口?中断?轮训?还是DMA?

任风吹吹 发表于 2018-8-16 11:53:21

在出错的时候查看下错误寄存器的值为多少,里边包含了错误原因。CAN error status register (CAN_ESR) LEC: Last error code ,根据其值再分析。
页: [1]
查看完整版本: STM32F042 CAN通信发生通信出错,波形被截断