Moin, ich kämpfe schon seit geraumer Zeit mit meinem CAN-BUS Controller MCP2515. Mein System besteht aus einem FPGA von Xilinx, an dem ich den MCP2515 angeschlossen habe. In meinem FPGA habe ich ein System mit einem MicroBlaze und etlichen IP-Cores implementiert. Die Kommunikation zum MCP2515 erfolgt über einen eigenen SPI-IP-Core (Übertragungsrate 3,75MHz, der Interrupt vom MCP2515 wird vom I/O-Core (xps_gpio) erfasst. Die Kommunikation auf dem CAN-Bus erfolgt mit 1MHz, wobei der CAN-IC in schneller Folge mit Nachrichten bombardiert wird. Beim Empfang von Nachrichten kommt es vor, dass der MCP2515 seinen Interrupt sporadisch nicht zurück setzt. Es ist dabei kein System zu erkennen, wann und warum dieser nicht zurück gesetzt wird. Meine Software ist so aufgebaut, dass der CAN-Interrupt von der I/O-Interrupt Routine abgefragt wird. Wird der CAN Interrupt erkannt, so wird in der Interrupt Routine die CAN-Empfangsregister mit dem „Read RX Buffer Instruction“ ausgelesen. Dieser Befehl setzt den Interrupt des CAN-Controllers automatisch zurück. Ich habe auch schon versucht das Auslesen aus der Interrupt-Routine zu nehmen und über eine Interrupt gesteuerte SPI-Routine zu beheben, leider ohne Erfolg. Um dem Fehler auf die Spur zu kommen habe ich zusätzlich alle Fehler-Interrupts eingeschaltet und frage diese auch ab. Leider wird kein Fehler vom MCP2515 gemeldet. Als Ausgangssystem für die CAN-Nachrichten verwende ich einen PC mit einer CAN-Karte. Auf der Karte ist der Abschlusswiderstand gesetzt, sowie am Kabelende, welches zum FPGA führt. Zusätzlich verwende ich ein verdrilltes und geschirmtes Kabel. In der UCF.Datei habe ich am I/O-Pin für den Interrupt einen PULLUP-Widerstand im FPGA gesetzt, um das Signal zu stabilisieren. Um dieses Problem vorerst zu lösen, frage ich den I/O-Eingang mit dem Interrupt-Signal in der Main ab. Ist dieser auf LOW so führe ich einen Hardwarereset des MCP2515 durch. Dies führt zwar dazu, dass mein System nicht mehr hängen bleibt, aber das ist für mich nur eine Notlösung, da ich das eigentliche Problem nicht behoben habe. Leider hatte auch keine meiner Kollegen eine Antwort. Auch habe ich schon alle Ratschläge zu diesem Thema aus dem Netz befolgt, leider ohne positives Ergebnis. Ich hoffe einer von Euch hat einen Tipp. Schon einmal einen schönen Dank im Vorraus.
Kenne mich nicht aus, habe das Datenblatt nur kurz überflogen. Aber warum liest Du nicht das CANSTAT Register aus? Das sagt Dir doch, warum die Interrupt Leitung aktiv ist.
Hallo Klaus, danke für deine Antwort. Das CANSTAT Register lese ich nicht aus, dafür aber das CANINTF Register, in dem alle Interrupts gesetzt werden die auftreten. In meiner Interrupt Routine wird auch der Fall abgefangen wenn beide Empfangsbuffer voll sind. Des weiteren berücksichtige ich das ERRIE bit, worauf ich das EFLG Register auslesen. Dieses bit wird aber nicht vom MCP2515 gesetzt, obwohl ich es im CANINTE eingeschaltet habe. Der von mir beschriebende Fehler tritt nur sehr unregelmäßig auf.
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.