Forum: Mikrocontroller und Digitale Elektronik CAN-Bus - Senden & Empfangen mit AT90CAN128


von Chris K. (christopher_k25)


Angehängte Dateien:

Lesenswert?

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
von Chris K. (christopher_k25)


Lesenswert?

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...

von Rudolph (Gast)


Lesenswert?

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.

von Chris K. (christopher_k25)


Lesenswert?

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...

von Rudolph (Gast)


Lesenswert?

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.

von Steffen R. (steffen_rose)


Lesenswert?

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?

von Frank K. (fchk)


Lesenswert?

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

von Rudolph (Gast)


Lesenswert?

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.

von Chris K. (christopher_k25)


Lesenswert?

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...

von Rudolph (Gast)


Lesenswert?

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. :-)

von Chris K. (christopher_k25)


Angehängte Dateien:

Lesenswert?

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.)

von Chris K. (christopher_k25)


Lesenswert?

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.

von Rudolph (Gast)


Lesenswert?

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().

von Chris K. (christopher_k25)


Lesenswert?

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

von Steffen R. (steffen_rose)


Lesenswert?

Mit LowSpeed meint man meist auch Fault Tolerant.

Wenn das bei Dir so ist, dann wäre es wohl einfacher den Transceiver zu 
tauschen.

von Frank K. (fchk)


Lesenswert?

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

von Chris K. (christopher_k25)


Lesenswert?

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...

von Frank K. (fchk)


Lesenswert?

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

von Chris K. (christopher_k25)


Lesenswert?

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