Forum: Mikrocontroller und Digitale Elektronik CAN mit Starterkits M16C29 von Renesas


von Dennis (Gast)


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?

von Otto (Gast)


Lesenswert?

Du brauchst ein Board das sendet und eines das empfängt....

Otto

von Dennis (Gast)


Lesenswert?

Dadurch das diese Starterkits mit einem CAN-Transceiver ausgestattet 
sind sollte ich doch empfangen und senden können?

von MaWo80 (Gast)


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

von Dennis (Gast)


Lesenswert?

Leider nein, das wäre natürlich ein gutes Hilfsmittel.
Ist es möglich an deine Studienunterlagen ran zu kommen? Skript etc?

von MaWo80 (Gast)


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 ?

von Otto (Gast)


Lesenswert?

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

wenn bei beiden Board die "TX-Error-LED" leuchtet, erhalten diese kein 
ACK auf die gesendeten Botschaften.

Otto

von Dennis (Gast)


Angehängte Dateien:

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

von Herr Gast (Gast)


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.

von NurEinGast (Gast)


Lesenswert?

Abschlusswiderstand ?

von Dennis (Gast)


Lesenswert?

Hab eine Drahtbrücke in J10 gesetzt, laut Plan sollte damit der 120ohm 
Wiederstand aktiv sein.

von Dennis (Gast)


Lesenswert?

Beide Boards sind jeweils an einen Rechner angeschlossen und werden 
somit seperat mit einem E8a Emulator geflasht.

von Martin (Gast)


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.

von Martin (Gast)


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.

von Dennis (Gast)


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.

von Martin (Gast)


Lesenswert?

> Hat jemand eventuell einen einfachen funktionierenden Beispiecode?

Renesas Application notes.

von Dennis (Gast)


Angehängte Dateien:

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(;;);
}

von Dennis (Gast)


Lesenswert?

Problem gelöst. Bei mir in meinem Board war eine Leitung unterbrochen.
Habe diese überbrückt -> CAN Bus - läuft :-)

Vielen Dank für die Infos

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.