mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit CAN Verbindung!


Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe den SJA1000 an einen AVR angeschlossen. Diese Schaltung habe
ich auch dann an einem gekauften CAN Dongle von PEAK CAN angeschlossen
und getestet. Funktioniert ohne Probleme.
Als zweites habe ich einen SJA1000 an einer Paralellen Schnittstelle
angeschlossen und anschließend auch an dem PEAK CAN getestet.
Funktioniert ohne Probleme. Nur wenn ich jetzt beide Schaltungen (Ohne
PEAK CAN Dongle) miteinander verknüpfe, dann kann ich keine Botschaften
senden und empfangen. So wie es auch aussieht kann ich den SJA1000
initialisieren das funktioniert. Als verbindungskable verwende: CAN Low
und CAN High , zwischen diesen beiden Leitungen habe ich einen 60Ohm
Widerstand implementiert. Woran kann das Problem liegen, dass ich keine
Daten senden und empfangen kann?

Dieser Code verwende ich für beide Seiten.
/*----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);

 Edit18->Text = canreg_read(6);
 Edit19->Text = canreg_read(7);
 Edit20->Text = canreg_read(8);
 Edit21->Text = canreg_read(31);

 do
  {
   canreg_write(0,0x00);
  }
 while (((canreg_read(0))&0x01)==01);
 //canreg_write(1,0x0C);
}

/*----CAN Botschaft
senden------------------------------------------------*/
void TForm1::canmessage_write(struct message2 *ptransmit)
{
   unsigned int id_1,id_2,id_3;
   unsigned int id_1_hilf,id_2_hilf,id_3_hilf;
   unsigned int trdscr_wert;
   unsigned int i;

   id_3=(ptransmit->id)&0x0f;
   id_2=((ptransmit->id)/16)&0x0f;
   id_1=((ptransmit->id)/256)&0x0f;

   id_1_hilf=id_1*32;
   id_2_hilf=id_2*2;
   id_3_hilf=id_3/8;

   trdscr_wert=(id_1_hilf)|(id_2_hilf)|(id_3_hilf);
   canreg_write(10,trdscr_wert);

   id_3=(ptransmit->dlc)&0x0f;
   id_2=(ptransmit->rtr)*16;
   id_1=((ptransmit->id)&0x0f)*32;

   trdscr_wert =(id_3)|(id_2)|(id_1);
   canreg_write(11,trdscr_wert);

      for (i=0;i<=7;i++)
      {
       canreg_write (12+i,ptransmit->byte[i]);
      }
   canreg_write (1,0x01);                //Sendung ausl”sen
   do
    {
    }
   while (((canreg_read(2))&0x08)==0);    //warten bis Sendung fertig
}

/*----CAN Botschaft
empfangen---------------------------------------------*/
void TForm1::canmessage_read(struct message1 *preceive)
{
 unsigned int id_1,id_2;
 unsigned int i;
 if (((canreg_read(2))&0x01)!=0)

 id_1=canreg_read(20);
 id_2=canreg_read(21);

preceive->id=(id_1/32)*256+((id_1/2)&0x0f)*16+((id_1)&0x01)*8+(id_2/32);
 preceive->rtr=(id_2/16)&0x01;
 preceive->dlc=(id_2)&0x0f;

 for(i=0;i<=7;i++)
  {
   preceive->byte[i]=canreg_read(22+i);
  }
 canreg_write(1,0x0C); /*ReceiveBuffer und DataOverrun wieder
freigeben*/

 }

/*------------------------------------------------------------------*/

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schuss ins Blaue: beide verwenden die gleiche ID auf dem Bus?

Autor: bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was meinst du mit "schuss ins blaue"?

Ich tue ja nicht auf beiden Seiten gleichzeitig senden.
Kann ich das Verbindungskabel mit 60 Ohm abschliesen?

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frankbert:
Mit "schuss ins Blaue" meinte ich, daß ich vermute, daß es daran
liegt.

Da spielt es auch keine Rolle, ob Du gleichzeitig zu senden versuchst,
die Frames kollidieren auf jeden Fall, wenn zwei Teilnehmer mit
gleicher ID initialisiert wurden.

Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich tue erst mal ganz normal den SJA1000 initialisieren.
So und anschhließend sende ich von einem zum anderen Teilnehmer ein
Frame.Ich tue ja nicht gleichzeitig auf der anderen Seite auch senden.
Das mache ich nicht. Was könnte noch sein?
Wie sieht das mit dem Verbindungskabekl aus. Stimmen die 60 Ohm?

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
grrrr

Ändere mal bitte bei einem die ID!

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Terminierung sollte auf beiden Seiten 120 Ohm sein.

Die Teilnehmer werden nicht mit der gleichen ID initialisiert, sondern
sie senden höchstens Nachrichten mit der gleichen ID, was nur dann zur
einer Kollision führt, wenn beide Teilnehmer versuchen, beinahe
gleichzeitig zu senden. Es kann aber trotzdem nicht schaden, zwei
verschiedene IDs zu verwenden, oder erstmal nur einen senden zu lassen
und wenn das geht, den anderen. Also Schritt für Schritt, nicht alles
auf einmal...


Klaus

Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche ID meint ihr? Die ID vom Datentelegramm? Was meint Ihr mit
Teilnhmer werden nicht gleichzeitig initialisiert.
Stimmt bei der Initialisierung (CAN_INIT()) irgendwas nicht?

/*----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);

 Edit18->Text = canreg_read(6);
 Edit19->Text = canreg_read(7);
 Edit20->Text = canreg_read(8);
 Edit21->Text = canreg_read(31);

 do
  {
   canreg_write(0,0x00);
  }
 while (((canreg_read(0))&0x01)==01);
 //canreg_write(1,0x0C);
}

Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da mein Kabel nicht so lange ist, habe ich auf der einen Seite zwischen
CAN LOW und CAN HIGH einen 60Ohm Widerstand eingelötet.

Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs nochmal überprüft. Ich sende auf jedenfall nicht gleizeitig von
allen beiden Stationen.

Könnte es vielleicht doch an der CAN Initialisierungsroutine liegen?
Diesen Code habe ich nämlich übernommen.

canreg_write(4,0xFF);
canreg_write(5,0xFF);
canreg_write(6,0x43);
canreg_write(7,0x2F);
canreg_write(8,0x1A); //Für was ist dieses Register eigentlich. Stimmt
das?
canreg_write(31,0x07);

Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Kann mir da niemand helfen!
Bin jetzt total ratlos.

Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir noch einfällt ist...hmmm was bedeutet eigentlich das OCR
Register? Ich habe nur mal gelesen das man damit den Ausgangstreiber
veinstellen kann. Was beutet Ausgangstreiber hier? Vielleicht liegt es
auch daran.

Autor: Atlan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OCR Output control register und liegt an CANAdresse 0x08 im SJA1000,
damit definiert man den Sendemodus des SJA1000 , wie ich sehe schreibst
du da 0x1A rein, das ist für 82C250/251 korrekt.
ansonsten Beschreibung des Registers im manual vom SJA1000 auf Seite 51

Autor: Sometimes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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.

Wenn nur ein 60Ohm Widerstand an einem Ende drinnen ist bekommt man
Signalreflektionen, welche die Übertragung erheblich stören bzw.
komplett verhindern.

P.S. Einen Can-Transciever hast du schon eingebaut (z.B 82C250
vonPhilips)
Denn wenn nicht is es überhaupt nix mit Can-Bus und Datenübertragung.

lg

Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.