Hallo liebe Community,
ich kommuniziere zwischen 2 AVRs mittels CAN-Bus.
Dieser funktioniert auch insofern, da ich fehlerlos Nachrichten
verschicken kann.
Die Kabellänge dafür liegt bei ~10cm. Das ganze funktioniert allerdings
nur, solange die Jumper nicht gesetzt sind.
Übersehe ich irgendwo etwas grundlegendes, oder wo liegt mein Fehler?
Ja, dadurch bleibst du im common mode Bereich der CAN-Transceiver. Führe
die GND-Leitung mit (z.B. als Schirm des twisted-pair-Kabels).
Du kannst auch die Terminierung symmetrisch machen, bringt auch
Vorteile. Das heißt, von CANH einmal 60 Ohm gegen GND und von CANL
genauso. Gibt insgesamt auch 120 Ohm. Und die beiden Adern sind dann
symmetrisch gegen GND.
Eine andere Möglichkeit ist, den CAN-Bus galvanisch zu trennen. Ist
etwas mehr Aufwand, aber lohnt sich, wenn starke Störungen in der Nähe
sind. Und das geht dann auch ohne GND, also nur 2-adrig. Habe ich schon
paar hundert mal gemacht mit Leitungslängen bis knapp 200m. Datenrate
dann 125kB/s. Völlig problemlos.
Nachtrag: Zur Bustrennung schau dir mal den ADM3053 an. Der hat alles
drin, was du brauchst. Einschließlich der Erzeugung der
Sekundär-Betriebsspannung.
vielen Dank für die ausführliche Antwort!
Habe soeben die GND-Anschlüsse miteinander verbunden, jedoch
funktioniert die Kommunikation wieder nur, wenn die Jumper nicht gesetzt
sind.
Hat jemand eine andere Idee?
Dann sind es vielleicht keine 120Ohm-Widerstände? Wenn sie zu klein
sind, hast du einen Kurzschluß. Prüf nochmal alles durch, auch die
Verdrahtung.
Du hast auf jeden Fall einen anderen Fehler...
Wenn der Jumper nicht gesetzt ist, kann sich doch gar kein rezessiver
Pegel ausbilden. Was misst du zwischen CANL und CANH mit und ohne
Jumper?
Da mit Jumper sollten 60 Ohm sein.
Stimmt vieleicht im Layout ewas nicht? Seid wann sind Nets in Eagle
Blau?
> Seid wann sind Nets in Eagle Blau?
Das ist kein Net, sondern ein Bus. Das stimmt schon. Das heißt, wenn die
Anbindung am Bus stimmt, also die Nets, die aus dem Bus herausgezogen
sind. Das kann man aber ohne Beschriftung nicht sehen.
@Duzezan: Kontrolliere das mal, indem du "show" anklickst und dann CANH.
Dann muß CANH hell dargestellt werden und auch einer der
Jumper-Anschlüsse. Aber nur einer. Und dann das gleiche mit CANL, dann
muß der rechte Anschluß des Widerstandes hell gezeichnet werden.
@Martin H. (disjunction)
>Stimmt vieleicht im Layout ewas nicht? Seid wann sind Nets in Eagle>Blau?
Das ist ein Bus. Möglicherweise hat sich der OP damit einen Defekt in
die Schaltung geholt und der Jumper macht einen Kurzschluss.
Falk Brunner schrieb:> Das ist ein Bus. Möglicherweise hat sich der OP damit einen Defekt in> die Schaltung geholt und der Jumper macht einen Kurzschluss.
Man könnte ja mal den Widerstand mit und ohne Jumper zwischen CANH+CANL
messen.....
Otto schrieb:> Falk Brunner schrieb:>> Das ist ein Bus. Möglicherweise hat sich der OP damit einen Defekt in>> die Schaltung geholt und der Jumper macht einen Kurzschluss.>> Man könnte ja mal den Widerstand mit und ohne Jumper zwischen CANH+CANL> messen.....
Der Vorschlag kam ja weiter oben schon von Martin. Einfach mal den CAN
messen. Beide Jumper offen (von beiden Platinen), dann muß er relativ
hochohmig sein. Ein Jumper geschlossen -> 120 Ohm zwischen CANH und
CANL, beide geschlossen -> 60 Ohm zwischen CANH und CANL.
Hast du das mal gemacht, Duzezan?
Die Platine wird selbst gelötet. Falls also so kein Fehler im Layout
vorliegt, sollte dieses schon stimmen.
Gerade gemessen, die Meßwerte stimmen mit den Vermutungen von @ich
überein.
Beide Jumper offen: ~35k Ohm
1 Jumper offen: 118 Ohm
beide Jumper geschlossen: 58 Ohm
Und bei den Widerständen handelt es sich wirklich um 120 Ohm.
Schließ mal beide Jumper und dann miß bitte den CAN gegen GND und VCC,
ob da irgendwo ein Schluß ist. Kann auch sein, daß einer der 2551 einen
Ausgangsfehler hat.
Also:
Schaltungen stromlos machen, dann
CANH gegen +5V
CANH gegen GND
CANL gegen +5V
CANL gegen GND
Da darf nichts niederohmiges zu messen sein.
Danke @ich das du mitgelesen hast ;)
Mein Vorschlag noch vieleich bricht Vcc zusammen unter der Last von
120Ohm ;)
Vieleicht wird eine Schaltung nur duch CANH durch die Schutzdioden des
MCP2551 versorgt. Oder nur de mcp as würde für rezessive Pegel sorgen
also bei beiden Platinen liegen die gemessenen Werte alle über 20M Ohm,
sollte also eigentlich auch passen.
Wenn du sagst, ich soll gegen +5V messen, dann dort, wo unter Strom VCC
ist?
@Martin: - wie kann ich überprüfen, ob VCC zusammenbricht?
- Wie meinst du das mit der Schutzdiode des MCP 2551 bzw. mit
dem rezessiven Pegel?
Duzezan schrieb:> Wenn du sagst, ich soll gegen +5V messen, dann dort, wo unter Strom VCC> ist?
Ja, mit +5V meine ich VCC.
Wenn auch nur eine Ausgangsstufe der 2551 eine Schluß hat (gegen VCC
oder gegen GND), dann geht gar nichts mehr.
Was du auch messen kannst: Im eingeschalteten Zustand beide
CAN-Leitungen jeweils gegen VCC und gegen GND messen. So merkst du ja
auch, wenn eine der beiden Bus-Leitungen auf VCC oder GND liegt.
Duzezan schrieb:> @Martin: - wie kann ich überprüfen, ob VCC zusammenbricht?
Mir Fehlt U$2G$2 (VCC und GND) in der Schaltung vieleicht wird der MCP
in einer Schaltung nicht versorgt.
> - Wie meinst du das mit der Schutzdiode des MCP 2551 bzw. mit> dem rezessiven Pegel?
die meisten ICs besitzen Schutzdioden zwischen Eingängen und VCC um
einen gewissen ESD Schutz zu erreichen. Damit kann man den IC parasitär
mit Strom versorgen.
Rezessiver Pegel ist wenn CANH nicht gegen VCC und CANL nicht gegen GND
Treibt. In diesem Fall sollen die 60Ohm CANL gegen 2,5 und CANH gegen
2,5 treiben. Ohne die Widerstände bleiben die Pegel wie bei den
dominanten Pegel siehe oben. Ziehst Du aus CANH den Strom ab bekommst du
den rezessiven Pegel...theoretisch.
Der CAN Bus ist multimasterfähig in den rezessiven Pegel darf jeder
reinquatschen in den Dominanten macht das keinen Sinn.
Der Schaltplan ist nur ein Auszug. Die MCPs sind natürlich an
Stromversorgung angeschlossen (zur Kontrolle eine Widerstandsmessung
durchgeführt).
Habe eben die Spannung zwischen VCC, GND, CANH und CANL gemessen.
die Bus-Leitungen liegen nicht auf GND oder VCC, da sie bei ~2,5V
liegen.
Und die Widerstände sind auch im Bereich von mehreren Megaohm.
Verwendest Du eigentlich einen Zufallsgenerator zum Setzen der
Verbindungen, oder orientierst Du Dich am Luftdruck?
Keine Ahnung was Eagle mit Deiner Reset-Schaltung und deinem 16 MHz
Zappler macht.
Ich habe die komische Angewohnheit, bei Leitungen, die verbunden werden
sollen, einen Verbindungspunkt zu setzen. Dumme Angewohnheit - ich weiß.
Ich glaube nicht, daß es daran liegt. Wenn er die Jumper öffnet,
funktioniert es ja komischerweise. Also arbeitet der Prozessor auch
richtig, wie er soll...
Das mit den Punkten kommt manchmal vor. Das bedeutet nicht zwangsläufig,
daß dort keine Verbindung besteht. Aber du hast Recht, normalerweise
setzt man in so einem Fall die Junction dann manuell.
Stimmt. Wenn einer der beiden RS keine Masse hat, geht der 2551 in den
Standby.
Aber warum geht's, wenn die Abschlußwiderstände ausgeschaltet sind?
Irgendwie mysteriös das ganze...
ich schrieb:> Nee, ich frag mich selbst :-)
Also ich habe ja schon viele von CAN Komponenten geroutet aber so ein
Fehler ist mir noch nicht untergekommen. Ich hatte schon Haarrisse an
Pins, Verpolte Tantalkondensatoren die alle 2 Stunden den Transceiver
für 10s abgeschaltet haben und Vertauschte CANH und CANL aber
sowas.....
Ich hab auch schon eine Menge gesehen. Seit ein paar Jahren setze ich
den CAN allerdings nur noch galvanisch getrennt ein. Damit umgehe ich
auch alle Probleme, die mit einem falschen Potential zusammenhängen.
Früher (noch ohne Trennung) kam es vor, daß irgend ein Held die
Busleitungen auf eine Spannung gelegt hat (z.B. 48V) und dann sämtliche
Busteilnehmer in Rauch aufgegangen sind. Ich konnte dann sämtliche
Platinen wechseln. Da kam Freude auf...
Aber bei galvanischer Trennung kann es maximal passieren, daß die
Übertragung nicht funktioniert, wenn ein falsches Potential anliegt.
Aber es geht nichts mehr kaputt.
Aber das nur am Rande. Hier in dem Fall bin ich schon auf die Lösung
gespannt. Es ist bestimmt nur eine Kleinigkeit, aber aus der Ferne ist
es eben schwierig.
Heute abend wird es wohl eh nichts mehr. Ich mach mich dann erstmal raus
hier.
Man sieht sich!
@duzezan: Halt durch, du schaffst das! :-)
In diesem Stadium muß man alles versuchen, das stimmt.
Allerdings glaube ich nicht, daß das die Ursache ist. Ich habe mehrere
CAN-Teilnehmer auf benachbarten Platinen und die sind nur paar cm
auseinander. Die gleiche Konstellation läuft auch mit ca. 200m ohne
Änderung. Aber eine bessere Idee hab ich auch nicht mehr. Wir haben
gestern ja schon alles mögliche versucht...
René B. schrieb:> An deinem CAN fehlen die PullUp und PullDown für die rezessiven> Pegel> der Leitungen.> Verpass dem wenigsten mal 560Ohm an CANH und CANL.
Seit wann gibt es beim CAN Pullup und Pulldown?
Zwischen CANH und CANL wird der Bus mit 120Ohm terminiert. Und das
jeweils an beiden Enden des Busses. Die Teilnehmer zwischendrin haben
keinen Anschlußwiderstand (wenn es mehr als zwei Teilnehmer sind).
Auf keinen Fall gehört ein Pullup oder Pulldown da hin!
@ René B. (reneb)
>An deinem CAN fehlen die PullUp und PullDown für die rezessiven Pegel>der Leitungen.>Verpass dem wenigsten mal 560Ohm an CANH und CANL.
Nö. Wir sind hier nicht bei I2C oder RS485. Der differentielle
Widerstand reicht.
@Philipp: Ich verwende doch einen MCP 2551, also was sollte mir diese
AppNote nutzen?
Das Layout in Eagle habe ich übrigens ausgebessert ;-)
Leitungslänge war während der Messungen ein ~15m Telefonkabel, da dieses
auch am Ende verwendet werden sollte.
Oszilloskop befindet sich leider nicht in meinem Besitz..
Was mir noch eingefallen ist:
Könnte es daran liegen, dass die Busterminierung auf physikalischer
Ebene zwischen den MCPs liegt?
Duzezan schrieb:> Könnte es daran liegen, dass die Busterminierung auf physikalischer> Ebene zwischen den MCPs liegt?
Wie meinst du das?
Wenn du zwei Teilnehmer hast, dann hat jeder von den beiden einen 2551.
CANH des einen wird mit CANH des anderen verbunden und CANL genauso.
Dann kommt an alle beide jeweils ein Widerstand von 120 Ohm zwischen
CANH und CANL. Falls du mehrere Teilnehmer hast, bekommen die zwischen
drin sind, keine Terminierung. Nur jeweils am Bus-Anfang und -Ende.
Aber ich dachte, das habe ich auf deinem Schaltplan so gesehen. Da war
es doch richtig...
Hier nochmal kurz zur Argumentation über das Innenleben deines
verwendeten Transcievers. CANH hat rezessiv LO und wird gegen VDD
gezogen (Push only).
CANL hat rezessiv HI und wird gegen GND gezogen (Pull only).
Das kleine Kerlchen in der Mitte realisiert den (rezessiven) Ruhepegel
auf VDD/2. Ebendieses Konstrukt könnte aber defekt oder unzureichend
sein. Dann wären die Flanken bei 2x120Ohm über CANH/CANL evtl. nicht
steil genung und die Kommunikation will nicht.
Da kann man auch testweise externe Widerstände an CANH und CANL hängen.
An CANH den externen PullDown und CANL einen externen PullUp.
Wenn das mit den PullUp/PullDown tatsächlich was bringt, kannst du beide
Leitungen extern mit einem Bias-Netzwerk auf Ruhepegel stützen. Siehe
Bild aus einer NXP Appnote.
Und jetzt noch die Appnote AN00020 von NXP dazu:
(..)
In principle, a circuit like the one in Figure 11
provides symmetrical biasing of the common
mode voltage with respect to the bus voltage levels in dominant state.
In recessive state the bus voltages are biased to the symmetry voltage
of
VCC/2
(..)
If there is a large number of unpowered nodes, it is recommended to
additionally stabilize the nominal common mode voltage of VCC
/2 with an external biasing circuit in order to achieve an optimum EMC
performance. (..)
René B. schrieb:> Das kleine Kerlchen in der Mitte realisiert den (rezessiven) Ruhepegel> auf VDD/2. Ebendieses Konstrukt könnte aber defekt oder unzureichend> sein. Dann wären die Flanken bei 2x120Ohm über CANH/CANL evtl. nicht> steil genung und die Kommunikation will nicht.
Dieses (hochohmige) Kerlchen eignet sich allenfalls dazu, den Pegel
einer inaktive Leitung im zulässigen Rahmen zu halten. Bei einem korrekt
betriebenen CAN Bus ist ausschliesslich der (niederohmige)
Leitungsabschluss für die Flanke von dominant zu rezessiv zuständig. Die
Innenschaltung der Transceiver ist dafür nicht zuständig. Ohne
Abschluss kann das allenfalls in einem kleinen Laboraufbau bei niedriger
Bitrate funktionieren.
Eine etwas genauere Darstellung einer möglichen Innenschaltung von
CANH/L Anschlüssen bietet beispielsweise das Datasheet des SN65HVD233.
Wenn man in einem simplen 10cm langen Laboraufbau einen CAN Bus nicht zu
laufen bringt, dann sind irgendwelche Bias-Widerstände der falsche
Ansatz. Dann liegt das Hauptproblem garantiert woanders.
Einen richtigen CAN-Bus zu verwenden, wie im Layout meines
Eingangspostings hat leider auch keine Verbesserung gebracht.
Sieht wohl leider so aus, als ob mir nichts anderes übrig bleibt, die
MCPs auszutauschen und zu hoffen, dass es dann funktioniert...
Aber vielen Dank an alle, die versucht haben, mir zu helfen!
A. K. schrieb:> Wenn man in einem simplen 10cm langen Laboraufbau einen CAN Bus nicht zu> laufen bringt, dann sind irgendwelche Bias-Widerstände der falsche> Ansatz. Dann liegt das Hauptproblem garantiert woanders.
Da muss ich dem Kollegen beipflichten, es gibt in dieser Situation eine
effektive Fehlersuche:
Per Scope die Pegel anschauen, ob die vernünftig aussehen und ob die
Bitzeit eingehalten wird. Weiterhin gaaanz wichtig: beim
Sendevorgang(!!!) die Versorgung 5V lder meinetwegen auch VCC
oszilloskopieren, ich denke da liegt der Hund begraben.
Harald schrieb:> Sendevorgang(!!!) die Versorgung 5V lder meinetwegen auch VCC> oszilloskopieren, ich denke da liegt der Hund begraben.
Und zwar weil die Transceiver mit Abschluss bei dominantem Signal
ordentlich Strom ziehen. Ohne Abschluss tut sich da wenig.
Verwende wie im Schaltplan einen Schaltregler mit Tiefpassfilter zur
Stromversorgung. Werde aber mangels Oszi probeweise einen 7805 für die
Stromversorgung des MCPs nutzen.
Canh und canl vertauscht ???
Längeres Kabel nehmen
Pullup/Pulldown Widerstände wenn Faulttolerant CAN
Neues Transceiverbaustein
Hängt evtl der sendende uC nach dem stecken der Jumper?
Störungen auf der Logikseite ausgeschlossen?)-> uC, CAN Controller
Oszibild machen und Posten
Vertauschen von CANH und CANL ist ausgeschlossen.
Kommunikation ist erfolgreich, solange kein Jumper gesetzt ist.
Wird dann ein oder beide Jumper gesetzt, erhalte ich keine Nachricht
mehr.
Werden die Jumper dann wieder gezogen, wird die letzte Nachricht
übertragen, und Kommunikation ist wieder erfolgreich möglich.
Heute wird die Stromversorgung überprüft, falls dass nichts hilft und
ich kein Oszi in die Finger bekomme, werde ich neue MCPs ordern müssen.
Dachte bei CAN gibt es keine Pullup/-down-Widerstände?
Natürlich hat CAN Pullup und Pulldown. Sonst könnte kein Kurzschluss
nach Masse / Vcc erkannt werden. Faulttolerant Receiver brauchen immer
Pullup/down, Highspeed Transceiverbausteine haben das integriert
ausreichend. Den MCP kenne ich nicht, im Automotive ist SAE bzw. TI
vertreten.
Peter schrieb:>Natürlich hat CAN Pullup und Pulldown.
Klar,auf Chipebene bestimmt.
> Sonst könnte kein Kurzschluss nach Masse / Vcc erkannt werden.
Beim "Standard"-CAN nicht relevant. Welche Erkennung meinst Du in Bezug
auf den eingesetzten Tranceiver?
> Den MCP kenne ich nicht
Der MCP2551 ist eine gaaanz normale Alternative (Pin- und
funktionskompatibel) zu AT6660, PCA82C25x, TJA1040, usw. usw.
Da braucht es definitiv keine externen(!) Pull-Up oder Pull-Down.
Verwirre den armen Kerl doch nicht. Wenn es in dem Aufbau im Labor nicht
läuft hat er ein viel trivialeres Problem.
>Faulttolerant Receiver...
Andere Baustelle.
>im Automotive ist SAE bzw. TI > vertreten.
Wen meinst Du mit SAE? Was mit TI? Spannst Du einen Vergleich in etwa
zwischen "ADAC" und "Volkswagen" auf?
Peter schrieb:> Natürlich hat CAN Pullup und Pulldown. Sonst könnte kein> Kurzschluss> nach Masse / Vcc erkannt werden. Faulttolerant Receiver brauchen immer> Pullup/down, Highspeed Transceiverbausteine haben das integriert> ausreichend. Den MCP kenne ich nicht, im Automotive ist SAE bzw. TI> vertreten.
Definitiv FALSCH!
CAN hat keine Pullup und Pulldown, sondern nur die Bus-Terminierung
von jeweils 120 Ohm am Anfang und Ende des Busses. Hatte ich aber schon
paarmal geschrieben. Und das ist nicht meine persönliche Meinung, weil
ich mich mit jemand streiten will. Das liegt mir fern. Das ist in jeder
CAN-Dokumentation nachzulesen.
@Duzezan:
Wenn du einen Oszi auftreiben kannst und das ist ein Zweikanaler, dann
noch einen Tipp:
Du kannst einmal die einzelnen Busleitungen (CANH und CANL) getrennt
anschauen, was die mit dem Pegel machen. Als Kontrolle kannst du auch
die beiden Oszi-Kanäle nehmen, einen von beiden invertieren (geht mit
den meisten Zweikanalern) und dann die beiden addieren (auch eine
Funktion des Oszis). Dann bekommst du eine Kurve, die dem eigentlichen
Signal entspricht. Du machst also mit dem Oszi aus dem differenziellen
Signal wieder ein "Single"-Signal.
1.4.1 HIGH-SPEED
High-Speed mode is selected by connecting the RS pin
to VSS. In this mode, the transmitter output drivers have
fast output rise and fall times to support high-speed
CAN bus rates.
Falk Brunner schrieb:> 1.4.1 HIGH-SPEED> High-Speed mode is selected by connecting the RS pin> to VSS. In this mode, the transmitter output drivers have> fast output rise and fall times to support high-speed> CAN bus rates.
Aber dann wäre es zumindest einen Versuch wert, mit einem Widerstand das
System etwas langsamer zu machen.
[Spekulation]
1. Wer weiß, was da bei dem/der umbekannten Layout/Verdrahtung eventuell
schwingt. Ein Abschlußwiderstand sollte das zwar eigentlich verbessern,
aber tut es eventuell nicht; aber mit Abschluss sind die Pegel kleiner
und das Einschwingen könnte dann die Schaltschwelle des Empfängers
erreichen, sodass er "prellt".
2. Wegen schlechtem Layout (GND, Stützkondensatoren, ...) kommt der
Ärger über GND und/oder +5V. Bei High-Speed und Abschlusswiderstand
(höherer Strom) wir das System instabil.
[/Spekulation]
Gruß Dietrich
1. Mit welcher Geschwindigkeit arbeitest du auf deinem Telefonkabel?
2. Hast du mal ein anderes, kürzeres Kabel versucht?
3. Hast du die Geschwindigkeit schon verändert?
Canfreak schrieb:> 2. Hast du mal ein anderes, kürzeres Kabel versucht?
Kürzer als die vorhandenen 10cm?
Duzezan schrieb:
> Die Kabellänge dafür liegt bei ~10cm.
ich schrieb:> Du kannst einmal die einzelnen Busleitungen (CANH und CANL) getrennt> anschauen, was die mit dem Pegel machen. Als Kontrolle kannst du auch> die beiden Oszi-Kanäle nehmen, einen von beiden invertieren (geht mit> den meisten Zweikanalern) und dann die beiden addieren (auch eine> Funktion des Oszis). Dann bekommst du eine Kurve, die dem eigentlichen> Signal entspricht. Du machst also mit dem Oszi aus dem differenziellen> Signal wieder ein "Single"-Signal.
Ich kann doch einfach CAN-high gegen CAN-low messen. Also den Tastkopf
an CAN-high und die Masseleitung an CAN-low und dann sehe ich doch die
Bits aufm Bus. Oder sehe ich das falsch?
Du siehst das falsch. Denn deine Masse vom Oszi schließt dir im
zweifelsfall CANL kurz gegen GND vom Netzteil. Nur wenn die die
Schaltung KOMPLETT massefrei ist, kann es gehen, ist aber dennoch
ungünstig.
> Ich kann doch einfach CAN-high gegen CAN-low messen. Also den Tastkopf> an CAN-high und die Masseleitung an CAN-low und dann sehe ich doch die> Bits aufm Bus. Oder sehe ich das falsch?
Nur wenn dein Versuchsaufbau, sprich dessen Netzteil und GND
potentialfrei sind ODER du ein batteriebetriebenes Oszi hast ODER einen
Differenztastkopf hast ODER ...
Besser:
- Tastköpfe auf 10er Teilung stellen
- Nimm beide Oszi Kanäle und häng die Krokoklemmen jeweils
auf GND deines Aufbaus.
- CH1 auf CANH
- CH2 auf CANL
- Wenn dein Oszi dann noch eine Subtraktion der Kanäle beherrscht, lass
dir das Differenzsignal auch noch ausgeben.
Und bitte vorher - falls noch nicht geschehen - mal die Tastköpfe in der
10er-Teilung auch abgleichen :) (google "Tastkopf abgleichen")