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?
Hast du auch die Abschlusswiderstände richtig berechnet. Das war mal bei mir ein Problem.
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?
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? .
> 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).
> 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).
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....
Beide Schaltungen habe ich mit einem funktionierenden CAN Partner getestet. Wie gesagt nur die beiden können nicht kommunizieren.
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?
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).
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?
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
> 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).
>> 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
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.
> 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).
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.
@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).
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.
Und noch was. Ich sende nicht von allen beiden Stationen gleichzeitig bzw die gleiche ID.
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).
Nein, beide Teilnehmer habe ich zuvor mit dem CAN Dongle von PEAK getestet. Funktionierte ohne Probleme. Leider habe ich den Dongle nicht mehr.
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
Hmmm...leider habe ich kein Oszi! Ich wollte mir ein besorgen, aber die sind halt sehr teuer.
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.
Wie gesagt vor ein paar Wochen habe ich beide Teilnehmer an einem funktionierenden CAN Dongle getestet. Ergebnis: i.O. 1. Teilnehmer AVR + SJA1000 2. Teilnehmer PC(Centronix Schnittstelle) + SJA1000
Biite bitte helft mir. Ich weiss nicht was ich weiter tun kann, damit meine beiden CAN Teilnehmer funktionieren.
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
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); }
Die einstellung im Acceptance code Register ist egal (ACR) nur im Acceptance Mask Register MÜSSEN alle Bits auf 1 gesetzt werden, damit kein Filter aktiv ist.
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
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.