www.beck-ipc.com
www.beck-ipc.comwww.beck-ipc.com  | ImprintImprint
FAQFAQ  | SearchSearch  |
  |LoginLogin

SJA1000 an SC13/DK50

Questions and discussions about IPC@CHIP® hardware addons (e.g. FK61-WL01)

SJA1000 an SC13/DK50

Postby Thomas Wiesner » 05.12.2007, 23:34

Hallo,

ich habe Probleme beim Anschluss des SJA1000 an den SC13. Meine Schaltung entspricht der des CAN-Beispiels auf der Homepage, allerdings verbunden über den Sockel SL3 (AD0...AD7, ALE, RD, WR, PCS5). Verwendet wird der INT4. Der Jumper an COM (INT4) ist entfernt.

Der SJA1000 kann beschrieben und ausgelesen werden wie im DataSheet und dem entsprechenden AN97076 beschrieben.

Allerdings bekomme ich den Local Self Test nicht hin. Anbei mein Source-Code.

Die Initalisierung des SJA1000 auf PeliCAN ist vorher mit dem Init-Beispiels der AN97076 erfolgt (INT4, Receive_Int_Enabled).

Code: Select all

   outportb ( CONTROL_REG, RES );

   outportb ( CONTROL_REG, SELF_TEST_MODE );

   NodeID = 0x1;
   NodeID = NodeID << 5;

   DLC = 4;
   DLC = DLC & 0x0f;

   sbuffer[0] = DLC;
   sbuffer[1] = NodeID / 256;
   sbuffer[2] = NodeID & 0xff;
   sbuffer[3] = 0;
   sbuffer[4] = 2;
   sbuffer[5] = 4;
   sbuffer[6] = 6;

   for (i=0; i<=DLC+2; i++) outportb (TX_BUFFER+i, sbuffer[i]);

   outportb ( COMMAND_REG, SELF_RECEPTION );

   for (i=0; i<20; i++) rbuffer[i] = inportb(RX_BUFFER+i);

   NodeID = rbuffer[1] * 256 + rbuffer[2];
   NodeID = NodeID >> 5;

   printf ("\n\nReceived: NodeID:%04x", NodeID);

   DLC = rbuffer[0] & 0x0f;
   printf ("  RTR:%02x", rbuffer[0] & 0x40);
   printf ("  DLC:%02x", DLC);

   printf ("  data: ");
   for (i = 3; i <= DLC+2; i++) printf (" %02x", rbuffer[i]);

   outportb ( CONTROL_REG, RES );

   outportb ( CONTROL_REG, 0 );



Hat jemand eine Idee?
CU,

Thomas

Nachtrag

Postby Thomas Wiesner » 06.12.2007, 22:56

Hallo,

das Self-Test-Problem habe ich über eine (merkwürdige) Lösung behoben, auch wenn ich über die Lösung (keine Optostrecke) nicht gerade glücklich bin.

Zunächst habe ich ein WaitForInterrupt RX nach dem Request eingefügt. Das alleine hatte aber noch keine Wirkung.

Danach habe ich die Optokoppler ausgebaut, die Massen gebrückt sowie jeweils Pin 3 und Pin 6 in den Opto-Fassung verbunden und siehe da, der Self-Test funktioniert.

Also Optos wieder rein ... ohne Ergebnis.

Auf den Datenblättern des 82C250 ist die Optoverbindung für den SJA1000 über 6N137-Optos gezeigt. Diese Optos haben vergleichbare Charaktristiken und das gleiche Pinout wie der 6N135, lediglich die Bandbreite liegt bei 10 MHz anstatt 2 MHz bei den 6N135.

Die Widerstände habe ich wie im Datenblatt des 82C250 alle auf 390 Ohm angepasst.

Dennoch, kein Self-Test möglich. Leider habe ich keinen zweiten CAN-Controller um zu prüfen, ob überhaupt eine Kommunikation über die Optos funktioniert.

Hat jemand ähnliche Erfahrungen mit der Opto-Schaltung? Oder hat jemand eine andere Lösung/Schaltung für optische Trennung?

Anhang:
Code: Select all

unsigned char localselftest(void)
{
   unsigned long timeout = 0;
   unsigned char txrxcomp = 0;
   unsigned char i;
   unsigned char testbuffer[7] ={0x04,0x00,0x20,0x00,0x02,0x04,0x06};

   // SJA1000 in den Self_Test_Modus versetzen

   outportb ( CONTROL_REG, RES );
   outportb ( CONTROL_REG, SELF_TEST_MODE );

   printf ("\n\nSelf-Test-Modus...");

   // Testmessage an TX_BUFFER übergeben

   for (i=0; i<=6; i++) outportb ( TX_BUFFER+i, testbuffer[i] );

   // SELF_RECEPTION anfordern

   outportb ( COMMAND_REG, SELF_RECEPTION );

   printf ("\n\nSelf Test gestartet.");

   // Auf RECEIVE-Interrupt warten

   while (int_msg != 1)
   { timeout++;
     if (timeout > 65000) break;
   };

   // SJA in den WARTE-MODUS versetzen

   outportb ( CONTROL_REG, RES );
   outportb ( CONTROL_REG, 0 );

   if (int_msg==1)
   {   printf ("\n\nRX-Interrupt empfangen.");
      int_msg=0;
   }
   else
   {  printf ("\n\nTimeOut. Self Test wird abgebrochen.\n\n");
      int_msg=0;
        return (0);
   }

   // Vergleich gesendeter und empfangener Daten

   for (i = 0; i <= 6; i++)
   { if (rbuffer[i]!=testbuffer[i])
     { txrxcomp=1;
       break;
     }
   }

   if (txrxcomp==1)
   {   printf("\n\nSelf Test fehlgeschlagen. SJA1000 und Interface prüfen.\n\n");
      return (0);
   }
   else
   {  printf("\n\nSelf Test erfolgreich.\n\n");
      return (1);
   }
}
CU,

Thomas

Return to Hardware Addons


Who is online

Users browsing this forum: No registered users and 0 guests


cron