Forum: Mikrocontroller und Digitale Elektronik CAN-Bus: MCP2515 und MCP2551 mit Linux Treiber


von Wurststulle (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Hat hier jemand Erfahrung mit der Ansteuerung des Can-Busses unter 
Linux?

Ich habe die Schaltung im Anhang an einem Linux-Entwicklungsboard. Wenn 
ich die CAN-Eingangssignale mit einem Oszilloskop anschaue sieht alles 
gut aus.

Beim Booten des Boards wird vom Treiber geprüft, ob ein MCP2515 am 
SPI-Bus erkannt wird. Ist erfolgreich.

Dann konfiguriere ich das das can0 Netzwerk:
ip link set can0 type can bitrate 500000

Sobald ich es starte (ifconfig can0 up), sehe ich kurz SPI-Kommunikation 
zwischen Prozessor und MCP2515, während der Chip scheinbar resettet und 
konfiguriert wird, danach überhaupt keine Kommunikation mehr, weder SPI- 
noch CAN-Signale. Nirgends. Ich kann nichts nichts empfangen und sehe 
mit dem Oszilloskop nirgendwo Buskommunikation. Obwohl ein CAN-Signal 
anliegt, ist nicht einmal mehr das zu sehen. Sobald ich "ifconfig can0 
down" ausführe, ist wieder Kommunikation sichtbar. Aber ich kann eben 
can0 nicht verwenden...

Was kann da schief laufen? Fehler in der Schaltung? Treiberproblem (der 
ist im Linuxkernel integriert...). Ich bin ziemlich ratlos und hoffe ihr 
habt eine Idee, was da schief laufen könnte?

Danke :)

PS. Die Spannungsversorgung ist 5V, nicht wie oben behauptet 3.3V.

von Test (Gast)


Lesenswert?

Oh, dafür gibt es Treiber, super und danke für den Hinweis.

Google spuckte diese Seite aus, vieleicht hilft die weiter: 
http://lnxpps.de/rpie/

von H.Joachim S. (crazyhorse)


Lesenswert?

Tx und Rx sind falsch verdrahtet.

von Wurststulle (Gast)


Lesenswert?

>>Tx und Rx sind falsch verdrahtet.

Nö!

von H.Joachim S. (crazyhorse)


Lesenswert?

Dann weiss ich auch nicht weiter.
Ich schliesse meine CAN-Transceiver immer genau anders herum an - und 
die funktionieren. Diese Anschlussweise ist also falsch, obwohl sie 
funktioniert. Deine funktioniert nicht, ist aber richtig. Nagut.

Ok, vielleicht ist der MCP2551 anders, ich nehme immer 82C250 oder 251.

von H.Joachim S. (crazyhorse)


Lesenswert?

Test schrieb:
> Oh, dafür gibt es Treiber, super und danke für den Hinweis.
>
> Google spuckte diese Seite aus, vieleicht hilft die weiter:
> http://lnxpps.de/rpie/

Vorsicht.
Der Schaltplan ist auch falsch :-)
Dank Wurststulle endlich aufgeklärt!

von Wurststulle (Gast)


Lesenswert?

Hää?! Ich lass mich gerne eines besseren belehren. Die Schaltung oben 
und das Datenblatt geben aber mir recht. TX ist mit TX, RX mit RX 
verbunden.

Datenblatt:

MCP2515 RX: Receive input pin from CAN bus
MCP2551 RX: is usually connected to the receiver data input of the CAN 
controller device

von H.Joachim S. (crazyhorse)


Lesenswert?

Tx mit Tx und Rx mit Rx is ja auch korrekt.
Allerdings liegt Tx vom 2515 auf Pin1, Rx auf Pin2.
Das ist das eben der Preis, den man für die dämliche Darstellungsweise 
als DIL-IC zahlt und Leitungen nach Belieben anschliessen und benennen 
kann.

von Wurststulle (Gast)


Lesenswert?

Ok, wir sind uns einig - TX ist mit TX und RX mit RX verdrahtet. Daran 
liegts also nicht. Danke für den Hinweis mit der Skizze.

von H.Joachim S. (crazyhorse)


Lesenswert?

Hast du es in echt korrekt verdrahtet (1->1 und 2->4) oder wie in deiner 
Skizze (1->4 und 2->1)? D.h. nur der Schaltplan war falsch?

von Wurststulle (Gast)


Lesenswert?

Nur der Schaltplan war falsch, korrekt verdrahtet. Sorry.

von Wurststulle (Gast)


Angehängte Dateien:

Lesenswert?

Hier der geänderte Schaltplan, das Problem besteht immer noch... Andere 
Ideen wie es zu diesem Problem kommen kann?

von Andreas K. (hammerhead)


Lesenswert?

Wenn da nix mehr tut, wenn du can0 auf enable setzst, dann prüfe mal die 
CS-Leitung, nicht dass die active LOW ist und du sie beim "can0 up" auf 
high ziehst.
Dann reagiert dein CAN-Controller nämlich nicht mehr auf SPI, weil der 
ja nicht weiß, dass der ARM mit ihm sprechen will.

von Wurststulle (Gast)


Lesenswert?

Danke für die Anregung, die CS Leitung ist Active Low und wird vom 
Treiber auch so gehandhabt.

Interessant finde ich, dass nach can0 up das von außen eingehende 
CAN-Signal irgendwie kaputt geht, jedenfalls nicht mehr messbar ist...
nach ifconfig can0 down ist es wieder sichtbar...
Finde ich ziemlich schräg...

von Andreas K. (hammerhead)


Lesenswert?

Prüf mal, ob du nicht wo nen Kurzschluss hast, der deine CAN-leitungen 
runter/hochzieht.
Weil alles, was du über den Treiber machst, beeinflusst ja nur den 
Controller (den 2515) aber nicht den Transceiver (2551), der kriegt ja 
nur RX/TX vom Controller und das wars, d.h. er läuft eigentlich immer.

Übrigens ganz nebenbei: was hast da für nen quarz drauf für den 2515?

von Wurststulle (Gast)


Lesenswert?

10 Mhz Quarz. Mehr Details zu dem Bauteil hab ich leider nicht.

Eigentlich hab ich alles nach Kurzschluss abgesucht, dachte ich.

Ich sehe das exakt so, wie du das oben beschrieben hast und bin deshalb 
sehr verwundert, dass sich auch das Signal am 2551 ändert, obwohl nach 
der Initialisierung beim Starten von can0 überhaupt keine Kommunination 
stattfindet.
Wo könnte da denn ein Kurzschluss sein? (Obwohl ich bisher partout 
keinen finden kann...)
Ich bin völlig ratlos...

von Gero (Gast)


Lesenswert?

Der MCP2551 ist nicht mit 3.3V lauffähig, siehe Datenblatt.
Für 3.3V muss ein anderer Transceiver drann...

von Wurststulle (Gast)


Lesenswert?

Danke, sind 5 V dran, siehe unterer Schaltplan.

von Andreas K. (hammerhead)


Lesenswert?

Nya, viele details bei Quarzen gibts ja nicht, Frequenz, Package und 
Benötigte Kapazität, wobei nur das erste wirklich relevant ist.
Teilst du dem 2515 irgendwie gesagt, welche Frequenz er nutzen soll? Wie 
schnell läuft dein ARM?
(Bin gerade dabei, was mit CAN zu bauen, drum hats sich angeboten, dich 
da ein wenig auszufragen :P )


Also, der 2551 ist ja ein "dummer" wandler von TX/RX auf Differentiell, 
d.h. der kriegt keine Kommandos vom 2515, die ihm sagen, was er tun 
soll.
der 2515 hat unmengen an outputs, dafür als input (vom ARM) nur das SPI 
mit !CS, !RS und noch die !TXRTS. Letztere sind aber eher irrelevant.

D.h. wenn du can0 up setzst, zieht dein ARM theoretisch !CS auf Low (is 
active-low) und !RS ist permanent auf high durch Pullup (Auch 
active-low).
Nichts von dem Dürfte den 2551 beeinflussen.

Wenn dein can0 auf up ist, wird das CAN-Signal auf der CAN-Leitung nicht 
mehr messbar.
D.h. deine Leitungen werden entweder gegen Low gezogen, was auch Sinn 
ergeben würde, denn CANH zieht eine 1 hoch (positive Spannung) und CANL 
zieht sie runter (negative Spannung), falls ich das hier korrekt deute: 
http://www.pc-oscilloscopes.com/images/canbus_waveform_1.jpg

Alternativ kann es auch sein, dass dein Sender aus welchem Grund auch 
immer aufhört zu senden, sobald du can0 auf up stellst.

von MiWi (Gast)


Lesenswert?

Wurststulle schrieb:
> Hier der geänderte Schaltplan, das Problem besteht immer noch... Andere
> Ideen wie es zu diesem Problem kommen kann?

Ich würd den Reset nicht so anschließen sondern vom Linux aus steuern. 
So wie im Schaltplan angezeigt sieht der MCP nie einen Reset, weil der 
dann schon high ist wenn die Versorgung im IC auch erste Schritte 
erlaubt....

Siehe auch den ausdrücklichen Hinweis dazu im Datenblatt vom MCP2515

Und ich traue inzwischen keinem Chiphersteller mehr wenn er schreibt, 
daß ein SPI-Reset ident mit einem Hardwarereset ist. BTDT und nie 
wieder...

Die - bis auf den Reset - identische Schaltung zw. Linux und MCP2515 tut 
seit 6 Jahren (mit 4MHz Quarz) hier in Stückzahlen ihren vollkommen 
problemlosen Dienst.

Grüße

MiWi

von Wurststulle (Gast)


Lesenswert?

Die Frequenz des Quartz' ist eingestellt.

"ifconfig can0 up" ist die Operation, mit der das entsprechende Netzwerk 
auf dem Board aktiviert wird und wo die Initialisierung des MCP2515 vom 
Linux-Kernel angestoßen wird. Das hat an sich erstmal nichts mit dem 
Pegel der CAN-Leitung zu tun. War vll blöd formuliert.

von Wurststulle (Gast)


Lesenswert?

@MiWi: Danke, probier ich mal.

von MiWi (Gast)


Lesenswert?

Wurststulle schrieb:
> Was kann da schief laufen? Fehler in der Schaltung? Treiberproblem (der
> ist im Linuxkernel integriert...). Ich bin ziemlich ratlos und hoffe ihr
> habt eine Idee, was da schief laufen könnte?

Ah ja, einen hab ich noch:

IIRC muß das Linux bzw der Treiber auch den richtigen Interrupt wissen, 
weil sonst kommt einer, Linux sieht den nicht und das war es dann.

Daher die Frage: am Linux den richtigen Interrupt angeschlossen? Der 
Treiber macht meiner Erinnerung nach keine vollständige Suche nach dem 
richtigen Interrupt und /CS (aber das war 2006...) und... schweigen im 
Wald, nix geht mehr

Grüße

MiWi

von Wurststulle (Gast)


Lesenswert?

Das mit dem Interrupt hab ich überprüft, hab dem Treiber die richtige 
Interruptleitung mitgegeben. Kommt allerdings nie einer vom 2515 an. 
Weder bei cat /proc/interrupts (immer 0) noch mit dem Oszilloskop 
sichtbar.

Wie machst du das mit dem Reset? Vor dem Starten des Treibers Pin für 
Reset einmal kurz auf low und dann wieder high? Oder hast du was am 
Treiber rumgebaut?

von Mountain (Gast)


Lesenswert?

Hallo Wurststulle,

kannst Du die Ausgabe von:

dmesg | egrep -i "can|mcp" ; ifconfig -a ; ip -s -d link show can0 ; cat 
/proc/interrupts

posten und die Boarddefinititionsdatei anhängen ? Hast Du CAN Debug
aktiviert ?

Gruß Mountain

von MiWi (Gast)


Lesenswert?

Wurststulle schrieb:
> Wie machst du das mit dem Reset? Vor dem Starten des Treibers Pin für
> Reset einmal kurz auf low und dann wieder high? Oder hast du was am
> Treiber rumgebaut?

Keine Ahnung über die Details, das hat alles mein Programmierer gemacht.

Aber im Grunde sieht es so aus: Wenn das Linux bootet hat wird 
irgendwann der gesamte IO-Bereich (LCD-Controller, CAN, LAN.. und was 
weiß ich noch alles) resetiert und dann erneut initialisiert. Die 
Hardware für`s Linux ist so gekapselt, daß da nur ein eine rabiate 
Störung (Stromausfall) was außer Tritt bringen kann (also keine direkte 
Leitung nach draußen). Die Schnittstellen (CAN, LCD, Tastatur, LAN etc) 
können aber aus welchen Gründen auch immer einmal zickig sein. Dürfen 
sie auch, denn dann bekommen sie einen Tritt mit dem IO-Reset und alles 
ist wieder gut. Oder auch nicht, aber selbst dann ist das Linux Herr der 
Lage und kann kontrolliert damit umgehen.

iaW: das Linux läuft problemlos mehrere Jahre durch, je nach Umgebung 
wird die Peripherie in dieser Zeit jedoch öfteres resetiert ohne das es 
dadurch zu einem Systemausfall kommt. Sehr praktisch das alles.

Grüße

MiWi

von Wurststulle (Gast)


Angehängte Dateien:

Lesenswert?

CAN-Debug ist in den Kernel eincompiliert.

Genaue Ausgaben kann ich erst nächste Woche liefern, aus der Erinnerung:

dmesg:
CAN started.
mcp251x probed.

ifconfig zeigt nach "ifconfig can0 up" can0 an
Darauf kommt bei dmesg noch eine Ausgabe CANSTAT und zwei Hex-Werte.

cat /proc/interrupts zeigt
...
mcp2515:     0
...

Boarddatei ist im Anhang.

Danke.

von Mountain (Gast)


Lesenswert?

Hallo Wurststulle,

eine weitere Sache ist mir noch in Deinem Schaltplan aufgefallen:
Der Interrupt ist "activ low" - ich vermisse den PullUp Widerstan am 
INT.

Für die Initialisierung des MCP2515 (Softreset und Parameterisierung)
wird der Interrupt nicht benötigt. Das mcp251x Modul initialisiert
den CAN Controller so, das der INT bei ankommenden Paketen bzw.
Fehlersituationen ausgelöst wird

Ich würde folgende Tests vorschlagen um den Fehler einzukreisen:
- den MCP2515 in Loopbackmodus versetzen:
# ifconfig can0 down
# ip link set can0 type can up bitrate 125000 loopback on
# candump -e any,0:0,#FFFFFFFF
# # neue SSH Session
# cansend can0 123#deadbeef
Schauen ob etwas passiert - ggf. kann das Board dabei abstürzen,
sofern die Interrupt-Behandlung nicht korrekt ist.

Als zweiten Test würde ich analog zu http://lnxpps.de/rpie/
den GPIO Test durchführen.

Gruß Mountain

von Wurststulle (Gast)


Lesenswert?

Vielen Dank! Werde ich testen!

von MiWi (Gast)


Lesenswert?

Mountain schrieb:
> Hallo Wurststulle,
>
> eine weitere Sache ist mir noch in Deinem Schaltplan aufgefallen:
> Der Interrupt ist "activ low" - ich vermisse den PullUp Widerstan am
> INT.

Das ist ein Push/Pull Ausgang vom MCP2515 (Siehe Datenblatt bei High 
level Output Voltage), braucht daher keinen Pullup.

Grüße

MiWi

von Mountain (Gast)


Lesenswert?

MiWi schrieb:
> Das ist ein Push/Pull Ausgang vom MCP2515 (Siehe Datenblatt bei High
> level Output Voltage), braucht daher keinen Pullup.
>
> Grüße
>
> MiWi

Ich bin offensichtlich zu ungeübt im Datenblatt Lesen:

           Min       Max
Voh /INT  VDD-0.7V    -       Ioh  -1.0mA, Vdd 4.5V

Wie erkenne ich daraus, das kein PullUp benötigt wird ?

Gruß Mountain

von MiWi (Gast)


Lesenswert?

Mountain schrieb:
> MiWi schrieb:
>> Das ist ein Push/Pull Ausgang vom MCP2515 (Siehe Datenblatt bei High
>> level Output Voltage), braucht daher keinen Pullup.
>>
>> Grüße
>>
>> MiWi
>
> Ich bin offensichtlich zu ungeübt im Datenblatt Lesen:
>
>            Min       Max
> Voh /INT  VDD-0.7V    -       Ioh  -1.0mA, Vdd 4.5V
>
> Wie erkenne ich daraus, das kein PullUp benötigt wird ?
>
> Gruß Mountain

der Pin kann 1mA bei 3,8V (Vdd= 4,5V-0,7V) gemessener Spannung (V_OH)am 
Pin treiben. Und das geht nicht mit bei einem Opencollector. Der könnte 
nur Strom aufnehmen.

Abgesehen davon steht nirgends im Datenblatt, daß es ein OpenCollector 
oÄ ist. Und in den ANs um diesen Chip herum wirst Du auch nie einen 
Pullup auf der /INT finden.

Grüße

Miwi

von Mountain (Gast)


Lesenswert?

MiWi schrieb:
>> Ich bin offensichtlich zu ungeübt im Datenblatt Lesen:
>>
>>            Min       Max
>> Voh /INT  VDD-0.7V    -       Ioh  -1.0mA, Vdd 4.5V
>>
>> Wie erkenne ich daraus, das kein PullUp benötigt wird ?
>>
>> Gruß Mountain
>
> der Pin kann 1mA bei 3,8V (Vdd= 4,5V-0,7V) gemessener Spannung (V_OH)am
> Pin treiben. Und das geht nicht mit bei einem Opencollector. Der könnte
> nur Strom aufnehmen.
>
> Abgesehen davon steht nirgends im Datenblatt, daß es ein OpenCollector
> oÄ ist. Und in den ANs um diesen Chip herum wirst Du auch nie einen
> Pullup auf der /INT finden.
>
> Grüße
>
> Miwi

Ah - OK. Vielen Dank.

Gruß Mountain

von Karsandra (Gast)


Lesenswert?

Wurststulle schrieb:
> Hier der geänderte Schaltplan, das Problem besteht immer noch... Andere
> Ideen wie es zu diesem Problem kommen kann?

Hallo Wurststulle,

also beim CAN-Bus ist das mit RX und TX etwas anders. Der CAN-Kontoler 
ausgang TX muss mit dem Anschluß TX vom MCP2551 und RX vom 2515 mit RX 
vom 2551 verbunden sein.

Das Dominante BIt (low-Level) wird über RX zurückgelesen. Wenn Du es 
vertauschst, dann funktioniert das RÜcklesen der gesendeten Bits nicht 
und die Arbitrierung vom Physikalischen Bus kann protokollgemäß nicht 
durch geführt werden.

Es gibt dann einen Bit-Fehler. Nach 128 Sendeversuchen würde der 
Kontroler in den BUS-Passiv-Modus gehen.
Falls Dein Treiber die Fehlerquellen auslesen ermöglicht, dann schaue da 
mal nach. wen da Bitfehler steht, dann tausche die Leitungen.

von jeevanshree (Gast)


Lesenswert?

how to interface with other controller

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.