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?
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:
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.
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.