Hallo..
Ich suche ein BUS-System zur adressierten Übertragung von Daten.
Ich habe verschiedene Platinen, jede mit einem AVR darauf. Diese
Platinen repräsentieren Module. Nun sollen diese über einen BUS
miteinander verbunden werden, sodass das Master-Modul an verschiedene
Module (jedes hat eine Adresse) Daten senden und von ihnen wieder
empfangen kann.
Da das ganze Adressiert sein muss, fällt SPI aus. I2C, habe ich gehört,
ist schlecht für Übertragung mit Kabeln, die Module können einige
Zentimeter von einander entfernt liegen (10-20cm).
Bei drei oder vier Modulen ist dann der Abstand zwischen Master und dem
letzten Modul des BUS vielleicht zu groß.
Gibt es andere BUS-Systeme die auf einem AVR problemlos implementierbar
sind?
Mit freundlichen Grüßen,
Sebastian
Ok, das hört sich doch gut an.
Wie sieht das denn aus mit EMV? Welche Verbindungen immt man da am
besten? Das ganze sollte sehr unempfindlich gegenüber Störungen sein.
Danke für die schnelle Antwort.
Ach und nochwas
Gibt es soetwas wie eine Broadast-Adresse im I2C Protokoll?
Kommt auf die Störungen an. Wenn da wirklich ernsthaft was unterwegs
ist, dann ist I2C unpassend und RS485 besser. Aber wenn die Störungen so
schlimm sind, dass sich I2C auf 20cm leicht was einfängt, dann wirst du
beim Platinenlayout wohl mehr als 2 Layer investieren müssen, denn die
fangen sich sonst auch was ein. Ansonsten: Schirm drum und CRC rein.
Hmm, da ist die Frage, wie sicher das ganze sein muss.
Es würde halt in einem Schaltschrank laufen, ich weiß nicht wie hoch
dort das Risiko ist.
Hat jemand mit sowetwas Erfahrungen?
Schau dir mal das SMB Protokolll an, ist vielleicht besser, automatische
Adressvergabe, automatischer Timeout usw. Ev könnte auch das LIN
Protokoll
interessant sein, setzt sich immer mehr durch.
Hmm diese Protokolle sehen sehr kompliziert aus. Im endeffekt muss der
Master wenn er den Befehl bekommt schnellstmöglich ein Byte an einen
Slave senden. Die Datenmenge ist also extrem gering, wichtig ist nur die
Geschwindigkeit.
Eine Broadcast Funktion wäre halt interessant, dass der Master
selbsständig die Adressen von allen Slaves sammeln und listen kann.
Wenn das nicht möglich ist, muss das manuell geschehen, ist auch nicht
weiter schlimm. Wäre ein schickes Feature.
Danke für die reichlich informativen Antworten,
Gruß, Sebastian
Hallo Sebastian,
versuch es mal mit dem CAN-Bus: der ist dafür optimiert, in sehr
störbehafteten Umgebungen sicher zu arbeiten (u.a. Automobil-Bereich).
Die Hardware (Busverkabelung) ist einfach und unkritisch und Du kannst
Deine gewünschten Entferunungn locker überbrücken.
Vielleicht gibt es ja AVRs mit CON-Baugruppe ON-Chip, ansonsten gibt es
ein Menge einfacher und preiswerter externer CAN-Bausteine.
Mit CAN bist Du in vielen Fällen auf der sicheren Seite.
Gruß
Rufus
Weshalb faellt SPI raus ? Man kann das seriell, oder auch parallel
realisieren. Beim Parallelen Ansatz wird der SCK, MSIO & MOSI auf alle
Module parallel gefuehrt. die Selektrion geschieht mit dem CS, der nur
das Aktive bekommt. Beim seriellen ansatz hat man alle schieberegister
hintereinander, das MOSI des Einen geht auf den MISO des anderen, der CS
ist fuer alle parallel. Dann werden die Daten durch alle
hindurchgeschoben. und alle latchen aufs Mal.
Das Problem in SPI besteht darin, dass für jeden weiteren Teilnehmer
eine Select-Leitung erforderlich ist. Das durchschleifen erachte ich als
zu langsam.
RS232 (bzw. UART) kann man auch als Kette / Ring betreiben
Die Adressierung muss dann allerdings über separate pins oder über die
Datenpakete erfolgen
Node 1 (TX) -> (RX) Node 2 (TX) -> Node 3 -> (RX) ...
... -> (RX) Node 1
@ Sumynona:
Das heißt das auch hier jeder Teilnehmer das Paket weiterreichen muss?
Das wäre ja dann in diesem Sinne keine BUS sondern eher eine
Ringtopologie. Oder sehe ich das falsch?
ja richtig. ist aber neben dem I²C bus eine nette möglichkeit, mit 2
Drähten seriell viele Teilnehmer anzusprechen.
Vielleicht wären aber rs422/rs485 besser geeignet in dem Fall (wenns
schnell gehn soll), denn sonst müssen die daten in jedem controller
durch den interrupt und ausgewertet werden, bevor es weiter geht
Hmm, denke ich auch.
Wie sähe das denn mit der Störsicherheit aus, bei direkten, aufgelötetn
Steckverbindern zwischen den Platinen? Wäre I2C dafür robust genug?
"Robust genug" hängt immer von den konkreten Störungen ab. Wenn direkt
daneben ein Lichtbogensender oder ein Schrottplatzmagnet sitzt, dann
kannst du alles ausser LWL vergessen (aber sowas haut dir dann auch in
die Leiterbahnen der Platine und ggf. sogar die Bonddrähte vom Chip
rein).
In leidlich normaler Umgebung kannst du auf der Distanz einen I2C Frame
mit CRC absichern und damit jedenfalls einigermassen sicherstellen, dass
kein Schrott unerkannt rüberkommt.
Auf PC Mainboards, die ja nicht grad eine störarme Umgebung sind, zieht
sich jedenfalls quer drüber ein SMBus, was nix anderes als eine
I2C-Abart darstellt.
Alles klar, wenn das im PC ohne Probleme läuft, dürfte das auch für mein
Einsatzgebiet reichen.
Ich denke, I2C hat gerade im Bereich AVR den super Vorteil, dass weder
Treiber noch andere externe Hardware benötigt werden.
Aus diesem Grund würde ich aus der techn. Perspektive Betrachtet diese
Spezifikation bevorzugen.