Hallo, ich habe vor mit einem AT90CAN (AVR-CAN von Olimex) sechs externe CAN-Controller (MCP2515)über SPI zu steuern. Meine Frage ist ob das geht, und welche zusätzlichen Bauteile ich hierfür speziell noch dazu kaufen müsste.
das geht nur bei geringer bus-last, da die dinger keinen fifo/queue besitzen (nur 3 rx/tx) messages. wenn du wirklich 6+1 can bus brauchst und mit entsprechendes bus-last als can-gateway verwenden willst solltest du dich in die richtung cortex-m3 orientieren... der hat dann auch genug power und mehr als 1spi interface.. selber verwende ich für sowas pro can-bus jeweils 1nen cortex m0 als can-controller (der kann dann auch puffern..)
Könntest du mir vielleicht auch gleich ein geeigenetes Board dazu empfehlen?? Vielen Dank für die schnelle Antwort.
... oder zumindest SJA1000, die Du ans External Memory Interface über PORTA, PORTC und PORTG anschließt. Die SJA1000-Register liegen dann direkt im Adressraum des AVR, d.h. Du sparst Dir den SPI-Overhead. fchk
Zb lpc.xpresso ... Allerdings solltest du wenn schon ein Board selberbauen. SJA1000 wären auch eine Alternative bei geringer buslast. Was erwartest du denn an Daten und was willst du machen ? Klingt nach nem Uni Projekt ohne das erforderliche hintergrundwissen..
Ich würde die Alternative mit dem SJA1000 vorziehen.... Was für ein AVR würde denn für die Ansteuerung für sechs SJA1000-CAN-Controller genügen? Also was für Eigenschaften sollte der Mikrocontroller haben? Und wie müsste ich die SJA1000-Controller an den MCU anschließen?
erzähl uns doch erstmal was du genau vorhast...evtl reicht ein AVR für sowas bei weitem nicht aus... wenn du dir das datenblatt des SJA1000 anschaust wirst du sehen dass das ding über einen parallelen datenbus an den controller angebunden wird (wie schon erwähnt, Stichwort ExternalMemory)
Also ich möchte einen kleinen Restbussimulator bauen. Mein Board soll sechs CAN-Teilnehmer haben, die fürs erste nichts anderes als ACK-Messages verschicken sollen. Im Weiteren möchte ich dann weitere Fehler-Messages verschicken können.
ee_ schrieb: > Ich würde die Alternative mit dem SJA1000 vorziehen.... > > Was für ein AVR würde denn für die Ansteuerung für sechs > SJA1000-CAN-Controller genügen? Also was für Eigenschaften sollte der > Mikrocontroller haben? Er muss einen 8051-kompatiblen externen Memory Bus haben. Rein theoretisch könntest Du das auch per Port IO machen, aber das wird viel zu langsam. Das haben die Mega64/128/640/641/1280/1281/2560/2561 sowie die alten Mega162 und Mega8515. Wenn DU AVR nehmen willst, dann einen der modern Typen Mega 64x/128x/256x > Und wie müsste ich die SJA1000-Controller an den MCU anschließen? Hier wirds mit einem SJA1000 gemacht: http://www.kreatives-chaos.com/images/175.png Bei mehreren SJA1000 nimmst Du Dir ein paar der oberen Adressleitungen von Port C und einen 74HC138. Vorschlag: HC138 (Pin) -> AVR A0(1) ->A8/PortC0 A1(2) ->A9/PortC1 A2(3) ->A10/PortC2 !E1(4)->A15/PortC7 !E2(5)->A14/PortC6 E3(6) ->A13/PortC5 !Y0(15) -> !CS vom 1. SJA !Y1(14) -> !CS vom 2. SJA ... !Y6(9) -> !CS vom 7. SJA !Y7(7) -> !CS vom 8. SJA Die SJAs sind dann unter der Adresse 001x xnnn rrrr rrrr ansprechbar, d.h. 1. SJA: 0x2000-0x20ff 2. SJA: 0x2100-0x21ff .... 8. SJA: 0x2700-0x27ff In die oberen 32k des Adressraums kannst Du noch ein externes 32k SRAM einblenden, falls Dir der interne Speicher nicht reicht. Zum Interrupt: Es gibt zwei Möglichkeiten. Entweder bedienen alle SJA eine gemeinsame Interrupt-Leitung - dann muss die Interrupt-Routine nachschauen, wer den Interrupt ausgelöst hat. Oder Du nutzt die Pin-Change Interrupts der modernen AVRs (die alten Mega64/128/90CANxx und die noch älteren 162/8515 haben das nicht) und klemmst jeden SJA auf einen eigenen Interrupt Pin. fchk
Den HC138 kann man sparen, man nimmt einfach A8..A13 direkt als /CS. Der AT90CAN128 hat 9 Interrupteingänge, sollte also reichen. Und die 16MHz für die SJA kann man bequem von Pin 42 abgreifen, den man als CLKO fused.
Vielen Dank für die schnellen und sehr hilfreichen Antworten. Echt tolles Forum!!! Ich werde nun erstmal die notwendige Hardware kaufen und das Board bauen. Ich werde darüber berichten und gegebenenfalls noch mal auf eure Hilfe zurückgreifen ;) Nochmals vielen Dank ee_
Hallo, ee_ schrieb: > Also ich möchte einen kleinen Restbussimulator bauen. Mein Board soll > sechs CAN-Teilnehmer haben, die fürs erste nichts anderes als > ACK-Messages verschicken sollen. Im Weiteren möchte ich dann weitere > Fehler-Messages verschicken können. Soll nur ein Bus simuliert werden und nur "logische" Ack und Errors? Dann würde auch ein CAN-Controller reichen, der die entsprechenden Nachrichten sendet. Wenn jedoch die physikalischen Ack und Errors (Collision,...) getestet werden sollen, muss die Buslast sehr hoch ausfallen. Da Du dann je nachdem bis zur 6-fachen Buslast mit dem MC bearbeiten musst (ausser die Controller filtern die jeweiligen anderen Nachrichten aus, so dass sie nicht abgerufen werden müssen), könnte ein AVR recht knapp werden. Speziell wenn er neben der Simulation auch noch die Auswertung (Auslesen von Fehler-Registern, Kommunikation der Ergebnisse etc.) durchführen soll. Schöne Grüße, Martin
maveric00 schrieb: > Wenn jedoch die physikalischen Ack und Errors > (Collision,...) getestet werden sollen, muss die Buslast sehr hoch > ausfallen. Nö, das hat mit der Buslast nichts zu tun. Der CAN verträgt 100% Buslast ohne Murren, genau dafür ist er nämlich ausgelegt (Carrier Sense Multiple Access / Collision Resolution). Alle Sender reihen sich automatisch mit ihrer ID ein, die niedrigste sendet zuerst. Störungen kannst Du nur mit einem speziellen Störgenerator erzeugen, die CAN-Controller können nur gültige Pakete senden.
Peter Dannegger schrieb: > Störungen kannst Du nur mit einem speziellen Störgenerator erzeugen, die > CAN-Controller können nur gültige Pakete senden. bei hoher buslast und 2 teilnehmern die die gleichen Message-IDs senden kommt es zuverlässig zu kollisionen...
Andi D. schrieb: > 2 teilnehmern die die gleichen Message-IDs senden Dann ist Dein Konzept falsch. Bei CAN dürfen nicht 2 Sender die gleiche ID benutzen. Wenn Du es machst, dannn laufen bei beiden die Errorcounter über und sie verabschieden sich vom Bus. Das brauchst Du also nicht erst ausprobieren. Es ist auch unabhängig von der Buslast. Nur die Häufigkeit ändert sich. Bei geringer Last passiert es eben seltener.
Also ich habe mich für den ATxMEGA128A3U entschieden, an denen ich sechs SJA's anschließen möchte. Leider habe ich noch immer noch nicht ganz verstanden, wie ich die SJA's an den MCU anbringen soll. Frank K. schrieb: > Bei mehreren SJA1000 nimmst Du Dir ein paar der oberen Adressleitungen > von Port C und einen 74HC138. > Vorschlag: > HC138 (Pin) -> AVR > A0(1) ->A8/PortC0 > A1(2) ->A9/PortC1 > A2(3) ->A10/PortC2 > !E1(4)->A15/PortC7 > !E2(5)->A14/PortC6 > E3(6) ->A13/PortC5 > > !Y0(15) -> !CS vom 1. SJA > !Y1(14) -> !CS vom 2. SJA > ... > !Y6(9) -> !CS vom 7. SJA > !Y7(7) -> !CS vom 8. SJA Damit habe ich ja nur die !CS-Pins der SJA's angeschlossen, die ich laut Peter Danneggerja auch direkt anschließen könnte. Jedes der SJA's besitzt ja auch noch 8 Daten-Pins (A0...A7), einen RD-Pin, einen WR-Pin und einen CS-Pin. Dafür würden die Pins des MCU ja nicht ausreichen??? Ich weiß leider nicht wie ich das anstellen soll und bitte um Hilfe.
Mit den Xmega kenne ich mich nicht aus. Die standard AVRs (z.B. AT90CAN128) haben jedenfalls alle benötigten Signale /RD, /WR, ALE und AD0..AD7 für die SJA1000. Und sie brauchen auch keine Pegelwandler 3,3V<->5V.
Peter Dannegger schrieb: > Dann ist Dein Konzept falsch. Bei CAN dürfen nicht 2 Sender die gleiche > ID benutzen. Korrekt, wenn alles so läuft wie es soll. > Wenn Du es machst, dannn laufen bei beiden die Errorcounter über und sie > verabschieden sich vom Bus. Das brauchst Du also nicht erst ausprobieren. Ebenfalls korrekt, wenn alles läuft wie es soll. Stellt sich somit die Frage: Was möchte der TO eigentlich ausprobieren, wenn er mit dem Aufbau nicht das Verhalten bei Fehlern testen möchte? Wenn er 6/7 Busse haben möchte (was ich aus den bisherigen Antworten nicht herauslesen kann), dann sind 6/7 zusätzliche Controller notwendig. Wenn er nur einen funktionierenden "Restbus" mit 6 Teilnehmern simulieren möchte, dann würde ich maximal zwei zusätzliche Controller verwenden (zwei, um auch die ganz hohen Buslasten oder auch 'mal identische IDs zu simulieren). Die lassen sich einfacher Verwalten, sind billiger und einfacher anzuschließen als sechs - können aber genau das gleiche. Die Situation, dass ein MC sich sowohl um das Senden als auch um das Empfangen der gleichen Botschaft kümmern muss, ändert sich jedenfalls auch nicht. Bei zwei Controllern würde ich allerdings eventuell doch wieder eher die MCP2515 nehmen, da diese 2 (mit einer 2-Message-Fifo) und zusätzliche 4 (ohne Fifo) Acceptance-Filter haben, während der SJA1000 nur eines hat (bei Extended ID). Damit würden nicht beide Controller alle Nachrichten abarbeiten müssen, sondern man könnte entsprechende Zuordnungen tätigen. Eine Anbindung an eine Hardware-SPI mit entsprechend schneller Bearbeitung hereinkommender Nachrichten (ggf. Interrupt-getriggert) ist dann allerdings Pflicht, um nicht langsamer als der CAN zu werden. Der Sinn von sechs zusätzlichen Controllern erschließt sich mir jedenfalls noch nicht. Schöne Grüße, Martin
ee_ schrieb: > Also ich habe mich für den ATxMEGA128A3U entschieden, an denen ich sechs > SJA's anschließen möchte. Das ist ein 3.3V Chip. Die Atmegas laufen mit 5V, genauso wie die SJA1000. Schau im Datenblatt nach, ob Dein Chip einen externen Adress/Datenbus hat und ob er 5V-Signale abkann. Sonst hast Du einen Einweg-Leuchtprozessor. > Leider habe ich noch immer noch nicht ganz verstanden, wie ich die SJA's > an den MCU anbringen soll. > > Frank K. schrieb: >> Bei mehreren SJA1000 nimmst Du Dir ein paar der oberen Adressleitungen >> von Port C und einen 74HC138. >> Vorschlag: >> HC138 (Pin) -> AVR >> A0(1) ->A8/PortC0 >> A1(2) ->A9/PortC1 >> A2(3) ->A10/PortC2 >> !E1(4)->A15/PortC7 >> !E2(5)->A14/PortC6 >> E3(6) ->A13/PortC5 >> >> !Y0(15) -> !CS vom 1. SJA >> !Y1(14) -> !CS vom 2. SJA >> ... >> !Y6(9) -> !CS vom 7. SJA >> !Y7(7) -> !CS vom 8. SJA > > Damit habe ich ja nur die !CS-Pins der SJA's angeschlossen, die ich laut > Peter Danneggerja auch direkt anschließen könnte. > > Jedes der SJA's besitzt ja auch noch 8 Daten-Pins (A0...A7), einen > RD-Pin, einen WR-Pin und einen CS-Pin. Dafür würden die Pins des MCU ja > nicht ausreichen??? Die gehen an alle SJA parallel. Die !CS-Pins wählen den jeweils aktiven SJA aus.
Die ATxMega sind wohl nicht sehr geeignet wegen den 3,3V. Ich werde nun einen ATmega324P nehmen, außer jemand meint, dass der aus irgendeinem Grund nicht für mein Vorhaben geeignet ist.
ee_ schrieb: > Die ATxMega sind wohl nicht sehr geeignet wegen den 3,3V. > > Ich werde nun einen ATmega324P nehmen, außer jemand meint, dass der aus > irgendeinem Grund nicht für mein Vorhaben geeignet ist. Der hat kein External Memory Interface, und das brauchst Du zwingend, damit die Zugriffe einigermaßen schnell ablaufen. Aus einem meiner früheren Postings: ---- > Was für ein AVR würde denn für die Ansteuerung für sechs > SJA1000-CAN-Controller genügen? Also was für Eigenschaften sollte der > Mikrocontroller haben? Er muss einen 8051-kompatiblen externen Memory Bus haben. Rein theoretisch könntest Du das auch per Port IO machen, aber das wird viel zu langsam. Das haben die Mega64/128/640/641/1280/1281/2560/2561 sowie die alten Mega162 und Mega8515. Wenn DU AVR nehmen willst, dann einen der modern Typen Mega 64x/128x/256x ---- Meine Empfehlung: Atmega 1281. Ist einer der neueren Megas. Wenn Du unbedingt einen DIL-Baustein brauchst, muss es der Mega 162 sein. Der hat auch ein External Memory Interface, aber nur 1k RAM. Da empfehle ich, gleich ein 32k SRAM zusätzlich extern anzuschließen. fchk
Frank K. schrieb: > Er muss einen 8051-kompatiblen externen Memory Bus haben. ... > Das haben die Mega64/128/640/641/1280/1281/2560/2561 sowie die alten > Mega162 und Mega8515. Und die AT90CAN32/64/128. ee_ schrieb: > ich habe vor mit einem AT90CAN (AVR-CAN von Olimex) sechs externe > CAN-Controller ... zu steuern. Paßt also super.
So, und wenn es aus Performance-Gründen einen XMega sein soll (was ich nachvollziehen kann), dann brauchst Du einen ATxmega192/256A1. Der hat im Gegensatz zu Deinem A3 ein External Bus Interface. Als Pegelwandler für den gemultiplexten Adress-Daten-Bus nimmst Du einen 74LVCC3245, für die Steuerleitungen 74HCTxxx-Baustein(e). Dann geht das auch. Ansonsten schaust Du mir so aus, als wüsstest Du nicht, was Du da tust. Vielleicht mal ein Grundlagenbuch lesen? Gestapeltes und gebundenes Papier - Du weißt schon. Soll in ähnlichen Fällen schon geholfen haben. fchk
Vielen Dank!! Frank K. schrieb: > Ansonsten schaust Du mir so aus, als wüsstest Du nicht, was Du da tust. > Vielleicht mal ein Grundlagenbuch lesen? Gestapeltes und gebundenes > Papier - Du weißt schon. Soll in ähnlichen Fällen schon geholfen haben. ich bin dabei :)
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.