Forum: Mikrocontroller und Digitale Elektronik STM32 und CAN


von ich (Gast)


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();
  }

}

von Benjamin S. (recycler)


Lesenswert?

Erster Versuch:
myFilter.FilterActivation = DISABLE;

Anschalten kannst ihn immer noch.

von geier99 (Gast)


Lesenswert?

ich schrieb:
> Oder hatt wer einen Beispilcode für die CubeMX HAL?

https://github.com/geier99/STM32-CAN_CubeMX_Tests

Ich hatte auch mal ein Test-Projekt mit dem CubeMX und CAN gemacht :-)

von ich (Gast)


Lesenswert?

Ih glaube das ich irgendwo vergessen habe den CAN RX Interrupt zu 
aktivieren.

Nur weis ich als STM32 Neuling nicht wie ich den Enable, wenn es das 
ist.
Komme aus der 8051er Welt ;)

von Christopher J. (christopher_j23)


Lesenswert?

Unter Umständen hat der nicht näher spezifizierte STM32 ein "CAN 
interrupt enable register (CAN_IER)"

von pegel (Gast)


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);

von ich (Gast)


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

von pegel (Gast)


Lesenswert?

Ein Beispiel mit Interrupt gibt es in der HAL Lib unter:

STM32Cube_FW_F4_V1.21.0/Projects/STM324x9I_EVAL/Examples/CAN/CAN_Network 
ing

von Karl (Gast)


Lesenswert?

ich schrieb:
> wird nicht aufgerufen wenn ich Daten hinsende.

Du sendest mir einer extended ID?

von ich (Gast)


Lesenswert?

Senden tu ich mit ner Standard 11-Bit ID. Mit nem IXXAT CAN Analyzer...

Hardware selbst ist in Ordnung.

von Simon (Gast)


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

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.