CAN Kommunikationsproblem

Gast #160431
Lesenswert?
• ▲
▼
Hi!

Was ich wissen will ist, wie muss ich das Verbindungskabel terminieren?
Ich benutze jeweils den CAN Tranciever82C250 (Baudrate 50Kbit/s bzw.
100KBit/s, SJA1000).
Wenn ich ein Telegramm zur anderen Station sende, dann bleibt bei mir
das Programm hängen. Offensichtlich bleibt das Programm bei der Sende
Funktion hier stehen -->

do
   {
   }
while (((canreg_read(2))&0x08)== 0);    //warten bis Sendung fertig
                                          // Nachricht senden.
Was kann da die Ursache sein?
Gast #160433
Lesenswert?
• ▲
▼
Ich habe jetzt mal zwei mal 120Ohm Widerstande zwischen CAN Low und CAN
High angeschlossen. In der Firma wo ich arbeite setzten wie eine CAN
Hardware von Vector Informatik ein. Da ist das CANCab für HighSpeed mit
zwei mal 120Ohm abgeschlossen.

Was kann das bedeuten wenn das Programm beim senden da hängen bleibt?
Gast #160434
Lesenswert?
• ▲
▼
Kannst du mir sagen wie ich diese berechnen kann?
(Baudrate habe ich bei mir auf 50KBit/s eingestellt)

Ich habe jetzt mal zwei mal 120Ohm Widerstande zwischen CAN Low und
CAN
High angeschlossen. In der Firma wo ich arbeite setzten wie eine CAN
Hardware von Vector Informatik ein. Da ist das CANCab für HighSpeed
mit
zwei mal 120Ohm abgeschlossen.

Was kann das bedeuten wenn das Programm beim senden da hängen bleibt?

.
Gast #160435
Lesenswert?
• ▲
▼
> Was kann das bedeuten wenn das Programm beim senden da hängen bleibt?

Das bedeutet, daß diese Schleife hier:
> while (((canreg_read(2))&0x08)== 0);
nicht verlassen wird!
Oder wolltest du wissen was (((canreg_read(2))&0x08)== 0) bedeutet?

PS: DIRK==shazter?

----, (QuadDash).
Gast #160436
Lesenswert?
• ▲
▼
> Kannst du mir sagen wie ich diese berechnen kann?
Die braucht man praktisch nicht zu berechnen - man nimmt einfach 2x 120
Ohm und gut is. Wert für Laboraufbauten/-kabellängen überhaupt nicht
kritisch!

----, (QuadDash).
Gast #160437
Lesenswert?
• ▲
▼
Danke für die Hilfe!

Was könnte noch dazu führen, das mein Programm hier nicht weiterkommt?
Die Initialisierung funktioniert auf beiden Seiten ohne Probleme. Dies
habe ich auch geteset indem ich die Register dann gleich wieder
auslese. Hmmm....
Ich komme da nicht weiter....
Gast #160439
Lesenswert?
• ▲
▼
Folgendes habe ich jetzt erfahren woran es bei mir liegen könnte:
Die Spielregel bei CAN lautet: mindestens ein Teilnehmer muss die
gesendete Nachricht im Acknowlege -Slot bestätigen.
Bisher hat das der PEAK-Dongle übernommen. Fehlt er, kommt von Ihm
keine Bestärigung und offenbar  wird Sie vom anderen Teilnehemr nicht
geschickt.

So jetzt weiss ich allerdings nicht wie ich bei mir per Software den
Acknowledge Slot bestätigen kann?
Kann ich dies überhaupt machen?
Gast #160440
Lesenswert?
• ▲
▼
Nein, kannst du nicht. Wenn beide korrekt initialisiert sind und am Bus
hängen, dann wird das ACK-Bit auch automatisch von der CAN-Hardware
gesetzt (ohne SW-Einfluß).

Hast du mein Posting von: Datum: 15.04.2005 18:39 schon gelesen?
Was bedeutet denn das Bit3 in canreg_read(2)?

> mindestens ein Teilnehmer muss die gesendete Nachricht im
> Acknowlege-Slot bestätigen.
Hast du das aus dem Wiki gelesen? (Dann wars ja gut, daß ich gestern
die Anm. hinzugefügt habe :-)

----, (QuadDash).
Gast #160441
Lesenswert?
• ▲
▼
Das Bit3 in canreg_read(2) bedeutet:
Transmit Buffer Status(Durch dieses Bit wird gezeigt wie der Status im
Transmit Buffer gerade ist)
Aber warum die Frage?

Hmmm...was könnte noch die Ursache sein?
Gast #160442
Lesenswert?
• ▲
▼
Dieser Ausdruck bedeutet -->while (((canreg_read(2))&0x08)== 0);

VALUE 1= complete; the last requested transmission has been
successfully completed
VALUE 0= incomplete; the previously requested transmission is not yet
completed
Gast #160443
Lesenswert?
• ▲
▼
> the previously requested transmission is not yet completed
weil: (z.B.)
- kein Zugang zum anderen Knoten (für die ACKs) - Kabelbruch?
- CAN-Leitungen vertauscht
- Verbindung zwischen CAN-Controller und CAN-Transceiver
unterbrochen/vertauscht/Kurzschluß?
- Baudrate falsch (dir ist schon klar, daß du alle Teilnehmer auf die
gleiche Baudrate einstellen mußt...)
- irgendwo Hardwaredefekt

Viel mehr kommt eigentlich nicht in Frage.

Deshalb: Oszi anschließen (Analogoszi reicht), wenn du ein stehendes,
ruhiges Bild bekommst und dich wunderst warum du jedes einzelne Bit der
CAN-Nachricht sehen kannst und alles sauber getriggert bekommst, dann
liegt das daran, daß der CAN-Teilnehmer kein ACK bekommt und dauernd
versucht seine Botschaft loszuwerden. :-)

----, (QuadDash).
Gast #160444
Lesenswert?
• ▲
▼
>> the previously requested transmission is not yet completed
>weil: (z.B.)
>- kein Zugang zum anderen Knoten (für die ACKs) - Kabelbruch?
>- CAN-Leitungen vertauscht
>- Verbindung zwischen CAN-Controller und CAN-Transceiver
>unterbrochen/vertauscht/Kurzschluß?
>- Baudrate falsch (dir ist schon klar, daß du alle Teilnehmer auf die
>gleiche Baudrate einstellen mußt...)
>- irgendwo Hardwaredefekt
>
>Viel mehr kommt eigentlich nicht in Frage.

Noch einen Grund könnte es geben: 2 CAN-Knoten senden exakt die gleiche
Botschaft -> Buskonflikt -> ständige Wiederholung der msg.
Kann z.B. vorkommen, wenn man auf mehrere Knoten dieselbe Testsoftware
spielt.

Viele Grüße, Stefan
Gast #160445
Lesenswert?
• ▲
▼
Hallo vielen Dank für die Tipps.
Die beiden Stationen habe ich folgendermaßen so verbunden:
CAN LOW  -------- CAN LOW
             |
             -
            | | 60 Ohm Widerstand
            | |
             -
             |
CAN HIGH -------- CAN HIGH

Das stimmt doch oder? Da ich eine kurze Verbindung habe, habe ich bei
einer Station gleich einen 60 OHM Widerstand eingelötet.
Gast #160446
Lesenswert?
• ▲
▼
> ständige Wiederholung der msg. Kann z.B. vorkommen, wenn man auf
> mehrere Knoten dieselbe Testsoftware spielt.
Stimmt. Denn normalerweise wird eine CAN-Botschaft ja nur wiederholt,
wenn kein zweiter CAN-Teilnehmer am Bus ist (genauer: wenn es kein ACK
gibt). Da ja aber beide gleichzeitig senden, erwarten beide ein ACK von
außen und geben selbst keins. (Gleichzeitig bedeutet innerhalb einer
Bitzeit). Deshalb geht auch nicht der Tx-Errorcounter hoch und führt
auch nicht zum BusOff...

----, (QuadDash).
Gast #160447
Lesenswert?
• ▲
▼
Die eine Station habe ich den SJA1000 an einem AVR angeschlossen und die
andere Station, da habe ich den SJA1000 direkt an der Centronix
Schnittstelle angeschlossen. Das Programm dafür habe ich mit Borland
Builder C++ geschrieben. Definitiv sende ich "nicht" gleichzeitig die
gleichen Botschaften auf allen Stationen. Ich versuche die ganze Zeit
von PC auf Mikrocontroller eine Botschaft zu senden.
Gast #160448
Lesenswert?
• ▲
▼
@DIRK: Geh mal auf die Punkte ein, die hier aufgezählt wurden, sonst
macht das keinen Sinn. So weiß keiner, ob du das verstanden hast und ob
das Problem evtl. woanders bzw. tiefer zu suchen ist... so kann nur
rumgeraten werden!
Und ja, deine Terminierung ist so in Ordnung.

----, (QuadDash).
Gast #160449
Lesenswert?
• ▲
▼
Folgende Punkte habe ich jetzt mal geprüft:
-Kabelbruch liegt nicht vor.
-Die Leitungen habe ich nicht falsch angeschlossen bzw. vertauscht.
-Beide Stationen habe ich mit 50kBit/s initialisiert.
Gast #160451
Lesenswert?
• ▲
▼
Aha, also die 2 Teilnehmer, die an unterschiedlicher Software/Hardware
hängen. Ich bin davon ausgegangen, daß beide Can-Teilnehmer identisch
aufgebaut sind, und davon nur einer funktioniert.
Aber jetzt kann der Fehler ja überall sein...
Du siehst, die Infos tröpchenweise zu liefern ist keine gute Idee.

----, (QuadDash).
Gast #160453
Lesenswert?
• ▲
▼
Die 60 Ohm sollten schon passen. Leider kann ich Dir keine weitere Idee
bieten. Hast Du ein Oszi? Tu sich überhaupt was auf dem Bus? Sind die
CAN-Treiber ordentlich eingeschaltet (nicht Standby, PWDN, etc.)?

Stefan
Gast #160455
Lesenswert?
• ▲
▼
Hallo!!!!

Oh...hmmm...ich bin am verzweifeln. Ich kann noch als nichts empfangen
bzw. senden. Wenn ich vom PC aus zu der anderen Station sende, dann
bleibt mein Programm beim senden immer hängen. Misst misst. Der andere
Teilnehmer den ich mit dem AVR +SJA1000 realisiert habe, da sehe ich
das das Register SR(Steuergerregister) = 0x4C anzeigt.
Siehe Anhang.

Ich muss dies zum laufen bringen. Hmmm..leider habe ich kein Oszi. Was
kann ich noch benutzen, außer ein Oszi? Womöglich bleibt mir nichts
anderes übrig als ein Oszi zu beschaffen.
Angehängte Dateien:
Gast #160459
Lesenswert?
• ▲
▼
Hallo  Dirk,

Der Wert 0x4C interpretiere ich als Fehler in der Übertragung.
Kontrollier nochmal die Einstellung deiner Bit-Timing-Register, ob die
Wirklich gleich sind.


Denkbar wäre auch dass der eine im Pelican-Mode arbeitet und
Extendend-ID's sendet, das würde dir in Verbindung mit dem Peak-Dongle
u.U gar nicht auffallen.

Weiterhin solltest du die ACC-Mask- und ACC-Code-Register setzten
(..Wert 0, soweit ich weiss...) damit keine Botschaften gefiltert
werden.

Gruss,
Peter
Gast #160460
Lesenswert?
• ▲
▼
Das ist meine Initialisierung Routine für beide Teilnehmer.
(50KBit/s)
Ist da was falsch?

/*----Initialisierungsroutine für den CAN-Controller
SJA1000------------*/
void TForm1::can_init(void)
{
 do
  {
   canreg_write(0,0x01);
  }
 while (((canreg_read(0)) &0x01)==0);

 canreg_write(4,0xFF);
 canreg_write(5,0xFF);
 canreg_write(6,0x43);
 canreg_write(7,0x2F);
 canreg_write(8,0x1A);
 canreg_write(31,0x07);

 do
  {
   canreg_write(0,0x00);
  }
 while (((canreg_read(0))&0x01)== 1);
 //canreg_write(1,0x0C);
}
Gast #160463
Lesenswert?
• ▲
▼
Grüß dich,

also der Can-Bus muß links und rechts am Ende mit jeweils 120Ohm
abgeschlossen werden sonst wird das nix mit den Datenübertragen.

Ist die selbe Geschichte wie bei den alten Koax-Netzwerkkabeln.

lg,

Michael

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren