Verständnisfrage SPI

02/04/2012 - 16:26 von Stefan | Report spam
Hallo,

ich hab vor einiger Zeit schon mal ADUs mit nem ATmega16 per SPI
angesprochen. Das war aber immer nur ein ADU an einem ATmega16.

Jetzt habe ich eine etwas andere Aufgabe:

Ein Prozessor (vermutlich ATmega128) soll mit mehreren (1-8) ATmega8
Daten austauschen. Meine erste Idee war eine Ringleitung per UART, also
ATmega128 sendet an 1. ATmega8. Dieser sendet an den 2. ATmega8 usw. bis
zum letzten. Der letzte sendet wieder an den ATmega128.

Sowas habe ich schon mit 8031 Prozessoren realisiert. Nachteil ist aber,
dass ich ein UART "verliere", den ich in dem Projekt eventuell noch
benötige.

Der zweite Nachteil ist mechanischer Natur. Ich wollte die Slave-CPUs
stapel, d.h. auf der Platine des Mega128 einen Pfostenverbinder und dann
so àhnlich wie bei PC104 die Platinen stapeln (aber mit viel weniger Pins).

Die Ringleitung kann ich dann aber nicht ohne zusàtzliche
Umschalter/Jumper durchschleifen. Deshalb die Idee, einen BUS
einzusetzen. Die Platinen können dann einfach gestapelt werden und man
muss nur eine Adresse einstellen, z.B. über 4 DIP-Switches.

Wie beschrieben ist der Abstand zwischen den Busteilnehmern sehr kurz,
ca. 15mm je Etage.

Jetzt habe ich mir die Doku zu SPI angesehen und dabei festgestellt,
dass ich dort entweder die SS* Leitungen schalten muss, oder MOSI und
MISO durchschleifen. Damit habe ich dann dasselbe Problem, wie beim UART.

Deshalb habe ich folgende Frage: Könnte man nicht die Slaves so
beschalten, dass SS*, MISO, MOSI und SCK einen 3.Leitungs-Bus bilden.
Die Slaves müssten so konfiguriert werden, dass MISO zunàchst auf
Tristate bleibt und erst dann aktiv wird, wenn ein Adressbyte empfangen
wurde. Also àhnlich wie bei I2C.

Ich stelle mir das vereinfacht so vor:
Master setzt SS* auf aktiv (0) und sendet ein Adressbyte. Die Slaves
lesen das Adressbytes und der angesprochene Slave schaltet MISO auf
aktiv und sendet mit den folgenden Takten die Daten an den Master.

Der Master muss nicht viele Kommandos senden. deshalb könnte man das so
definieren, dass es sich um ein Adressbyte handelt, wenn Bit7=1 ist.
Wenn Daten vom Master an einen Slave geschickt werden sollen, kann man
diese auf 2 Bytes aufteilen. Oder man nimmt die ersten 4 Bits für die
Adresse und die nàchsten 4 Bits für die Daten. Andererseits wàre auch
eine Telegrammstruktur mit Startzeichen+Adresse+Daten möglich.

Geht das so, oder habe ich etwas grundlegendes vergessen?

Wobei, wenn ich genau überlege wàre es vieleicht doch nicht verkehrt,
die SS* Leitungen sternförmig auszulegen...

Gruß

Stefan
 

Lesen sie die antworten

#1 Michael Baeuerle
02/04/2012 - 17:04 | Warnen spam
Stefan wrote:

Geht das so, oder habe ich etwas grundlegendes vergessen?



Das ist bei SPI so eigentlich nicht vorgesehen, die Transfers sind
normal immer bidirektional ab dem ersten Bit. Sobald du /SS aktivierst
beginnt ein Slave MISO zu treiben, das gibt also eine Kollision wenn du
mehrere Slaves gleichzeitig aktivierst.

Du koenntest es aber schon auch so aufbauen, dass die Slaves nur auf
Befehl MISO treiben. Z.B. via externem Tristate-Treiber an MISO (der
erst nach Validierung der eigenen Adresse vom Slave aktiviert wird).

Wobei, wenn ich genau überlege wàre es vieleicht doch nicht verkehrt,
die SS* Leitungen sternförmig auszulegen...



Oder du addressierst die Slaves binaer, dann reichen 3 Pins fuer 7
Slaves (8 falls "bus free" nicht erforderlich ist). Die Decodierung
koennte der Slave AVR z.B. via Pin Change Interrupt selbst machen und
dann bei Bedarf sein eigenes /SS runterziehen. Dein Protokoll muss ihm
halt genug Zeit dazu lassen.


Micha

Ähnliche fragen