Forum: Mikrocontroller und Digitale Elektronik Probleme mit CAN Verbindung!


von frank (Gast)


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

 }

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

von OldBug (Gast)


Lesenswert?

Schuss ins Blaue: beide verwenden die gleiche ID auf dem Bus?

von bert (Gast)


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?

von OldBug (Gast)


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.

von frank (Gast)


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?

von OldBug (Gast)


Lesenswert?

grrrr

Ändere mal bitte bei einem die ID!

von Klaus (Gast)


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

von frank (Gast)


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);
}

von frank (Gast)


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.

von frank (Gast)


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

von frank (Gast)


Lesenswert?

Hallo!

Kann mir da niemand helfen!
Bin jetzt total ratlos.

von frank (Gast)


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.

von Atlan (Gast)


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

von Sometimes (Gast)


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

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.