Moin Moin libe CAN Freaks,
Ich möchte einen CAN-Router/Bridge mit 250kBaud bauen. Die Datenmenge
ist im normalbetrieb relativ gering. Es werden nur simple Requests
verschickt. Das ganze ist für eine Modelleisenbahnsteuerung. Ausnahme
bildet ein software Updatevorgang der jedoch auch nur an ein Bus gehen
soll.
Der Interne CAN-Bus vom AT90CAN soll an das Steuergerät, an den vier
Bussen sind dann maximal zwei Endgeräte ( Hardware bedingt wegen
interner nicht abschaltbarer Endwiderstände ).
Die Frage ist nun ob vier MCP2515 via SPI ausreichen oder ob ich doch
vier SJA1000 benötige. Die Problematik ist für mich eher das Handling
mit SMD und relativ kompliziertem Layout von vier SJA1000. Die Dinger
gibts auch als DIL28 ( wenn auch schwieriger zu bekommen ). Die MCP2515
sind da viel einfacher anzuschließen.
Ein testaufbau mit zwei MCP2515 und einem ATMEAG88 lief soweit
problemlos nachdem ich die canlib auf interrupt betrieb umgestellt habe.
Der AT90CAN hat ja soo hübsch massig externe interrupts :-)
Ich wäre begeistert über ein paar tipps
So schlimm ist das Layout nicht, die SJA1000 hängen ja alle parallel am
Memorybus (11 Leitungen).
Dafür kannst Du sie direkt als MMIO ansprechen, also über Pointer.
Beim MCP2515 muß alles erstmal über den Flaschenhals SPI gehen. Und der
AT90CAN128 hat noch nicht mal die modernen UARTs als gepuffertes SPI.
Bei 4 Bussen würde ich nicht mehr über SPI gehen, der SJA1000 ist da die
bessere Wahl.
Wenn Du SMD vermeiden willst und 16k Flash reichen, dann nimm doch einen
Mega162, 5 SJA1000 und ggf ein externes 32k RAM, wenn Du das brauchst.
Das gibts alles als DIL, und der Mega162 hat auch einen externen Memory
Bus.
Schau hier, da wird das mit einem SJA1000 gemacht. Du musst nur noch
einen HC138 hinzufügen, um weiteres Adressleitungen auszudekodieren.
Wenn Du SMD akzeptierst, dann würde ich einen Mega1281 und 5 SJA
verwenden. Der 1281 ist die modernere Version des 128'ers und schafft
auch 20 MHz und hat 8k RAM statt 4k. Und vom Code ist es einfacher, 5
SJAs anzusteuern als 4 SJA und den internen vom 90CAN128.
Und das Layout ist so kompliziert nun nicht. Die SJA werden ja alle
parallel geschaltet, nur !CS muss jeweils getrennt ausdecodiert werden.
Dann nimmst Du einen 16 Mhz Oszillator und keinen Quarz und kannst damit
alle SJA und wahlweise auch den Prozessor damit takten. Auf dem Layout
kannst Du ohne Probleme 8 SJA vorsehen.
fchk
Hallo Frank,
10000 Dank für die schnelle Antwort.
Nun SJA1000 in SMD "busmäßig" zu routen benötigt auf jeden Fall vias.
Ich werde dann lieber für den Prototypen auf DIL setzen. Nun, das Olimex
at90CAN128 header board werde ich dann sicher auch mal nutzen :-)
Der Mega162 ist eine gute Idee!
beste Grüße
Karsten
@ Karsten K. (karsten42)
>Ich möchte einen CAN-Router/Bridge mit 250kBaud bauen. Die Datenmenge>ist im normalbetrieb relativ gering. Es werden nur simple Requests>verschickt. Das ganze ist für eine Modelleisenbahnsteuerung.
Wozu braucht man da einen CAN-Router? Warum nicht einfach alle Knoten an
einen Strang und fertig?
>Der Interne CAN-Bus vom AT90CAN soll an das Steuergerät, an den vier>Bussen sind dann maximal zwei Endgeräte ( Hardware bedingt wegen>interner nicht abschaltbarer Endwiderstände ).
Sehr sinnvoll einen CAN-Bus mit 2 Endgeräten zu betreiben, dazu noch mit
geringem Datenaufkommen.
Das sind ja dann recht alberne "Bus"geräte...
Eh ich mir 5 getrennte Bussysteme aufbauen würde, würde ich erstmal
versuchen, den Abschlusswiderständen mit nem Lötkolben zu Leibe
zurücken.
Alternativ sollte es auch Möglichkeiten die seltsamen Teile wirklich
busfähig zu machen. Oder benutzen die auch etwa gleiche feste IDs?
Moin Moin,
Ja, alberne Endgeräte: Stimmt! Und natürlich könnte ich die
Endwiderstände entfernen. Jedoch geht es um Modelleisenbahn und da kann
eben nun mal nicht jeder 0402 widerstände schadfrei auslöten. Daher
leider die einzelnen Busse.
Leider ist die steuerung der Zentrale ( und jetzt mal die Nennung der
Produkte ( MS2, GFP Gleisbox von Mär..n )nicht dafür ausgelegt mehr als
eine Gleisbox zu betreiben. Die Boxen müssen aber individuell
initialisiert und angesprochen werden. Eine Gleisbox muss auch noch als
eine Art Master fungieren um spezielle Programmiermodi (
Programmiergleis )zu betreiben.
Ähh: und bei 5 SJA1000 eine gute Idee die Interrupts des SJA mit einem
MEGA162 zu behandeln weil polling dabei ja flasch fällt ?
Gruß
Karsten
Karsten K. schrieb:> Ähh: und bei 5 SJA1000 eine gute Idee die Interrupts des SJA mit einem> MEGA162 zu behandeln weil polling dabei ja flasch fällt ?
Die IRQs sind Open Drain (Pullup nicht vergessen) und können
zusammengeschaltet werden. Wenn ein IRQ kommt, musst Du nur alle SJA
abklappern und schauen, wer der Verursacher war. Das ist eine gängige
Vorgehensweise.
fchk
Moin Frank,
die IRQ´s UND verknüpfen funst aber nur wenn der ext. INT[0] auf "level
triggered" steht. Ansonsten könnte man ja einen interrupt von einem der
SJA "verlieren" wenn man in der ISR herumgeistert.
Unklar ist mir noch der Adressraum für die SJA1000. Mit !CS selektiere
ich dann ja den entsprechenden SJA1000. Dann dürfte der Adressraum für
jeden gleich sein oder?
Zusätzlich ein externes 32Kx8 SRAM falls der interne SRAM nicht reicht
sollte eigentlich auch gehen. Ich habe noch zwei MEGA162 in der
Schublade :-)
Dann wären die Startadressen der SJA1000 bei 0x8500.
Suuupervielen Dank für deine Anregungen und Tipps!
Karsten
Karsten K. schrieb:> Unklar ist mir noch der Adressraum für die SJA1000. Mit !CS selektiere> ich dann ja den entsprechenden SJA1000. Dann dürfte der Adressraum für> jeden gleich sein oder?
nein, der muss ja unterschiedlich sein. Jeder braucht 256 Byte.
Nimm einen HC138:
A0 auf Adressleitung A8
A1 auf Adressleitung A9
A2 auf Adressleitung A10
!E1 und !E2 auf GND
E3 auf Adressleitung A15
!Y0 ... !Y7 sind die !CS-Signale für die bis zu 8 SJA.
Dann wiederholen sich die Adressen der SJA alle 2k im oberen Adressraum.
Beim SRAM hängst Du !CS an A15, dann ist es in den unteren 32k.
fchk
Hallo Frank,
Frank K. schrieb:> Dann wiederholen sich die Adressen der SJA alle 2k im oberen Adressraum.> Beim SRAM hängst Du !CS an A15, dann ist es in den unteren 32k.
Bei Decodierung von A[8-10] für !CS der SJA1000 wiederholen sich die
Adressen alle 256 byte. Aber wie GENIAL deine Lösung!
Was mach ich jetzt mit ALE. Das wird ja für das Latch verwendet und ist
doch für den SJA1000 in dieser Weise nicht notwendig. Umschaltung
zwischen Motorola und Intel mode laut Datenblatt sagt mir leider nichts.
Allerbeste Grüße
Karsten
Karsten K. schrieb:> Bei Decodierung von A[8-10] für !CS der SJA1000 wiederholen sich die> Adressen alle 256 byte. Aber wie GENIAL deine Lösung!> Was mach ich jetzt mit ALE. Das wird ja für das Latch verwendet und ist> doch für den SJA1000 in dieser Weise nicht notwendig.
Doch klar. Der muss auch wissen, wann eine Adresse und wann Daten
kommen. Kommt an ALE vom Prozessor.
> Umschaltung> zwischen Motorola und Intel mode laut Datenblatt sagt mir leider nichts.
Auf Intel stellen. Dann hast Du !RD und !WR wie beim AVR und nicht E und
R/!W wie bei 68xx und 6502
!RST von den SJA machst Du auf einen Portpin des AVR.
Die !INT der SJA auf INT0 oder INT1 des AVR legen, mit Pullup.
Der 16 MHz Oszillator fehlt auch noch, und dann ist der Teil komplett.
fchk
Karsten K. schrieb:> Bei Decodierung von A[8-10] für !CS der SJA1000 wiederholen sich die> Adressen alle 256 byte. Aber wie GENIAL deine Lösung!> Was mach ich jetzt mit ALE. Das wird ja für das Latch verwendet und ist> doch für den SJA1000 in dieser Weise nicht notwendig.
Doch klar. Der muss auch wissen, wann eine Adresse und wann Daten
kommen. Kommt an ALE vom Prozessor.
> Umschaltung> zwischen Motorola und Intel mode laut Datenblatt sagt mir leider nichts.
Auf Intel stellen. Dann hast Du !RD und !WR wie beim AVR und nicht E und
R/!W wie bei 68xx und 6502
!RST von den SJA machst Du auf einen Portpin des AVR.
Die !INT der SJA auf INT2 des AVR legen, mit Pullup dran.
Der 16 MHz Oszillator fehlt auch noch, und dann ist der Teil komplett.
fchk
Frank K. schrieb:> Der 16 MHz Oszillator fehlt auch noch, und dann ist der Teil komplett.
Man kann aber auch die CKOUT-Fuse setzen und dann die SJA1000 von PORTB0
treiben.
Eine eigene Frage?
Dieser Thread ist über 13 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.