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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版