Forum: Mikrocontroller und Digitale Elektronik STM32 CAN Reset Bug Workaround geht nicht


von Heinz M. (subi)


Lesenswert?

Hallo,

ich versuche gerade CAN Bus beim STM32 zum laufen zu bekommen.

Dazu bin ich nach dieser Anleitung vorgegangen:
https://www.youtube.com/watch?v=gu1Uz2K3zh4

Wie im Video tritt auch bei mir der Bug auf, dass Reset gedrückt werden 
muss um die nächste Nachricht zu empfangen. Ab 40:18 wird ein Workaround 
für den CAN Bus Bug erklärt, der jedoch bei mir nicht funktioniert:
1
void RxIntEnable(CAN_HandleTypeDef *CanHandle) {
2
  
3
  if(CanHandle->State == HAL_CAN_STATE_BUSY_TX)
4
    CanHandle->State = HAL_CAN_STATE_BUSY_TX_RX;
5
  else {
6
7
    CanHandle->State = HAL_CAN_STATE_BUSY_RX;
8
9
    // Set CAN error code to none
10
    CanHandle->ErrorCode = HAL_CAN_ERROR_NONE;
11
12
    // Enable Error warning Interrupt
13
    __HAL_CAN_ENABLE_IT(CanHandle, CAN_IT_EWG);
14
15
    // Enable Error passive Interrupt
16
    __HAL_CAN_ENABLE_IT(CanHandle, CAN_IT_EPV);
17
18
    // Enable Bus-off Interrupt
19
    __HAL_CAN_ENABLE_IT(CanHandle, CAN_IT_BOF);
20
21
    // Enable Last error code Interrupt
22
    __HAL_CAN_ENABLE_IT(CanHandle, CAN_IT_LEC);
23
24
    // Enable Error Interrupt
25
    __HAL_CAN_ENABLE_IT(CanHandle, CAN_IT_ERR);
26
    }
27
28
    // Enable FIFO 0 message pending Interrupt
29
    __HAL_CAN_ENABLE_IT(CanHandle, CAN_IT_FMP0);
30
}

Als Fehler wird angezeigt:
1
Symbol 'HAL_CAN_STATE_BUSY_TX_RX' could not be resolved
und
1
Symbol 'HAL_CAN_STATE_BUSY_RX' could not be resolved
Die Abfrage ob TX beschäftigt ist funktioniert jedoch.

Im Internet konnte ich leider nichts hilfreiches finden.

STM32F072RBT6 und STM32F042F6P6 tritt bei beiden auf.
CubeMX 5.0.1 und Eclipse mit GCC

von pegel (Gast)


Lesenswert?

Ein Blick in die stm32f0xx_hal_can.h verrät, das hinter

HAL_CAN_STATE_BUSY_TX_RX und HAL_CAN_STATE_BUSY_RX

jeweils noch eine 0 oder 1 gehört.

von Heinz M. (subi)


Lesenswert?

Danke, hab beides ausprobiert. Er zeigt zwar jetzt keinen Fehler mehr 
geht aber trotzdem nicht.

Er springt nicht in die if Schleife.

Warum gibt es hier RX0 und RX1? Es gibt zwar 2 mögliche Pinbelegungen, 
aber nur einen CAN Bus Controller.

von soso (Gast)


Lesenswert?

Heinz M. schrieb:
> if Schleife

OMG

von pegel (Gast)


Lesenswert?

Du benutzt doch CubeMX oder?
Wieso setzt du dann nicht einfach die entsprechenden Häkchen und nutzt 
die CallBack Funktionen?

von Heinz M. (subi)


Lesenswert?

Ja entschuldigung, dass ich mich vertippt habe.

Selbst wenn ich die if Bedingung änder, dass er immer reinspringt 
funktioniert es nicht.

Gibt es noch einen anderen Workaround dafür?

von Heinz M. (subi)


Angehängte Dateien:

Lesenswert?

@pegel: Welches Häkchen, wo?

von pegel (Gast)


Lesenswert?

Bei NVIC Settings.
Habe es kurz probiert und er stellt mir eine HAL_CAN_ErrorCallback 
Funktion zur Verfügung.

von pegel (Gast)


Lesenswert?

In der stm32f0xx_hal_can.h ab Zeile 257 sind alle Möglichen Ergebnisse, 
die die Funktion HAL_CAN_ErrorCallback zurück geben kann.

von Heinz M. (subi)


Angehängte Dateien:

Lesenswert?

Da ist nur der Interrupt.

von pegel (Gast)


Lesenswert?

Genau. Dieser ruft den HAL_CAN_IRQHandler auf, der all das macht was du 
oben mit deinem if() versuchst.

von Heinz M. (subi)


Lesenswert?

Habs noch mal mit einem Schritt rückwärts probiert.

Im Loopback Modus funktioniert es genau so wie es sein soll (mit beiden 
µC und jeweils mit dem Code oben). Aber sobald ich in den normalen Modus 
wechsel muss ich Reset am Empfänger drücken für die nächste Nachricht.

Zwischendrin hatte ich den Fall, dass ich beim Slave Reset gedrückt habe 
und dann lief es so wie es eigentlich soll.

Kann es sein, dass der Bus belegt ist oder so?

von pegel (Gast)


Lesenswert?

Frag die HAL_CAN_ErrorCallback Funktion.
Dazu musst du dann natürlich HAL_CAN_Transmit_IT verwenden.

Für den Empfang gibt es auch eine Funktion mit _IT und eine ohne die 
wartet.

von pegel (Gast)


Lesenswert?

Ein Blick in die Beispiele der HAL Lib zu CAN kann auch nicht schaden.

von Heinz M. (subi)


Lesenswert?

Wenn du die ST Beispiele meinst, die habe ich mir angesehen. Auf den Bug 
gehen die überhaupt nicht ein.

Man findet halt leider zu CAN keine einzige Anleitung die mal wirklich 
zu 100% funktioniert.

von pegel (Gast)


Lesenswert?

Demnächst werde ich mir das mal für den F103 ansehen.
Kann mir nicht vorstellen, dass das nicht geht.

Für heute ist erst mal Schluss,
gute Nacht.

von Dr. Sommer (Gast)


Lesenswert?

Heinz M. schrieb:
> Man findet halt leider zu CAN keine einzige Anleitung die mal wirklich
> zu 100% funktioniert.

Also eigentlich ist das auch nicht so schwierig. Erst auf Wikipedia den 
Artikel zu CAN genau lesen, dann exakt nach Datenblatt auf die Register 
zugreifen. Dabei die HAL gekonnt ignorieren. Dabei bin ich noch auf 
keine Hardware Bugs gestoßen, und HAL Bugs erübrigen sich so auch.

von Dr. Sommer (Gast)


Lesenswert?

PS: Das geht sogar ohne YouTube-"Tut"!

von Heinz M. (subi)


Lesenswert?

@pegel: Danke bis hierhin

@Dr. Sommer: Bitte mal daran denken dass es anderen nicht so leicht 
fällt. Nach deiner Vorgehensweise würde ich 10 Jahre brauchen. Wenn der 
Bug noch behoben ist hat es ca. ein halbes Jahr gedauert. Für meine 
bescheidenen Hobbyprojekte mehr als ausreichend.

von Heinz M. (subi)


Lesenswert?

Hab das Problem beseitigt. Obs gelöst ist, dazu kenne ich mich zu wenig 
aus.

Ich habe µC1(Sender) dauerhaft ADC Werte senden lassen, weil man bei 
schwankenden Werten schön sieht, dass es dauerhaft läuft. Ist eine Art 
Standardtest von mir.

Wenn ich µC2(Empfänger) programmiert oder resetet habe, konnte der eine 
gewisse Zeit nicht empfangen, wodurch die in der Zeit gesendeten aber 
nicht empfangenen Pakete zu Problemen führten (so meine Vermutung). Da 
der Empfänger auch das Display initialisieren muss braucht der natürlich 
wesentlich länger, als der Sender der nur den ADC hat.

Meine Lösung sieht jetzt so aus, dass der Sender erst anfängt zu senden, 
wenn man auf dem Empfänger eine Taste drückt und dies per CAN Bus dem 
Sender mitteilt. Funktioniert bis jetzt ohne Probleme.

Überall da wo ich per CAN Bus dauerhaft viele Werte senden möchte, werde 
ich beim Empfänger einbauen, dass dieser ab und zu ein Lebenszeichen 
sendet. Fällt das aus, dann hören die Sender auf zu senden.

Vielen Dank an pegel. Ohne die Hilfe hätte ich es nicht geschafft.

von Dr. Sommer (Gast)


Lesenswert?

Heinz M. schrieb:
> Meine Lösung sieht jetzt so aus, dass der Sender erst anfängt zu senden,
> wenn man auf dem Empfänger eine Taste drückt und dies per CAN Bus dem
> Sender mitteilt

Das ist aber eigentlich unnötig. Die STM32 kommen definitiv damit klar 
wenn beim Hochfahren ständig Nachrichten ankommen.

von Heinz M. (subi)


Lesenswert?

Wie ich vermutet hatte ist das Problem nicht beseitigt. Ich habe mal 
versucht das Problem einzugrenzen und bin jetzt an dem Punkt, dass das 
Problem nur auftritt, wenn versucht wird auf einen Bus zu schreiben wo 
kein Empfänger dran ist.

Wenn die Kommunikation beendet wird, das Kabel abgezogen und wieder ran 
gesteckt wird und danach die nächste Nachricht gesendet wird ist alles 
ok.

Wird eine Nachricht geschickt, wenn das Kabel abgezogen ist, hängt sich 
der Canbus des Senders auf. Alles andere funktioniert weiter.

Seltsam ist, dass sich die Kommunikation Slave -> Master jedes mal 
aufhängt und die Kommunikation Master -> Slave nur manchmal (ich vermute 
je nach dem wer gerade gesendet oder empfangen hat). Beide sind als 
Master im Canbus. Master ist bei mir der mit dem Display und Slave der 
mit dem ADC zum Werte erfassen.

Reset beim Slave löst nur das Problem Master -> Slave. Reset beim Master 
geht alles wieder.

Ich denke es hat mit dem Problem hier zu tun, aber leider keine Antwort:
https://community.st.com/s/question/0D50X00009XkgdwSAB/can-bus-error-management

Hier wird ebenfalls mein Problem gestriffen.
https://electronics.stackexchange.com/questions/280882/problem-with-can-on-stm32

Wie baue ich einen error handler ein, welcher das senden unterbindet und 
evtl. sogar den Fifo löscht, wenn kein ACK kommt?

Wenn ich nach dem zweiten Link gehe, müssten immer 2 Nodes an einem 
Busabschnitt hängen und dürften nie getrennt werden, sonst gibt es 
Fehler. Aber das kann ich doch gar nicht ausschließen.

No-Automatic Retransmission habe ich bereits auf enable gesetzt. Keine 
Veränderung.

von Sven S. (boldie)


Lesenswert?

Heinz M. schrieb:

>
> Wird eine Nachricht geschickt, wenn das Kabel abgezogen ist, hängt sich
> der Canbus des Senders auf. Alles andere funktioniert weiter.
>

Das ist ja auch kein Wunder, denn da gibt es auf dem CAN-Layer 
Protokolle, die nur funktionieren, wenn mindestens 2 Teilnehmer am Bus 
sind. Ansonsten laufen dir die Errorcounter hoch und dann gibt es einen 
BusOff, weil das ACK fehlt. Das hängt sich nicht auf, das ist per Design 
so gewollt.

von Dr. Sommer (Gast)


Lesenswert?

Heinz M. schrieb:
> Seltsam ist, dass sich die Kommunikation Slave -> Master jedes mal
> aufhängt und die Kommunikation Master -> Slave nur manchmal

CAN kennt keine Master und Slaves.

Heinz M. schrieb:
> No-Automatic Retransmission habe ich bereits auf enable gesetzt. Keine
> Veränderung.

Mal das CAN_MCR_ABOM Bit gesetzt? Den CAN-Controller zu resetten ist wie 
gesagt nicht nötig. Im Gegensatz zu gewissen anderen 
Peripherie-Modulen ist der CAN-Controller der STM32 ziemlich robust. Der 
hat sich bei mir noch nie aufgehängt und verkraftet trennen/verbinden, 
verzögertes Starten der Teilnehmer, 100% Buslast, Störungen problemlos.

Eventuelle Probleme sind hier in der Firmware zu suchen. Als Erstes 
würde ich unbedingt alle Warteschleifen entfernen und vollständig 
asynchron/ereignisbasiert programmieren. Im Empfangs-Interrupt 
eingehende Nachrichten verarbeiten und Mailbox leeren. Im 
Sende-Interrupt Nachrichten senden, falls welche vorliegen. Niemals 
blockierend auf das Freiwerden von Mailboxen bzw. das Ankommen von 
Nachrichten warten.

von Heinz M. (subi)


Lesenswert?

@Sven S.: Ja das habe ich jetzt auch gelesen.

Hätte eigentlich gedacht, dass wenn ich den Automatic Bus-off 
ausschalte, er so lang sendet, bis der Empfänger ein ACK sendet.

Deswegen versuch ich gerade die Can Error Codes auszulesen.
1
CanFehler=CAN_GetLastErrorCode(CAN_TypeDef*CAN);
Bringt den Fehler "expected expression before 'CAN_TypeDef'"
1
CanFehler=CAN_GetLastErrorCode(CAN);
Bringt den Fehler "undefined reference to `CAN_GetLastErrorCode'"

Leider finde ich (bis auf eine russische Seite keine Beispiele zur 
Verwendung der Funktion).

von Dr. Sommer (Gast)


Lesenswert?

Heinz M. schrieb:
> n.
> CanFehler=CAN_GetLastErrorCode(CAN_TypeDef*CAN);

CAN_TypeDef ist der Typ des Parameters. Du musst "CAN1" oder "CAN2" 
übergeben. Genau wie bei CAN_Init & Co.

Heinz M. schrieb:
> Bringt den Fehler "undefined reference to `CAN_GetLastErrorCode'"

Dann linkst du die HAL nicht richtig.

Heinz M. schrieb:
> Leider finde ich (bis auf eine russische Seite keine Beispiele zur
> Verwendung der Funktion).

Schreib doch einfach "CAN1->ESR" um das Statusregister abzufragen. 
Dessen Bits sind genau im Reference Manual dokumentiert.

von Markus (Gast)


Lesenswert?

Also bei mir hat der CAN auch nicht funktioniert, als ich ihn 
initialisiert und die Transmit oder die Receive Funktion genutzt habe.

Aber drauf geschissen. Ich habe dann die Transmit und die Receive 
Funktion selbst geschrieben, indem ich die Handvoll bits selber gesetzt 
bzw. geschoben habe.
Ist ja nicht allzu kompliziert das Ganze.

von Belgacom (Gast)


Lesenswert?

Markus schrieb:

> Also bei mir hat der CAN auch nicht funktioniert, als ich ihn
> initialisiert und die Transmit oder die Receive Funktion genutzt habe.
>
> Aber drauf geschissen. Ich habe dann die Transmit und die Receive
> Funktion selbst geschrieben, indem ich die Handvoll bits selber gesetzt
> bzw. geschoben habe.

Du bist nicht nur ein ganz toller Bursche, sondern hast zudem noch eine 
gewählte Ausdrucksweise.

von Heinz M. (subi)


Lesenswert?

ESR habe ich ausgelsen bekommen, aber wieder mit sehr viel suchen. 
Richtig heißt es CAN_ESR und für STM32F072RBT6 heißt der Befehl 
"CanFehler=CAN->ESR;".

Angezeigt wird 51, also wie schon vermutet der Acknowledge Fehler.


Ist das ABOM Bit setzen so richtig?
1
CAN->MCR |= 1<<6;
Bei Registern will ich nicht rumprobieren, wer weiß was man da alles 
zerstören kann. Reference Manual Seite 833.

Theoretisch müsste es doch reichen das bei der Initialisierung zu setzen 
oder?

von Dr. Sommer (Gast)


Lesenswert?

Heinz M. schrieb:
> ESR habe ich ausgelsen bekommen, aber wieder mit sehr viel suchen.

Wo hast du denn gesucht?! Das steht im Reference Manual auf S. 841. Da 
der Controller nur einen CAN-Controller hat ist es halt "CAN" statt 
"CAN1".

Heinz M. schrieb:
> Angezeigt wird 51, also wie schon vermutet der Acknowledge Fehler.

Dezimal? Dann ist er aber noch nicht im Bus-Off-Mode.

Heinz M. schrieb:
> Ist das ABOM Bit setzen so richtig?CAN->MCR |= 1<<6;

Wie wärs mit CAN->MCR |= CAN_MCR_ABOM? Gleich viel besser lesbar.

Heinz M. schrieb:
> Bei Registern will ich nicht rumprobieren

Dann such dir ein anderes Hobby. Ohne Register gibt das nichts.

Heinz M. schrieb:
> wer weiß was man da alles
> zerstören kann.
Nichts.

Heinz M. schrieb:
> Theoretisch müsste es doch reichen das bei der Initialisierung zu setzen
> oder?
Am Besten während man noch im Initialisierungs-Modus ist.

von Heinz M. (subi)


Lesenswert?

Nach Reset: 0
Nach Rausziehen: 51
Nach wieder reinstecken: 51
Knopf drücken zum Nachricht senden: 11
Nachricht kommt auch beim Slave an, aber keine Werte beim Master.

Also nichts anders als Vorher.

Ja Werte sind dezimal.

von Markus (Gast)


Lesenswert?

Belgacom schrieb:
> Markus schrieb:
>
> Also bei mir hat der CAN auch nicht funktioniert, als ich ihn
> initialisiert und die Transmit oder die Receive Funktion genutzt habe.
> Aber drauf geschissen. Ich habe dann die Transmit und die Receive
> Funktion selbst geschrieben, indem ich die Handvoll bits selber gesetzt
> bzw. geschoben habe.
>
> Du bist nicht nur ein ganz toller Bursche, sondern hast zudem noch eine
> gewählte Ausdrucksweise.

Belgacom schrieb:
> Markus schrieb:
>
> Also bei mir hat der CAN auch nicht funktioniert, als ich ihn
> initialisiert und die Transmit oder die Receive Funktion genutzt habe.
> Aber drauf geschissen. Ich habe dann die Transmit und die Receive
> Funktion selbst geschrieben, indem ich die Handvoll bits selber gesetzt
> bzw. geschoben habe.
>
> Du bist nicht nur ein ganz toller Bursche, sondern hast zudem noch eine
> gewählte Ausdrucksweise.

Solange ich keinen damit beleidige ist es ja ok. Ausserdem ist das ein 
Zeichen dafür, dass der CAN von ST wirklich so beschissen ist. Der 
Fehler besteht ja schon seit 2016 oder noch länger.
Das ist eine Tatsache und hat nichts mit den Leuten hier zu tun.

von Dr. Sommer (Gast)


Lesenswert?

Markus schrieb:
> Ausserdem ist das ein
> Zeichen dafür, dass der CAN von ST wirklich so beschissen ist. Der
> Fehler besteht ja schon seit 2016 oder noch länger.

Es ist nur ein Fehler in der Bibliothek. Die ist bekanntermaßen mies. 
Der CAN-Controller selbst ist ok und vermutlich überhaupt nicht von ST 
selbst sondern von Bosch oder so zugekauft.

von C.F. (Gast)


Lesenswert?

Junge Junge

CAN verstehen bevor man von BUGs redet ...

Wenn ein CAN-Teilnehmer eine Nachricht sendet (es gibt wie schon erwähnt 
kein Master oder Slave) und niemand diese Quittiert (ACK) macht der CAN 
Controller je nach einstellung lustiges Zeug auf dem BUS (alles nach 
Standart ...) zB. Präambel schicken und Retransmisions usw ...

Also schön Brav die HAL Callbacks verwenden (auch die des Errors !!!!) 
und den CAN Controller richtig (so wie gewollt) einstellen.

Dann funzt das wunderbar...

und nochmals: die haben keinen BUG !!!

von temp (Gast)


Lesenswert?

Markus schrieb:
> Ausserdem ist das ein
> Zeichen dafür, dass der CAN von ST wirklich so beschissen ist. Der
> Fehler besteht ja schon seit 2016 oder noch länger.

Nein du bzw. dein Programm ist kaputt. Meinetwegen zusätzlich auch die 
HAL. Alles was es zu wissen gibt steht im Ref. Manual und im Errata. 
Wenn man sich daran hält geht es auch. Ich erdreiste mich sogar zu der 
Aussage: Wenn du nicht in der Lage bist die paar Register nach Manual zu 
verstehen und richtig zu bedienen solltest du entweder dazulernen oder 
dir ein anderes Hobby suchen.
Man kann sich die HAL Problematik auch mal anders vorstellen. Was ich 
von ST kaufe ist der Controller und weiter nichts. Dazu gibt es eine 
Dokumentation in der alles steht was ich wissen muss. Wenn ST 
zusätzliche Libs oder Democode oder was auch immer auf seinen Web-Seiten 
anbietet, ist das eine freiwillige Leistung die du nicht gekauft hast. 
Damit gibt es auch kein Recht auf Vollständigkeit oder Fehlerfreiheit. 
Noch weniger auf Langzeitverfügbarkeit und Updates oder Kompatibilität 
mit zukünftigen Controllern. Deshalb ist an dieser Stelle wirklich 
weniger mehr.

Alternativ kannst du deine Fragen in den Arduino-Foren stellen, da 
triffst du Gleichgesinnte.

von Markus (Gast)


Lesenswert?

temp schrieb:
> Markus schrieb:
> Ausserdem ist das ein
> Zeichen dafür, dass der CAN von ST wirklich so
> oder Fehlerfreiheit. Noch weniger auf Langzeitverfügbarkeit und Updates
> oder Kompatibilität mit zukünftigen Controllern. Deshalb ist an dieser
> Stelle wirklich weniger mehr.
>
> Alternativ kannst du deine Fragen in den Arduino-Foren stellen, da
> triffst du Gleichgesinnte.

Da fühlt sich aber einer angegriffen. Arbeitest du bei ST :)

von Steffen R. (steffen_rose)


Lesenswert?

Sven S. schrieb:
> Heinz M. schrieb:
>
>>
>> Wird eine Nachricht geschickt, wenn das Kabel abgezogen ist, hängt sich
>> der Canbus des Senders auf. Alles andere funktioniert weiter.
>>
>
> Das ist ja auch kein Wunder, denn da gibt es auf dem CAN-Layer
> Protokolle, die nur funktionieren, wenn mindestens 2 Teilnehmer am Bus
> sind. Ansonsten laufen dir die Errorcounter hoch und dann gibt es einen
> BusOff, weil das ACK fehlt. Das hängt sich nicht auf, das ist per Design
> so gewollt.

Sofern der Knoten seine eigene Nachricht korrekt zurücklesen kann 
(Abschlusswiderstand) geht der Knoten nur in Error Passive 
(Sonderregel).
Dies erkennt man an der dauerhaften Sendewiederholung.

Diese hört auf, sobald ein zweiter Knoten die Nachricht bestätigt.

Oben die Erwähnungd es Abschlusswiderstandes, da sich das 
Hochlaufverhalten von dem des Trennen des Netzes unterscheidet.

von temp (Gast)


Lesenswert?

Markus schrieb:
> Da fühlt sich aber einer angegriffen. Arbeitest du bei ST :)

Ne, wie kommst du auf diesen Zusammenhang? Ich hasse sie eigentlich ehr 
dafür, dass ST jedem Anfänger die HAL förmlich aufzwingen. Und wenn sie 
das so richtig verinnerlicht haben fällt der Umstieg auf einen anderen 
Controller doppelt schwer, was natürlich beabsichtigt ist.
Ich jammere eigentlich nur über das ständige Jammern bei Problemen mit 
der HAL. Was zum großen Teil aber daran liegt, dass viele das Ref-Manual 
nicht mal ansatzweise lesen sondern nur die Beispiele kopieren. Und dann 
kommen Threads wie dieser dabei raus.

von Markus (Gast)


Lesenswert?

temp schrieb:
> Markus schrieb:
> Da fühlt sich aber einer angegriffen. Arbeitest du bei ST :)
>
> Was zum großen Teil aber daran liegt, dass viele das Ref-Manual
> nicht mal ansatzweise lesen sondern nur die Beispiele kopieren. Und dann
> kommen Threads wie dieser dabei raus.

Das stimmt, da gebe ich dir Recht, aber vielmals tut es aber auch nicht, 
auch wenn man das Reference Manual liest. Zum Beispiel ist mir 
aufgefallen, dass ich anfangs trotz des Lesens vieles übersehen oder 
vergessen habe die richtigen Bits zu setzen. Zb bei den Timern das MOE 
Bit welches bei advanced irgendwie gesetzt werden muss, bei anderen 
wiederum nicht etc. Da blickt man anfangs nicht so durch und es fehlt 
einem einfach an Erfahrung herauszufinden, woran es liegen könnte, auch 
wenn es dem einen oder anderen damit vertrauten leicht erscheint. Nach 
einer gewissen Zeit wird man aber doch vertrauter mit der Materie und 
kann etwa einschätzen, was es sein könnte und kann viele Probleme schon 
messen oder debuggen.
Aber einfach wie der TO zu sagen, dass er an den Registern nicht herum 
hanzieren möchte, finde ich dann doch ein wenig bequem. Darum geht es ja 
letztendlich auch.

Ich habe den CAN zB anders zum Laufen gebracht, als wie weiter oben 
erwähnt mittels der Callback Funktionen. Nur weil ich es anders gemacht 
habe und nicht die Callback Funktionen genutzt habe, heisst es ja nicht, 
dass ich das Manual nicht verstanden habe. Deshalb möchte ich dir nur zu 
Herzen legen, dass du beim nächsten Mal vielleicht deine Vorschläge ein 
wenig diskreter anzubringen versucht. Ich bin offen für Vorschläge aber 
deinen letzten Satz habe ich nicht so als freundlich empfunden.

von Heinz M. (subi)


Lesenswert?

Nur so als Hinweis: Markus ist nicht der Threadsteller.

Weiterhin, damit hier keiner aneinander vorbei redet:
Master Slave bezieht sich wie bereits erwähnt auf meine Anwendung und 
nicht auf den Bus. Der Master hat ein Display und Bedienelemente. Die 
Slaves Sensoren oder Aktoren.

Mir ist völlig bewusst, dass mein Programm verbuggt ist. Habe auch nie 
das Gegenteil behauptet.

Cube MX, HAL oder was auch immer hat Bugs, das ist bekannt. Trotzdem 
muss ich sagen, dass UART, I2C und einige andere Sachen super schnell 
funktioniert haben. Canbus und USB leider nicht. Deswegen programmiere 
ich aber nicht sämtliche ST Bibliotheken neu.


Zurück zum Problem.
Wenn beide so konfiguriert sind, dass der Master zyklisch ein Signal 
sendet, woraufhin der Slave einen Wert zurücksendet, dann kann ich nach 
der Leitungsunterbrechung zwar an den Slave eine Nachricht schicken, 
aber beim Master kommt nichts an. Master hat Fehlercode 51, Slave 0.

Wenn der Slave dauerhaft sendet und der Master ab und zu, dann geht der 
Fehlercode auf beiden hoch. Beide versuchen zu senden, was man der 
niedrigeren Bildwiederholrate der Displays merkt. Sobald ich das Kabel 
wieder einstecke geht der Fehlercode bei beiden auf 0, die 
Bildwiederholrate ist wieder flott, aber trotzdem werden keine 
Nachrichten gesendet oder empfangen (kann ich ohne Oszi nicht sagen).

Oder brauche ich einen dritten CAN Knoten, der die beiden wieder auf die 
Beine bringt?
Wenn ja, würde das bedeuten es müssen mindestens 2 Knoten an einem 
Teilabschnitt des Busses ohne Fehler aktiv bleiben, damit der Bus wieder 
"hochgefahren" werden kann. Oder verstehe ich da was falsch?

von Heinz M. (subi)


Lesenswert?

Nachtrag zu Markus:

Ich habe kein Problem mit Registern. Nur wenn ST mir ein Tool liefert um 
diese schier endlosen Register zu umgehen, dann möchte ich das auch 
nutzen. Einfache Peripherie (z.B. I2C Temperatursensoren) habe ich kein 
Problem mit den Registern.

Was ich sehr ungern mache und beim STM32 nicht machen werde, ist auf 
Verdacht in Registern rumzuspielen. Entweder man weiß genau was man da 
tut oder man weiß es nicht. Und ich weiß es nicht. Wie du schon 
geschrieben hast ist das Reference Manual ein harter Brocken, wenn man 
kaum Erfahrung mit der Materie hat.

von Dr. Sommer (Gast)


Lesenswert?

Heinz M. schrieb:
> Oder brauche ich einen dritten CAN Knoten, der die beiden wieder auf die
> Beine bringt?

Nein.

Heinz M. schrieb:
> kann ich ohne Oszi nicht sagen).

Dann besorg dir eins von den billigen LA's.

Heinz M. schrieb:
> dass UART, I2C und einige andere Sachen super schnell funktioniert
> haben.

I2C ist deutlich lästiger als CAN bei den STM32. Bei CAN macht die 
Hardware alles automatisch, bei I2C muss man jedes Schrittchen steuern. 
Und im Gegensatz zur CAN-Hardware ist die I2C-Hardware verbuggt und 
hängt sich ständig auf.

Heinz M. schrieb:
> diese schier endlosen Register zu umgehen
Bei CAN sind das nur eine Hand voll. Die Filter-und Mailbox Register 
sind einfach nur viele mit der gleichen Funktion, die muss man nur 1x 
verstehen.

Heinz M. schrieb:
> Wie du schon geschrieben hast ist das Reference Manual ein harter
> Brocken, wenn man kaum Erfahrung mit der Materie hat.

Versuch's doch einfach mal... die Zeit die du hier mit Schreiben 
verbracht hast hätte locker gereicht für das CAN-Kapitel.

von Heinz M. (subi)


Lesenswert?

Bei Gelegenheit werde ich mich mal ransetzen. 2 aktuelle Projekte die 
ich damit vorhabe, ist es nicht so schlimm, wenn man Reset drücken muss.

Bevor ich ein Projekt mache, wo es drauf ankommt, werde ich es mit den 
Registern versuchen. Edit: Und bis dahin mehr Erfahrung mit den STM32 
Registern habe.

Danke bis hierhin.

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.