Hallo, Ich versuche aktuell eine CAN-Kommunikation zwischen zwei AT90CAN128 aufzubauen. Das Platinenlayout ist das des CAN-Debuggers von Kreatives-Chaos - Schaltplan im Anhang. Als CAN-Library nutze ich die aus dem Forum hier. Auch meine entsprechenden C-Files hänge ich hier an. Am System hängt ein CANalyzer von Vector mit 2 Modulen. Die Kommunikation zwischen den beiden Modulen funktioniert ohne Probleme und wenn ich vom AT90 aus eine Nachricht sende kommt diese auch am Analyzer an. Das Problem: Der AT90 geht beim senden direkt in den Bus-Error-Mode und hängt sich in der Warteschleife auf TXOK auf. Auf dem Bus wird dann derselbe Frame immer und immer wieder gesendet - scheinbar ein Acknowledgement Error. Außerdem kommt auch wenn ich per CANalyzer in regelmässigen Abständen Nachichten sende nichts am Controller an; es wird kein Interrupt ausgelöst und nichts. Da ich den Bus ja mit dem Analyzer betreibe ist auf jeden Fall jemand am anderen Ende der das ACK-Bit setzt, und am CAN-Tool hier am PC sehe ich auch die ankommende Nachricht. Wenn ich den TX-Ausgang manuell auf High setze und RX auslese, kommt das Signal an. Wenn ich in der Sende-Routine die Warteschleife auskommentiere und dann während der Controller im Error das GANGSTA (CAN General Status Register) abfrage, sind die Bits für "Error Passive Mode", "Controller Enable" und "Transmitter Busy" gesetzt. Ich hoffe, jemand kann mit meinen Angaben soweit etwas anfangen und mir bei der Lösung des Problems helfen. Grüße Chrissi
:
Bearbeitet durch User
Update: Wenn ich von Analyzer und AT90 gleichzeitig eine Nachricht sende, kommen überall nurnoch Errors an. Scheinbar ignoriert der AT90 einfach alles was auf dem Bus passiert, obwohl ja alle Signale ankommen sollten...
Der Schaltplan-Ausschnitt im Anhang ist so für sich etwas dünn. Terminierung? Welche Datenrate? Der Quarz hat die korrekten Kondensatoren? Und probier mal das Programm von hier aus: Beitrag "CAN beim ATMega16M1 anders als bei 90CANxx?" Das ist so auch mit dem 90CAN128 kompatibel, es werden nur nicht alle Message-Boxen initialisiert. Damit sollte im CANanlyzer zu sehen sein, dass der Controller alle 50ms eine Botschaft schickt.
Terminiert: Ja, 120 Ohm an jedem Ende; 100kBaud Quarz läuft mit 22pF. Die Frequenz passt auch, alle anderen Anwendungen funktionierten von Timing her Ich versuche das später mal, habe aber bestimmt schon 4 Bibliotheken für den CAN ausprobiert...
Chris K. schrieb: > Terminiert: Ja, 120 Ohm an jedem Ende; Okay. > 100kBaud > Quarz läuft mit 22pF. Die Frequenz passt auch, alle anderen Anwendungen > funktionierten von Timing her Naja, die "Standard" 22pF sind für die meisten Quarze einfach falsch, aber bei 100kBaud wirkt sich das andererseits noch nicht aus. > Ich versuche das später mal, habe aber bestimmt schon 4 Bibliotheken für > den CAN ausprobiert... Selber machen macht schlau. :-) Hier aber noch ein anderes einfaches Beispiel: http://www.mikrocontroller.net/attachment/216654/16M1_Test.c Das antwortet beim Empfang einer Botschaft mit dem Senden einer anderen Botschaft, da könnte man einfach im CANanlyzer 0x333 senden und bekommt 0x444 zurück. Alles bei 500kBit. Vorsichtshalber könnte man in der can_init() das Ende der while() Schleife noch auf 15 legen um die zusätzlichen Message-Boxen vom 90CAN128 noch mit zu initialisieren.
Chris K. schrieb: > Wenn ich den TX-Ausgang manuell auf High setze und RX auslese, kommt das > Signal an. Rezessive ist High Pegel. D.h. CANTX muss in Ruhe auf High liegen. Oder missverstehe ich etwas an deiner Aussage?
Ersetze mal testweise den ADuM durch Drahtbrücken. Bei CAN ist die Signallaufzeit sehr wichtig - ist die zu groß, klappen wichtige Teile des Protokolls nicht mehr. Es könnte durchaus sein, dass der Isolator zu langsam für die gewählte Bitrate ist. Durch Entfernen und überbrücken findest Du es heraus. Wenn es ohne Isolator funktioniert, solltest Du den ADuM1201 durch den schnelleren ADuM1281 oder den abermals schnelleren Si8621 ersetzen. fchk
ADUM1201 für den CAN passt schon, das haben wir hier auch schon länger im Einsatz, bei 500kBit. Der Schnipsel passt auch zu unserem Schaltplan. Eigentlich wollte ich gerade den ISO1050 von TI als Ersatz vorschlagen (z.B. Farnell 175-5712). Ich musste nur gerade feststellen, dass der ein auf SMD umgemodeltes DIP-8 verwendet, das Bild bei Farnell ist krass falsch und bis eben hatte ich die zwei Stück die ich mir mal bestellt hatte nicht ausgepackt. :-) Am Controller RXD / TXD vertauscht? Das wird ja nicht gedreht, RXCAN/PD6/Pin31 wird mit RXD/PIN4 vom Transceiver verbunden und TXCAN/PD5/Pin30 mit TXD/PIN1 vom Transceiver.
Steffen Rose schrieb: > Rezessive ist High Pegel. D.h. CANTX muss in Ruhe auf High liegen. > Oder missverstehe ich etwas an deiner Aussage? Ich hab' im Sekundentakt getoggelt, also Ein-Aus-Ein.. und genau das kam auch vom Bus zurück. Ich hatte das wohl etwas falsch formuliert... Der ADUM hat eine Verzögerung von max. 150ns, eher weniger, was bei einer Bitweite von 10us auf jeden Fall vernachlässigbar ist. Ich habe mal mit einem Oszi in der Uni an den Signalen gehorcht, da ist kein Delay erkennbar. Zum vertauschen von TXD/RXD: Es kommen ja auch Signale raus wenn ich sende, nur registriert der CAN-Controller scheinbar nichts im ACK-slot und hängt sich deshalb in der Senderoutine auf. Das Programm von oben habe ich gerade mal probiert; auch hier kommen nur Bit-Errors am Analyzer an...
Chris K. schrieb: > Das Programm von oben habe ich gerade mal probiert; auch hier kommen nur > Bit-Errors am Analyzer an... Dann hast Du ein Hardware-Problem, das Programm funktioniert. Fuse-Bits? Ist der Quarz auch an und die CKDIV8 aus? Ein bisschen mehr vom Schaltplan könnte auch helfen. :-)
Ja und Ja. Ich habe es eben noch einmal mit internem Quarz probiert, also mit den 8Mhz. Wenn ich F_CPU auf 16 000 000 setze und z.B. die Beleuchtung meines Displays im Sekundentakt blinken lasse, passt der Takt 100%ig zum Ticken der Uhr an meiner Wand... :D auch nach mehreren Minuten noch. Sagt das etwas über die Funktionstüchtigkeit meines Quarzes aus? Wenn ich aber doch einen manuellen Zustandswechsel am TX direkt am RX wieder herein bekomme, wo soll dann das Hardware-Problem sein? Ich hänge mal noch twei Bilder von der Oszilloskopmessung an. das erste: TXCAN - CANH, Channel1: TX, Channel2: CANH das zweite: RXCAN - CANH, Channel1: RX, Channel2: CANH Hatte das Oszi leider auf AC stehen, aber man kann die Pegel doch ganz gut erkennen. (Vorab: Es kann sein dass die Bitzeiten da nicht ganz passen, zu dem Zeitpunkt waren meine Timing Register noch nicht passend.)
Achso, und zum Schaltplan: die beiden Drähte die links aus dem Bild verschwinden gehen einfach direkt an den AT90, der obere an RX, der untere an TX. Der Rest ist dann Display, Schaltregler, SD-Kartenmodul, Bluetoothmodul etc. Wenn das jemanden interessiert kann ich hier mal eine Projektseite anlegen mit Beschreibungen, Bildern und und Fortschritten.
Tja, ich finds interessant, vor allem auch den Rest so, aber meine Glaskugel gibt jetzt auch nichts mehr her. Ich bin nur sicher, dass meine Programme funktionieren, getestet sind die auf dem Mega16M1 und auf dem 90CAN32. Und der 90CAN128 hat ja nur mehr Speicher. Das zweite Programm nutzt nichtmal delay().
Hallo, Aaalso. Problem gelöst: Das Masse-Pad des entkopplers war in meinem Layput nicht mit GND verbunden (Die Leute von der Platinenfirma haben die Masseflächen nicht auf die Reihe bekommen). Deswegen hat der Chip nichts übertragen. Scheinbar ist in dem Moment wo der Mikrocontroller seinen TX-Pin auf Low gesetzt hat über diesen Pin die Versorgung mit Masse hergestellt worden, weshalb Signale über den Entkoppler nach außen übertragen wurden. Hab jetzt nen Draht hin gezogen. Nach leichtem Umprogrammieren der Lib funktioniert der Bus jetzt endlich. Eine weitere Frage: Das System soll später in mein Auto rein, in dem ein Lowspeed-CANbus im Einsatz ist. Allerdings passen laut Internetrecherchen die Spannungspegel von High- und Lowspeed nicht zueinander und der bei mir installierte Bustreiber setzt die Ruhespannung des Lowspeed-Busses ein. Die dominanten Pegel passen... Kann ich die rezessiven Pegel über Pullups / Pulldowns auf das richtige Level ziehen? Oder wie wäre eure Vorangehensweise? Viele Grüße und danke für die Hilfe, Chrissi
Mit LowSpeed meint man meist auch Fault Tolerant. Wenn das bei Dir so ist, dann wäre es wohl einfacher den Transceiver zu tauschen.
Chris K. schrieb: > Das System soll später in mein Auto rein, in dem ein Lowspeed-CANbus im > Einsatz ist. Allerdings passen laut Internetrecherchen die > Spannungspegel von High- und Lowspeed nicht zueinander und der bei mir > installierte Bustreiber setzt die Ruhespannung des Lowspeed-Busses ein. > Die dominanten Pegel passen... > > Kann ich die rezessiven Pegel über Pullups / Pulldowns auf das richtige > Level ziehen? Oder wie wäre eure Vorangehensweise? Transceiver tauschen! Dafür sind das externe Bausteine. Schau mal, ob der TJA1054A passt. fchk
Fault tolerant bedeutet dass der Chip dann auch im Eindrahtbetrieb funktioniert? Wenn ja: im Auto ist das so.. aber ich habe jetzt nicht den Anspruch dass das für mein System der Fall sein muss. Ich geh' davon aus dass beide Drähte dran hängen Der TJA hat ne komplett andere Beschaltung, Allein schon 14 statt nur 8 Beinchen.. Den bekomme ich nicht auf meine Platine. Wird es den Bus im Auto stören wenn ich meine Schaltung da einfach mit rein Hänge? Oder zieht der evtl. Einfach Den rezessiven Pegel auf sein Level? Die dominanten Pegel passen ja und im Datenblatt steht bei "TXD=1" "recessive/floating" - floating hört sich für mich gut an xD Habe eben mal auf meiner Platine nen 1K-Widerstand von CAN-High auf Masse gezogen, der Bus funktioniert noch und der rezessive Pegel liegt bei 0,3V...
Chris K. schrieb: > Der TJA hat ne komplett andere Beschaltung, Allein schon 14 statt nur 8 > Beinchen.. Den bekomme ich nicht auf meine Platine. Vorher nachdenken und erst danach Leiterplatte ordern hilft. > Wird es den Bus im Auto stören wenn ich meine Schaltung da einfach mit > rein Hänge? sehr wahrscheinlich ja, wenn es tatsächlich ein Bus gemäß ISO 11898-3:2006 und nicht einer nach ISO 11898-2:2003 ist und auch kein Single Wire gemäß J2411 ist. Letzteres ist wieder was anderes und braucht wieder eine völlig andere Beschaltung und einen dazu passenden Transceiver wie zB MC33897. Gewissheit bekommst Du, wenn Du irgendein CAN-Device an dem Bus öffnest und schaust, was für ein Transceiver dort verbaut ist. bei der Gelegenheit darfst Du Dir auch anschauen, was für Schutzmaßnahmen dort verbaut sind und diese dann bei Dir übernehmen. Ansonsten wirst Du eben aus Schaden klug. Das ist dann Deine Wahl der Lernmethode. fchk
Es ist 100% ein LowSpeed-CAN Bus mit zwei verdrillten Drähten. Dass der die ISO erfüllt denke ich ist sicher. Tja, dann ist wohl basteln angesagt... Ein LowSpeed-Transceiver nach der ISO-Norm sollte ja auf jeden Fall passen. Ich versuche mal den TJA1054..
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.