STM32 und CAN

Gast #5434551
Lesenswert?

Hi,

Versuche grad CAN am STM32 zum laufen zu bekommen.

Senden klappt schon, Empfang haut nicht hin.
Selbst im IRQ Handler des CAN wird nicht aufgerufen wenn ich Daten 
hinsende.

Ideen? Oder hatt wer einen Beispilcode für die CubeMX HAL?

Hab die HAL mit CubeMX erstellt und arbeite mit Atollic Truestudio.



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

  static CanRxMsgTypeDef CanRX;
  static CanTxMsgTypeDef CanTX;
  CAN_FilterConfTypeDef myFilter;


  hcan.Instance = CAN1;

  hcan.pRxMsg = &CanRX;
  hcan.pTxMsg = &CanTX;

  hcan.Init.Prescaler = 16;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_12TQ;
  hcan.Init.BS2 = CAN_BS2_5TQ;
  hcan.Init.TTCM = DISABLE;
  hcan.Init.ABOM = DISABLE;
  hcan.Init.AWUM = DISABLE;
  hcan.Init.NART = ENABLE;
  hcan.Init.RFLM = DISABLE;
  hcan.Init.TXFP = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    _Error_Handler(_FILE_, _LINE_);
  }

  myFilter.FilterNumber = 0;
  myFilter.FilterMode = CAN_FILTERMODE_IDMASK;
  myFilter.FilterScale = CAN_FILTERSCALE_32BIT;
  myFilter.FilterIdHigh = 0x0000;
  myFilter.FilterIdLow = 0x0000;
  myFilter.FilterMaskIdHigh = 0x0000;
  myFilter.FilterMaskIdLow = 0x0000;
  myFilter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  myFilter.FilterActivation = ENABLE;
  //myFilter.BankNumber = 14;

  if (HAL_CAN_ConfigFilter(&hcan, &myFilter) != HAL_OK)
  {
  /* Filter Config Error */
   Error_Handler();
  }

}
Gast #5435065
Lesenswert?

Wenn ich in CubeMX den Int einstelle, dann ergibt sich:
1
    /* CAN1 interrupt Init */
2
    HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
3
    HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
4
    HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 0, 0);
5
    HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
Gast #5435086
Lesenswert?

pegel schrieb:
> Wenn ich in CubeMX den Int einstelle, dann ergibt sich:
>     /* CAN1 interrupt Init */
>     HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
>     HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
>     HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 0, 0);
>     HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);

Ja hab ich hier auch so
Gast #5437503
Lesenswert?

ich schrieb:
> hcan.Init.Mode = CAN_MODE_NORMAL;

Du kannst den mal auf loopback stellen und etwas senden. Dann sollte er 
in die ISR springen. So hast Du mal die ganze Hardware, 
Protokollabweichungen etc. als mögliche Fehlerursache draussen. Das ist 
ein sehr praktisches Feature, um den Fehler einzugrenzen.

Gruäss
Simon

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren