Hallo,
ich habe mich mit einem STM23F103RBT in CAN eingearbeitet und es hat
soweit gut funktioniert.
Nun möchte ich CAN in meinem Projekt mit einem STM32F767ZIT verwenden.
Ich verwende hier ebenfalls HAL-Treiber. Beim Initialisieren bringt er
einen HAL-Error. Er wird an folgender Stelle generiert:
1
/* Check Sleep mode leave acknowledge */
2
while((hcan->Instance->MSR&CAN_MSR_SLAK)!=RESET)
3
{
4
if((HAL_GetTick()-tickstart)>CAN_TIMEOUT_VALUE)
5
{
6
/* Update error code */
7
hcan->ErrorCode|=HAL_CAN_ERROR_TIMEOUT;
8
9
/* Change CAN state */
10
hcan->State=HAL_CAN_STATE_ERROR;
11
12
returnHAL_ERROR;
13
}
14
}
Mir ist allerdings nicht ganz klar, wie der Timeout geprüft wird. Kann
der Fehler daran liegen, daß aktuell noch kein CAN-Transceiver an den
Prozessorports angeschlossen ist? Bei dem kleinen STM32 war einer
bereits am Testboard von Olimex bestückt. Ich muß mir erst einen
Transceiver beschaffen.
Gruß
Martin
Martin R. schrieb:> Mir ist allerdings nicht ganz klar, wie der Timeout geprüft wird. Kann> der Fehler daran liegen, daß aktuell noch kein CAN-Transceiver an den> Prozessorports angeschlossen ist? Bei dem kleinen STM32 war einer> bereits am Testboard von Olimex bestückt. Ich muß mir erst einen> Transceiver beschaffen.
PullUp an Can RX, solange kein Transceiver dranhängt.
Gibt es für den STM32F767ZIT Beispielprogramme für CAN? Ich habe per
Google-Suche nichts vernünftiges gefunden.
Das Ganze ist schon deutlich anders (komplexer) als beim kleinen
STM23F103RBT. Auf Anhieb habe ich es noch nicht verstanden, wie es beim
STM32F767ZIT funktioniert. Fängt schon damit an, daß es dort in der
Rx-/Tx-Struktur keine Datenbytes gibt.
Gruß
Martin
moin,
>>Das Ganze ist schon deutlich anders (komplexer) als beim kleinen
STM23F103RBT.
glaub ich nicht, warum auch?
Ich benutze für 103/303/405/407 da selbe CAN-Modul...allerdings in
PASCAL.
Setze Bit 30 im BTR Register, damit wird der LoopBack eingeschaltet.
Peter
Die haben irgendwann mal für die größeren CPUs die HAL Treiber umgebaut
und das nach und nach für alle gemacht. Kann es sein das das das auf dem
F1 noch nicht angekommen ist? Ich hab ewig nicht mehr mit der F1 Serie
gearbeitet. Auf dem F2 ist es seit kurzem.
Hier mal ein einfaches Beispiel, damit solltest du eigentlich Sachen
verschicken und empfangen können. Ich weiß ja nicht wie deine use case
aussieht. Das CAN_Send könnte man im TX Complete Callback aufrufen um
neue Daten zu verschicken. Ich hab das bei mir mit einer dynamischen
Liste gelöst zu der neue Frames hinzugefügt werden und die wird dann in
den Callbacks abgearbeitet. Der code geht natürlich nur wenn du einen
CAN benutzt, wenn du mehrere hast musst du in de Callbacks entsprechend
zuordnen.
Guest schrieb:> void CAN_Init(){>> HAL_CAN_Start(hcan);>> HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);> HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO1_MSG_PENDING);> HAL_CAN_ActivateNotification(hcan, CAN_IT_TX_MAILBOX_EMPTY);> HAL_CAN_ActivateNotification(hcan, CAN_IT_ERROR_PASSIVE);> HAL_CAN_ActivateNotification(hcan, CAN_IT_ERROR_WARNING);> HAL_CAN_ActivateNotification(hcan, CAN_IT_BUSOFF);> HAL_CAN_ActivateNotification(hcan, CAN_IT_LAST_ERROR_CODE);> HAL_CAN_ActivateNotification(hcan, CAN_IT_ERROR);
Danke für die Infos. Ich habe schon das Problem, daß die Initialisierung
nicht geht:
CAN_HandleTypeDef hcan1;
HAL_CAN_Start(hcan1);
HAL_CAN_ActivateNotification(hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
HAL_CAN_ActivateNotification(hcan1, CAN_IT_RX_FIFO1_MSG_PENDING);
HAL_CAN_ActivateNotification(hcan1, CAN_IT_TX_MAILBOX_EMPTY);
HAL_CAN_ActivateNotification(hcan1, CAN_IT_ERROR_PASSIVE);
HAL_CAN_ActivateNotification(hcan1, CAN_IT_ERROR_WARNING);
HAL_CAN_ActivateNotification(hcan1, CAN_IT_BUSOFF);
HAL_CAN_ActivateNotification(hcan1, CAN_IT_LAST_ERROR_CODE);
HAL_CAN_ActivateNotification(hcan1, CAN_IT_ERROR);
Es kommt die Compilermeldung:
* incompatible type for argument 1 of 'HAL_CAN_Start'
* incompatible type for argument 1 of 'HAL_CAN_ActivateNotification'
Was gefällt ihm an hcan1 nicht?
Du musst ihm die Adresse übergeben:
HAL_CAN_Start(&hcan1);
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
HAL_CAN_AddTxMessage(&hcan1,...)
...
Damit sollte das klappen. Ich habe den Code bei mir raus kopiert da
stand das in Funktionen drin die schon Pointer bekommen das hab ich beim
kopieren vergessen :(
Hi.
Ich würde einfach die HAL weglassen und die CAN Register selber
einstellen. Guck dir mal das Reference Manual an. Da ist eig auf 30
Seiten jede Einstellung und Funktion beschrieben. Zumindest bei STM32F4.
Wird ja vermutlich ähnlich sein.
Ich bin auch einen Tag lang mit der Hal nicht wirklich weitergekommen,
weil die ja sehr bescheiden kommentiert ist. Im nachhinein hab ich es
einfach selber gemacht. Das ist wirklich relativ einfach.
Die Can Perepherie setzt fast alles in HW um man muss nur ein paar
Einstellungen vornehmen und die Mailboxen abfragen.
Mirco schrieb:> Ich bin auch einen Tag lang mit der Hal nicht wirklich weitergekommen,> weil die ja sehr bescheiden kommentiert ist.
Es gibt für so gut wie alles Beispiele in den HAL Treibern die CubeMX
runterlädt. In der Zeit in der du Register suchst und das Manual liest
hast du das mit der HAL 3 mal gemacht oder ist es zu schwer 3 Funktionen
zu verwenden?
Nun bin ich endlich wieder dazu gekommen, das Ganze zu testen. Nun kommt
folgende Fehlermeldung:
invalid type argument of '->' (have 'struct can_def')
bei
1
RXid=can->rxFrame0.header.StdId;
2
RXdata[0]=can->rxFrame0.data[0];
3
RXdata[1]=can->rxFrame0.data[1];
4
RXdata[2]=can->rxFrame0.data[2];
wie hast du die Struktur "can" angelegt?
Gruß
Martin
Guest schrieb:> Es gibt für so gut wie alles Beispiele in den HAL Treibern die CubeMX> runterlädt
Bei mir finde ich keine Beispiele im CubeMX-Pfad. Wo sollen die sein?
Martin R. schrieb:> wie hast du die Struktur "can" angelegt?
das ist der Pointer auf die CAN Instanz die im RX Callback mit übergeben
wird. Das müsste demnach:
RXdata[0] = hcan->rxFrame0.data[0];
etc.
heißen. Wie gesagt habe das aus meiner lib kopiert da ist das teilweise
in eigenen Structs gelandet ich habe da beim copy paste etwas verkackt
sry. :D
Martin R. schrieb:> Bei mir finde ich keine Beispiele im CubeMX-Pfad. Wo sollen die sein?
Unter Windows:
C:\Users\"UserName"\STM32Cube\Repository
da sind die Firmware Files und innerhalb der Ordner für die Firmware der
einzelnen MCUs gibt es den Ordner Projects und da drin sind dann für
verschiedenen Nucleo / Discovery Boards Ordner und in denen sind dann
unter „Examples“ für verschiedenen Peripherie Beispiele. Es gibt nicht
bei jedem alles daher sucht man am besten im Projects Ordner nach der
Peripherie „CAN, ADC, DMA, DAC etc.“