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..)
... 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 :)