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?
Du brauchst ein Board das sendet und eines das empfängt.... Otto
Dadurch das diese Starterkits mit einem CAN-Transceiver ausgestattet sind sollte ich doch empfangen und senden können?
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
Leider nein, das wäre natürlich ein gutes Hilfsmittel. Ist es möglich an deine Studienunterlagen ran zu kommen? Skript etc?
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 ?
> 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
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
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.
Hab eine Drahtbrücke in J10 gesetzt, laut Plan sollte damit der 120ohm Wiederstand aktiv sein.
Beide Boards sind jeweils an einen Rechner angeschlossen und werden somit seperat mit einem E8a Emulator geflasht.
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.
>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.
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.
> Hat jemand eventuell einen einfachen funktionierenden Beispiecode?
Renesas Application notes.
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(;;); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.