SJA1000 senden keine Nachricht

Gast #137734
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

}
Gast
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
Gast
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
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.