你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

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

      

发生了一次错误并重传

发生了一次错误并重传

                               发生错误时的波形


      

错误帧展开

错误帧展开

                                  错误帧展开

      

重传帧

重传帧

                              重传了一帧正常数据

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



       通信波形.JPG

                                  电路原理图




收藏 1 评论4 发布时间:2018-7-27 15:52

举报

4个回答
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[CAN_Com.CANRxBytesNum] = CanHandle->pRxMsg->Data[CAN_Com.CANRxBytesNum];
        }
        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?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

任风吹吹 回答时间:2018-8-16 11:53:21
在出错的时候查看下错误寄存器的值为多少,里边包含了错误原因。CAN error status register (CAN_ESR) LEC[2:0]: Last error code ,根据其值再分析。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版