Forum: Mikrocontroller und Digitale Elektronik SJA1000 senden keine Nachricht


von Joe (Gast)


Lesenswert?

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

}

von Joe (Gast)


Lesenswert?

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

von Volker (Gast)


Lesenswert?

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

von Joe (Gast)


Lesenswert?

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?

von Volker (Gast)


Lesenswert?

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

von Joe (Gast)


Angehängte Dateien:

Lesenswert?

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

von Atlan (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.