Forum: Mikrocontroller und Digitale Elektronik STM32F103 STM32CubeF1 Version 1.7 Problem mit HAL_CAN_AddTxMessage()


von David (Gast)


Lesenswert?

Hallo miteinander,

ich versuche seit geraumer Zeit mit dem CubeMX eine CAN Kommunikation zu 
realsieren dabei bin ich auf ein Problem gestoßen:
Wenn ich die Funktion HAL_CAN_AddTxMessage() nutze kriege ich ein 
Fehler.
Mit der Funktion HAL_CAN_GetError() kriege ich folgende Fehlermeldung:
HAL_CAN_ERROR_PARAM Weiß jemand was das bedeutet?

Im Internet konnte ich schon ähnliche Fälle finden jedoch kein Tipps.

https://community.st.com/s/question/0D50X0000A4ozhaSQA/halcanerrorparam-in-latest-version-of-stm32f1-hal-library-when-using-halcanaddtxmessage

https://community.st.com/s/question/0D50X0000AFqZMqSQN/stm32cubemx-example-code-not-able-to-receive

Gibt es eventuell Leute die ähnliche Probleme haben?

Hier mal meine Initialisierung:

#include "can.h"

/* USER CODE BEGIN 0 */
CAN_TxHeaderTypeDef   TxHeader;
CAN_RxHeaderTypeDef   RxHeader;
uint8_t               TxData[8];
uint8_t               RxData[8];
uint32_t              TxMailbox;
/* USER CODE END 0 */

CAN_HandleTypeDef hcan;

/* CAN init function */
void MX_CAN_Init(void)
{
  CAN_FilterTypeDef  sFilterConfig;

  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 8;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan.Init.TimeSeg1 = CAN_BS1_12TQ;
  hcan.Init.TimeSeg2 = CAN_BS2_5TQ;
  hcan.Init.TimeTriggeredMode = DISABLE;
  hcan.Init.AutoBusOff = DISABLE;
  hcan.Init.AutoWakeUp = DISABLE;
  hcan.Init.AutoRetransmission = ENABLE;
  hcan.Init.ReceiveFifoLocked = DISABLE;
  hcan.Init.TransmitFifoPriority = DISABLE;

  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
    xprintf("CAN Init ERROR");
  }

  /* Configure the CAN Filter */
  sFilterConfig.FilterBank = 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_RX_FIFO0;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.SlaveStartFilterBank = 14;


  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
    xprintf("CAN ConfigFilter ERROR");
  }

  if (HAL_CAN_Start(&hcan) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
    xprintf("CAN Start ERROR");
  }

  if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) 
!= HAL_OK)
  {
    /* Notification Error */
    Error_Handler();
    xprintf("CAN ActivateNotification ERROR");
  }

  TxHeader.StdId = 321;
  TxHeader.ExtId = 0x01;
  TxHeader.RTR = CAN_RTR_DATA;
  TxHeader.IDE = CAN_ID_STD;
  TxHeader.DLC = 7;
  TxHeader.TransmitGlobalTime = DISABLE;

  xprintf("CAN Init finished");

}


Und hier die der Befehl mit den notwendigen Anhängen die mir zum 
debuggen dienten:



  TxData[0] = 0xFF;
  TxData[1] = 0xFF;
  TxData[2] = 0x03;
  TxData[3] = 0x04;
  TxData[4] = 0x05;
  TxData[5] = 0x06;
  TxData[6] = 0x07;

.
.
.
.
.
  while (1)
  {
 if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != 
HAL_OK)
      {
        /* Transmission request Error */
      xprintf("Transmission Error!");
        //Error_Handler();
      }

    HAL_Delay(1000);

    xprintf(" %d ", TxHeader);
    if(HAL_CAN_GetError(&hcan) != HAL_CAN_ERROR_NONE)
    {
      //xprintf("Fehler ist da!");
      CanErr = HAL_CAN_GetError(&hcan);
      //xprintf(" %d ", CanErr);
    }

    if(HAL_CAN_GetState(&hcan) == HAL_CAN_STATE_ERROR)
    {
      xprintf("HAL_CAN_STATE_ERROR");
    }
  }



Ich würde mich echt freuen, wenn mir jemand einen Tipp geben könnte.

Grüße David

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.