CAN mit Starterkits M16C29 von Renesas

Gast #995912
Lesenswert?

Hallo,

kennt sich jemand mit dem Starterkit M16C29 von Renesas aus?
Es geht darum, ich habe zwei Starterkits und möchte beide über die CAN 
Schnittstelle miteinander verbinden, um die CAN Schnittstelle zu testen.

Dazu habe ich eine 3Polige Steckerleiste, jeweils an den J11 - Anschluss 
gelötet.

Dann beide Boards über ein Starterkabel miteinander verbunden.

Mit der Software HEW (High Performed Embedded Workshop) habe ich das 
mitgelieferte CAN-Beispiel auf beide Boards übertragen.

Das Programm sollte den Text "Renesas" über den CAN Bus senden.

Jedoch leuchtet immer die LED für einen Transmitt-Error.

Kennst sich jemand damit aus? Oder hat jemand einen kleinen Beispielcode 
für mich um die CAN Schnittstelle zu testen?
Gast #996308
Lesenswert?

Das sollte so sein, ja, ich hatte im Studium mit diesen Boards zu tun um 
Can Messages zu verschicken.
Ich habe leider meine Unterlagen vom Studium nicht mehr griffbereit, 
sonst würde ich sie dir senden.
Hast du einen CanAlyser zur Verfügung?

Gruß Martin
Gast #996322
Lesenswert?

Leider so schnell nicht, wohne wegen Berufsstart nicht mehr zu Hause und 
die Unterlagen liegen dort auf meinem PC !!
Wie sieht den das Skript aus das du hochgeladen hast ??
Welche Einstellungen mußtest du den vornehmen ?
Gast #996375
Lesenswert?

Anbei ist nun das BeispielSkript.

Ich glaube mein Fehler muss irgendwie auch an den Einstellungen liegen.

Zum Beispiel weiss ich nicht ob ich an beiden Boards jeweils den 
gleichen Port als Transmit / Receive belegen muss (Siehe Datei can.h) 
und ebenfalls weiss ich nicht wie ich die ID´s zu belegen habe.

Ich bin an dem Problem angekommen, dass das 1.Board sendet und auf 
Empfang wartet. Das 2te Board jedoch nicht senden kann, da das 
CAN0Status-Register (c0str) einen BusError anzeigt. Dieser wurde 
ausgelöst durch das setzen des Flags TrmReq im 
CAN0MessageControl-Register (comctl6).
Meine Einstellungen beider Boards sind wie folgt:
1. Board
Slot 0 - Transmit => Vaiable: C0Slot00_STATE
ID - 0x0000000L => Variable: C0Slot0Id
Slot 6 - Receive => Vaiable: C0Slot06_STATE
ID - 0x0000000L => Variable: C0Slot6Id

1. Board
Slot 1 - Transmit => Vaiable: C0Slot01_STATE
ID - 0x0000001L => Variable: C0Slot1Id
Slot 7 - Receive => Vaiable: C0Slot07_STATE
ID - 0x0000001L => Variable: C0Slot7Id
Angehängte Dateien:
Gast #996376
Lesenswert?

Wie betreibst du die Boards?
Eins am Debugger und das andere geflasht?
Vieleicht ist dein Empfänger nicht richtig geflasht und kann deshalb 
kein ACK senden. Nach ein paar hundert Versuchen den Frame zu senden 
gibt es ein timeout und die LED leuchtet auf.
Gast #996419
Lesenswert?

Hallo,

ersteinmal meine Projekte, die sich auch mit M16C/R8C und CAN-Bus 
beschäftigen:
http://martinsuniverse.de/projekte/audiohplayer/audiohplayer.html
http://martinsuniverse.de/projekte/caninterceptor/caninterceptor.html

Du must nicht den gleichen Slot in beiden CAN Controllern verwenden. Je 
nach Filter musst du nur die gleiche ID einstellen.
Zum Testen suchst du dir eine ID aus und sendest sie. Im anderen 
CAN-Controller setzt du einen Slot auf Empfang und die Maske setzt du 
so, dass alle IDs empfangen werden. Versuche ersteinmal nur eine 
Nachrich zu verschicken.
Gast #996441
Lesenswert?

>1. Board
>Slot 0 - Transmit => Vaiable: C0Slot00_STATE
>ID - 0x0000000L => Variable: C0Slot0Id
>Slot 6 - Receive => Vaiable: C0Slot06_STATE
>ID - 0x0000000L => Variable: C0Slot6Id

>1. Board
>Slot 1 - Transmit => Vaiable: C0Slot01_STATE
>ID - 0x0000001L => Variable: C0Slot1Id
>Slot 7 - Receive => Vaiable: C0Slot07_STATE
>ID - 0x0000001L => Variable: C0Slot7Id

Die IDs unterscheiden sich auf beiden Boards.
Gast #996551
Lesenswert?

Selbst wenn ich beide ID`s gleichsetze bekomme ich den Fehler.

Hat jemand eventuell einen einfachen funktionierenden Beispiecode?
Ich denke da so an:
1.Code für das Sendeboard:
Der einen Text über die CAN Schnittstelle raussendet.
2. Code für das Empfängerboard:
Welches den Text über die CAN Schnittstelle empfängt.
Gast #1000731
Lesenswert?

Das Beispiel in den Application Notes finde ich für den Einstig und das 
Verstehen von CAN - Bussen noch zu komplex.
Das von mir angehangene CAN-Beispiel (can.zip) ist eigentlich recht 
einfach gehalten und wird schließlich auch von Renesas in den 
Starterkits mitgeliefert.

Es funktioniert wie folgt:
- Es sendet den Text "Renesas" und sollte den Empfang davon auf dem 
anderen Board ermöglichen.
- Der verwendete CAN-Modi ist der Polling-Mode

Nun habe ich das Problem, dass mein Board immer in den 
Transmission-Error läuft und zwar genauer in den PassiveState-Error.
In der Funktion: SendCAN0Message(0);
wird beim Setzen des Bits: c0mctl0.transmit.trmreq = 1;
gleichzeitig ein Busstate-Error Flag gesetzt und ich weiss nicht warum. 
Kann mir da jemand weiterhelfen?

Zur Hardware beide Boards sind über ein dreipoliges Kabel miteinander 
verbunden und die Brücke für den 120ohm Widerstand ist jeweils auch 
vorhanden.


Hier ein Ausschnitt des Programms die Main-Funktion:
void main(void)
{
  int iStatus = NO_ERROR;
  unsigned char TxDataBuff[8] = {"RENESAS"};
  unsigned char RxDataBuff[8];

  /* Turn LEDs 0-3 OFF */
  LED_PORT_DR = LEDS_OFF;

  /* Initialize CAN */
  InitCAN0();

  /* Send continous message & receive messages */
  while(1)
  {
    do
    {
      /* Setup write message for Slot / Message Box-0*/
      WriteCAN0Message(0, 8, TxDataBuff);

      /* Start message transmission */
      SendCAN0Message(0);

      /* Check for errors */
      iStatus = Check_err_can01();

      if(NO_ERROR != iStatus )
      {
        /* Orange LED ON*/
        LED_PORT_DR = 0xD0;
        continue; /* Try again */
      }

      /* Poll message at Slot / Message Box-6*/
      iStatus = PollCAN0Message(6);

      if(NO_ERROR != iStatus )
      {
        /* Red LED ON*/
        LED_PORT_DR = 0x70;
        continue; /* Try again */
      }

      if(NO_ERROR == iStatus )
      {
        /* Read message at Slot / Message Box-6*/
        iStatus = ReadCAN0Message(6, RxDataBuff);
        if( 0 != strcmp(TxDataBuff, RxDataBuff) )
        {
          /* Red LED ON*/
          LED_PORT_DR = 0x70;
          continue; /* Try again */
        }
      }

    } while(NO_ERROR != iStatus);

    /* Green LED ON*/
    LED_PORT_DR = 0xE0;

  }

/* End of the user program. This function must not exit. */
  for(;;);
}
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren