Problem mit CAN auf STM32

Ich möchte zwei STM32 über CAN-Bus kommunizieren lassen. Einer als Sender und der andere als Empfänger. Dazu habe ich jeweils einen MCP2551 Transceiver kombiniert. Solange der CAN-Betriebsmodus auf LOOPBACK eingestellt war, schien alles in Ordnung zu sein: Die Controller konnten CAN-Nachrichten senden, empfangen (ihre eigenen) und per UART an meinen PC senden (funktionierte gut). Als nächsten Schritt wollte ich sie miteinander kommunizieren lassen. Ich habe den Betriebsmodus von ihnen auf NORMAL eingestellt. Während der Sender dieselben Nachrichten wie im Loopback-Modus sendete und der Empfänger nichts sendete (nur darauf wartete, dass Nachrichten eintrafen), passierte nichts. Eine Messung zeigte konstante 2,5V am Ausgang des Transceivers (Recessive State), und konstante 3,3V am STM32 TX (PA12). Jemand eine Idee was ich falsch mache?

Antworten (2)

Einer als Sender und der andere als Empfänger

So geht das nicht. CAN ist ein Peer-to-Peer-Netzwerk. Jeder Knoten kann jederzeit eine Nachricht senden, und alle anderen Knoten im Netzwerk empfangen die Nachricht.

konstant 3,3V am STM32 TX

Das ist eindeutig ein Firmware-Bug. Das Signal gelangt nicht zum CAN-Bus-Transceiver-Chip, geschweige denn zum CAN-Bus selbst.

Dinge, die Sie beachten sollten:

  1. Die CAN-Leitungen müssen um ca. 60 Ω zusammengezogen werden. Das sollten 120 Ω an jedem Ende des Busses sein. Wenn der Bus wirklich kurz ist, wie ein paar Zentimeter auf einer einzelnen Leiterplatte, dann kann ein einzelner 60-Ω-Widerstand akzeptabel sein.

    Bei einem echten Bus schließt dies die Leitung ab, um Reflexionen zu vermeiden. Dieser "Abschluss" ist jedoch auch dann noch erforderlich, wenn das gesamte System in einen Topf geworfen wird. Der Widerstand fungiert als Zusammenzieher, um den Bus im rezessiven Zustand zu halten, wenn er nicht explizit in den dominanten Zustand gefahren wird. Diese Terminierung ist nicht optional, auch wenn sie nichts mit der Terminierung der Übertragungsleitung zu tun hat.

  2. Sie benötigen mindestens zwei funktionierende Knoten, um einen funktionierenden CAN-Bus zu haben. Dies liegt daran, dass der Sender einer Nachricht erwartet, dass das ACK-Bit bestätigt wird. Wenn sich nur der Sender auf dem Bus befindet, wird nichts ACK bestätigen, und der Sender wird denken, dass die Nachricht beschädigt wurde, und sie erneut senden. Aber siehe Punkt 3.

  3. Der CAN-Standard versucht zu verhindern, dass defekte Knoten den gesamten Bus lahmlegen. Wenn ein Knoten zu viele Fehlerbedingungen sieht, wird er für eine Weile heruntergefahren. Wenn Sie nur einen Knoten haben, der niemals ACK sieht, kann ein Teil dieser Fehlerlogik nach einer Weile ausgelöst werden. Ich kann mich nicht aus dem Kopf erinnern, welche Bedingungen zu welcher Deaktivierungsstufe führen, aber wenn kein voller Bus vorhanden ist, kann dies dazu führen, dass sich der einzelne Knoten zumindest etwas deaktiviert.

Da Sie erwähnt haben, dass Sie ein konstantes 3V3 auf Ihrem TX sehen können, schlage ich vor, Ihr Programm erneut zu überprüfen. Ich vermute ein Einfrieren des Programms nach dem Start.

Ich gehe davon aus, dass Ihre Systemverbindungen korrekt hergestellt wurden und der Transceiver noch funktioniert.