Probleme mit CAN Verbindung!

Gast #160005
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*/

 }

/*------------------------------------------------------------------*/
Gast #160008
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.
Gast #160009
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?
Gast #160011
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
Gast #160012
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);
}
Gast #160014
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);
Gast #160016
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.
Gast #160018
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

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