Aufbau: CAN Controller an LPT angeschlossen Betriebssystem: Win2000 Ok so wie es aussieht funktioniert die CAN Initialisierung. Jetzt bin ich gerade dabei eine Botschaft auf den CAN Bus zu senden. Das habe ich bis jetzt nicht zum laufen gebracht. Das Programm bleibt bei "warten bis Sendung ausgelöst" stehen. Es kann auch sein das die Initialisierung doch nicht richtig ist. Wie gesagt den SJA1000 habe ich zusammen mit einem ATMEL Controller am laufen. Klappt wunderbar. /*----CAN Botschaft senden------------------------------------------------*/ void TForm1::canmessage_write(struct message *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 }
Ich habe nochmals meine Schaltung sowie das Programm überprüft. Ich konnte keine Fehler feststellen. Das programm verlässt die wihle Schleife nicht. while (((canreg_read(2))&0x08)==0); //warten bis Sendung fertig
Hallo Joe, hast du einen anderen Teilnehmer am Can-Bus hängen. Wenn ich mich recht erinnere, benötigt der sja1000 von irgend einem anderen Teilnehmer ein Acknowledge um eine Nachricht als "efolgreich" gesendet zu interpretieren. Wenn er dieses nicht bekommt, bleibt dein Programm natürlich in der while-Schleife hängen. Im Datenblatt steht auch: (Bit 2 des Canreg 0) 0 normal; an acknowledge is required for successful transmission Gruß Volker
Hallo Volker am CAN Bus hängt noch ein anderer Teilnehmer drann. Hast du eine Application SJA1000 an LPT Port aufgebaut? Wenn ja, wie sieht dein Programm unter Windows aus?
Hallo Joe, nein habe vor etwa 2 Jahren nur ein Can-Netzerk aus 20 Teilnehmern mit 8051 Derivat gebaut. Aber geh doch zum Testen folgendermaßen vor: Wenn du nicht sicher bist, ob deine Initialisierung richtig ist, lese einfach alle Can-Register wieder aus und vergleiche mit dem Registerinhalt der funktionierenden Avr-Schaltung. Bist du dir sicher, daß die canreg_read Funktion auch wirklich den Registerinhalt ausliest? Wie sehen die 8 Bit des Can-Registers 2 aus (ohne Maskierung mit 0x08)? Einfach mal in der while-Schleife irgendwo sichtbar machen. Vielleicht kann man daraus etwas folgern. Gruß Volker
Hallo! Im Anhang habe ich mal die beiden Funktionen canreg_read und canreg_write zur Verfügung gestellt. Ich benutze Borland Builder C++ 5.0
Servus Joe, hatte auch ein prob mit dem sja dass er nicht gesendet hat. Machst du bevor du die Initialisierungsroutine ablaufen lässt einen hardwaremäßigen Reset über den RST pin ? falls nein - dann ist das der Grund - wenn das nicht gemacht wird kann die gesamte Initialisierung korrekt sein, aber der Chip sendet und empfängt nicht... grüßle
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.