搜索
查看: 2792|回复: 4

[已解决] STM32F042 CAN通信发生通信出错,波形被截断

[复制链接]

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

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

      

发生了一次错误并重传

发生了一次错误并重传

                               发生错误时的波形


      

错误帧展开

错误帧展开

                                  错误帧展开

      

重传帧

重传帧

                              重传了一帧正常数据

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



       通信波形.JPG

                                  电路原理图




回复

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2019-4-17
 楼主| 发表于 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 */
  }

}
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2019-4-17
 楼主| 发表于 2018-8-2 16:03:12 | 显示全部楼层
有没有ST原厂的专家指点一二。。。。
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2018-8-2 17:44:45 | 显示全部楼层
你软件是用的什么接口?中断?轮训?还是DMA?

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

132

帖子

20

蝴蝶豆

金牌会员

最后登录
2020-9-27
发表于 2018-8-16 11:53:21 | 显示全部楼层
在出错的时候查看下错误寄存器的值为多少,里边包含了错误原因。CAN error status register (CAN_ESR) LEC[2:0]: Last error code ,根据其值再分析。

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 15:05 , Processed in 1.180375 second(s), 42 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表