Forum: FPGA, VHDL & Co. Hilfe mein MCP2515 spinnt


von Tomi T. (Firma: xxx) (kaptainchaos)


Lesenswert?

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.

von Klaus Falser (Gast)


Lesenswert?

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.

von Tomi T. (Firma: xxx) (kaptainchaos)


Lesenswert?

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
Noch kein Account? Hier anmelden.