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(); } }
Erster Versuch: myFilter.FilterActivation = DISABLE; Anschalten kannst ihn immer noch.
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 :-)
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 ;)
Unter Umständen hat der nicht näher spezifizierte STM32 ein "CAN interrupt enable register (CAN_IER)"
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); |
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
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
Senden tu ich mit ner Standard 11-Bit ID. Mit nem IXXAT CAN Analyzer... Hardware selbst ist in Ordnung.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.