SPI - Verständnisfrage

Hemi

Aktives Mitglied
Premium Benutzer
30. Nov. 2008
1.103
19
38
Korntal-Münchingen, Germany
Sprachen
  1. ANSI C
  2. C++
  3. PHP
  4. Java
Servus miteinander,

ich schaue mir gerade SPI an und irgendwie verstehe ich was nicht.

Angenommen, ich habe einen Master und einen Slave, beispielsweise eine SD-Karte und meinen Atmega. So weit, so gut. Mit einem Endgerät verstehe ich es noch, wie es funktioniert.

Und jetzt angenommen habe ich zwei Geräte dran hängen und noch meinen Atmega dazu, beispielsweise MP3-Decoder und eine SD-Karte. Woher weisst die MCU mit wem ich mich "unterhalten" will?

Es würde ja dann so ablaufen:

-> Die MCU liest Daten von der SD-Karte
-> Die MCU schreibt Daten in den Decoder
-> Die MCU liest Daten von der SD-Karte
-> ...

Danke & Grüsse
Heinrich
 
Hallo Heinrich,

für die Adressierung und Paketsynchronisation gibt es den Pin SS\. Dieser hat für Master und Slave jeweils eine andere Bedeutung.

Ich erkläre es mal kurz ...

Bedeutung der Funktion bei einem Master:

Ist der Pin als Ausgang geschaltet, hat er auf den Master SPI keinen Einfluss und kann einfach als Output Pin genutzt werden (zum Beispiel um einen anderen Slave zu selektieren).
Ist der Pin als Eingang geschaltet, ist der Master dann aktiev, wenn der logische Pegel an dem Pin high ist. Ist der logische Pogel low, dann wird der master SPI deaktiviert und der MOSI Pin wird hochohmig. Dein Master SPI denke jetzt, dass ein anderer Master SPI einen Slave selektiert und Daten über den SPI Bus sendet.

Bedeutung der Funktion bei einem Slave:

Bei einem Slave ist der Pin immer Input Pin. Ist der logische Pegel des Pins high, ist der Slave SPI deaktiviert, MISO ist hochohmig. Ist der logische Pegel low, ist der Slave aktiviert (selektiert) und der kann kann vom Master SPI Daten empfangen (MOSI) und zum Master SPI Daten senden (MISO).
Hier kann man den SS\ Pin zum Synchronisieren verwenden. geht der logische Pegel am Pin SS\ von low auf high, wird die SPI Unit im Slave resettet, ist also beim nächsten selektieren wieder bitsynchron.



Es wird immer nur ein Slave selektiert (SS\ low), das kannst du direkt über Pins des Master machen oder wenn du nicht genug Pins frei hast, dann über Dekoder oder eventuell über ein Shiftregister mit parallelen Datalatches.

Vielleicht hilft dir das schon mal weiter.

Grüße,
Dirk
 
Hallo Dirk,

okay, das leuchtet ein. Aber was ich immernoch nicht verstehe ist, wie selektriere ich den Slave, mit dem ich reden will?

Bei I2C hat jeder Busteilnehmer ja eine ID, über die der Chip angesprochen wird. Sprich, wenn meine MCU sich mit Meier-Schulze unterhält, hält der Müller die Füsse still.

Aber wie funktioniert es bei den SPI-Busteilnehmern? Weil irgendwie muss ein Chip ja wissen, dass er gemeint ist.

Grüssle
Heinrich
 
Hallo,

Aber wie funktioniert es bei den SPI-Busteilnehmern? Weil irgendwie muss ein Chip ja wissen, dass er gemeint ist.
das geht über den SS (SlaveSelect) so wie bei EPROMs, RAMs, ... über den CE.
Du hast also keine Adressierung der Bausteine wie beim I2C über eine Adresse
im Datenstrom sondern eine "Outbound-Adressierung" mit nem IC-Pin außerhalb
des Datenstroms
.

für die Adressierung und Paketsynchronisation gibt es den Pin SS\. Dieser hat für Master und Slave jeweils eine andere Bedeutung.

...
..
...

Es wird immer nur ein Slave selektiert (SS\ low), das kannst du direkt über Pins des Master machen oder wenn du nicht genug Pins frei hast, dann über Dekoder oder eventuell über ein Shiftregister mit parallelen Datalatches.



Gruß
Dino
 
Ich glaube, jetzt hat es Klick gemacht.

Wenn ich mir diese Schaltung anschaue:

vs1011_schaltbild_1.jpg


Dann sehe ich, dass die beiden Geräte (unten SD-Karte und oben der MP3-Decoder) sich die drei Leitungen (MISO, MOSI, SCK) teilen. Soweit klar.

Dann beim MP3-Decoder gibt es die Leitung CS (Chip Select), die mit dem PA1 verbundung ist. Ist sie auf Low, ist dieser Chip gemeint. Ist diese Leitung auf High, unterhält sich die MCU mit dem anderen Chip.

Dann gibt es bei der SD-Karte genau so eine CS-Leitung/Pin. Diese ist mit dem Pin PA0 verbunden. Ist der Pin low, werden die Daten zwischen der MCU und SD-Karte ausgetausch.

Ist es richtig?

Grüsse
Heinrich
 
Hallo Heinrich,

Ich glaube, jetzt hat es Klick gemacht.

Ist es richtig?
klick, klick, :D
Ich würde mal sagen ... Ja ;)

MISO, MOSI, SCK sind gemeinsam für alle Chips am SPI und jeder Chip hat
seine eigene Select-Leitung (SS) vom Master damit er weiß wann er gemeint
ist.

Gruß
Dino
 
Servus miteinander,

ich habe da noch eine Frage zu.

Auf der Schaltung oben kann man ja erkennen, dass die Karte über einen Spannungsteiler angeschlossen ist. Meiner Meinung nach unschön. Ich bezweile nicht, dass es funktioniert.

Ich würde an der Stelle einen Pegelwandler einsetzen wollen. Kennt jemand einen Passsenden? Es sollte ja ein 5-fach bidirektionaler Pegelwandler sein, wenn ich es richtig sehe.

5-fach weil:
-> DI
-> DO
-> CLK (Clock)
-> CS (Chip Select)
-> CD (Card Detect, auf der Schaltung nicht zu sehen)

Danke & Grüsse
Heinrich
 
Hi Heinrich,

also den PCA9545 von Texaswürd ich nicht nehmen. Und zwar ...
1. hat ein TSSOP-Gehäuse (ziemlich enge Pin-Abstände)
2. ist von den 3en der langsamste
3. Die Pin-Sortierung am Gehäuse ist Mist

Der TXS0104 (Texas) und der ADG3304 (AD) sind anscheinend Pinkompatibel.
Außerdem sind die relativ gleich schnell und von den Daten wohl ziemlich
identisch. Da der TXS0104 im SOIC-Gehäuse (1,27mm Pinabbstand) zu kriegen
ist und der AD3304 nur im TSSOP würde ich den TXS0104 bevorzugen.

Das ist jetzt so auf die schnelle aus den Datenblättern und den Seiten
von Farnell rausgekommen. Die elektrischen Daten hab ich mir noch nicht
genau angesehen aber evtl hilft es ja erst mal für eine Richtung.

Gruß
Dino
 
Hallo Dino,

danke schön für die Hilfe. Ich glaube, ich nehme doch den TXS0104.

Im Datenblatt steht:

Code:
Power Up

[i]During operation, ensure that VCCA ≤ VCCB at all times.[/i] During power-up sequencing, VCCA ≥ VCCB does not
damage the device, so any power supply can be ramped up first.

Das würde bedeuten, dass B meine 5V- Seite ist und A ist die 3V Seite? Sprich an den B-Pins hängt mein AVR und an den A-Pins dann die SD-Karte.

Jeder I/O-Pin im Wandler hat einen 10k PullUp drin. Das ist okay, dann spare ich mir die PullUps am AVR.

Grüsse
Heinrich
 
Hallo Jürgen,

vielen Dank für die Antwort.

Ich habe herausgefunden, dass der TXS0104 in Verbindung Probleme macht, bzw. nicht funktioniert. Beim TXB0104 sieht es genau so aus, obwohl er eigentlich für den Betrieb mit SD-Karten gedacht sein soll.

Ich habe jetzt einen MAX3378 gefunden und es tut mit SD-Karte definitiv, das passt also.

Den 8-Fach kann ich dann nehmen, wenn ich SD-Karte + VS ansteuern will.

Grüsse
Heinrich
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)