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 auslsen 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*/ } /*------------------------------------------------------------------*/
was meinst du mit "schuss ins blaue"? Ich tue ja nicht auf beiden Seiten gleichzeitig senden. Kann ich das Verbindungskabel mit 60 Ohm abschliesen?
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.
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?
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
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); }
Da mein Kabel nicht so lange ist, habe ich auf der einen Seite zwischen CAN LOW und CAN HIGH einen 60Ohm Widerstand eingelötet.
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);
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.