Forum: Mikrocontroller und Digitale Elektronik SPI Übertragungsdauer, Buffer und Shiftregister


von Markus (Gast)


Lesenswert?

Hallo,

Ich mache mir gerade ein paar Gedanken zu der Übertragungsdauer einer 
SPI Schnittstelle.

Folgendes: Kontroller läuft mit einer Frequenz x.
SPI Modul mit einer Frequenz y.

Wenn ich nun Daten in den Transmit Buffer reinschicke, dann passiert das 
doch mit der Frequenz x vom Kontroller.
Die Frequenz y kommt erst ins Spiel wenn das Transmit Schiebe Register 
die Daten auf den Bus sendet, oder ? (laut Blockschaltbild)

Ich übertrage meine Daten folgendermaßen:
-warten bis Transmit Buffer leer
-sende Daten

Wenn das Schiebe register und das Buffer aber mit unterschiedlichen 
Geschwindkeiten arbeiten dann knallt es doch irgendwann ..

Kann mich jemand bitte aufklären.
Hier das Blockschaltbild :
http://www.directupload.net/file/u/70818/y9o4avr6_png.htm

von Timmo H. (masterfx)


Lesenswert?

Der SPI-Master gibt die Clock Speed vor. Wenn der Slave das nicht packt 
ist das halt so. Steht aber im Datenblatt was max. ist. Im Prinzip ist 
SPI nichts anderes als ein Schieberegister. Der Master legt CS und CLK 
an und der Slave clockt bei jedem Takt ein Bit raus. Und wenn es zu 
schnell ist (außerhalb der Spec) dann halt nicht (bzw. undefiniert)

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

Hallo Timmo,

das beantwortet leider meine Frage nicht. Also werden deiner Meinung 
nach auch die Daten ins Buffer mit der Frequenz des SPI Moduls geladen?

von Gerhard O. (gerhard_)


Lesenswert?

Markus schrieb:
> Hallo,
>
> Ich mache mir gerade ein paar Gedanken zu der Übertragungsdauer einer
> SPI Schnittstelle.
>
> Folgendes: Kontroller läuft mit einer Frequenz x.
> SPI Modul mit einer Frequenz y.
>
> Wenn ich nun Daten in den Transmit Buffer reinschicke, dann passiert das
> doch mit der Frequenz x vom Kontroller.
> Die Frequenz y kommt erst ins Spiel wenn das Transmit Schiebe Register
> die Daten auf den Bus sendet, oder ? (laut Blockschaltbild)
>
> Ich übertrage meine Daten folgendermaßen:
> -warten bis Transmit Buffer leer
> -sende Daten
>
> Wenn das Schiebe register und das Buffer aber mit unterschiedlichen
> Geschwindkeiten arbeiten dann knallt es doch irgendwann ..
>
> Kann mich jemand bitte aufklären.
> Hier das Blockschaltbild :
> http://www.directupload.net/file/u/70818/y9o4avr6_png.htm

Das Laden des TX Schieberegisters erfolgt Wortbreite parallel wenn das 
TX Register mit neuem Datenwort geladen wird. Wortbreite ist meist wie 
beim AVR oder PIC 8 und bei größeren uC können es auch 16-bit sein. Mit 
dem Prozessor Takt hat das nichts direkt zu tun. Einzig und allein die 
Taktkonfigurierung des SPI Ports bzw. der Takt-Prescaler bestimmt die 
SPI Taktfrequenz. In vielen Datenblättern gibt es Timing Diagramme die 
das genau illustrieren. Sieh Dir das genau an und lese die ganze 
Beschreibung der SPI Peripherie.

Dein verlinktes Block Schaltbild funktionell versteckt viele 
Einzelheiten der ganzen Ablauflogik die die eigentliche Arbeit macht.

Wenn vorher alles richtig konfiguriert ist, setzt das Laden des TX 
Registers die Sendemaschine automatisch in Bewegung und es werden der 
Wortbreite entsprechend die notwendige Nummer von Taktimpulsen gesendet 
(8 oder 16) die dann das Datenwort bit für bit an den SDO-Pin erscheinen 
lassen. Das ist hardwaretechnisch meist als State Machine verwirklicht 
und alles läuft voll automatisch ab. Du arbeitest also indirekt nur über 
die SPI Register Schnittstelle mit der SPI Hardware und hast keinen 
direkten Zugriff. Der uC ist taktmässig nicht mit dem SPI gekoppelt. 
Wenn alle Bits abgearbeitet sind wird ein Flagbit im Status Register 
gesetzt um dem Sender zu notifizieren, daß jetzt das nächste Datenwort 
geladen werden kann. Man kann auch einen Interrupt auslösen um den 
Vorgang zu automatisieren. Wenn man nun z.B. Den SDO Ausgang mit dem SDI 
Eingang verbindet wird das Schieberegister mit dem gleichen Datenwort 
geladen und kann dann gelesen werden sobald TX Done Flagbit gesetzt ist. 
Der Sende und Empfang ist also voll Duplex und Takt synchron. Wenn man 
z.B. den SDI pin mit Masse verbinden würde, wird ein Wort mit allen Bits 
auf Null gesetzt eingelesen. Man kann übrigens auch bestimmen ob das MSB 
oder das LSB zuerst gesendet wird und auf welcher Flanke des Taktsignals 
die Daten eingelesen werden sollten und der Ruhezustand der Taktleitung. 
Das steht natürlich alles im Datenblatt.

Die SPI Hardware macht das alles für Dich automatisch.

Ist eigentlich ziemlich einfach. Am besten ist es damit zu 
experimentieren bis man ein Gefühl dafür entwickelt was da eigentlich 
vorgeht.

Ein Oszilloskop ist da ganz nützlich.

Man kann SPI auch mit software machen. Dann ist die SPI Taktfrequenz 
direkt von der Abarbeitung der uC Instruktionen abhängig.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Nachtrag:

Man visualisiert den SPI Block am besten als eine Black Box mit ein paar 
Registern als Schnittstelle. Alles was innen in der Black Box abläuft 
geschieht voll automatisch ohne Intervention des Anwender Programs 
welches typisch nur via polling oder Interrupt nach dem Rechten sieht 
und neue Daten der Box zuliefert wenn es erlaubt ist. Erlaubt ist hier 
von Bedeutung daß man nur im Wartezustand neue TX Daten schreiben darf 
und immer das Status Register beobachten und interpretieren muß.

Als Interface zwischen Black Box dienen nur die im Datenblatt 
dokumentierten Register. Die sind sozusagen die Mailbox zwischen SPI 
Hardware und dem Anwender Programm. Daher hat der uC Takt wenig Relevanz 
und die beiden Einheiten arbeiten in parallel zu einander um nur 
zeitweise wenn notwendig miteinander in Verbindung zu treten.

von Markus (Gast)


Lesenswert?

Danke für deine Tolle und ausführliche Mühe, Gerhard. Aber so ganz ist 
meine Frage damit immer noch nicht beantwortet, eventuell denke ich aber 
gerade auch zu viel kompliziert drüber, desshalb das ganze nochmal in 
einzel Schritten:
(ich schreibe nach jeder Vermutung ein Fragezeichen, eventuell kann man 
das so leichter abhacken, ob richtig oder falsch

1) bevor ich etwas in mein BUFFER schreibe, prüfe ich ob es leer ist
2) ich sende 1 Byte

3) Dieses Byte geht ja dann mit der Prozessor Geschwindigkeit in den 
Buffer ?
4)Vom Buffer aus, geht es wie du gesagt hast, parallel zum 
SCHIEBEREGISTER, mit der Frequenz des SPI Moduls ?

5) Aus dem Schieberegister wird jetzt jedes BIT EINZELN, mit der SPI 
Taktfrequenz an den SDO Pin weitergeleitet.


Ich habe testweise, für eine 1 Byte Übertragung das ganze am Oszi 
gemessen: Vor der Übertragung ein Pin auf High, und nach der Übertragung 
dann auf Low.
Rechnerich komme ich aber nicht auf diese Zeit zurück. 1/(SPI Takt) * 
Bits = ZEIT OSZI ?

Was sagst du dazu ?

Danke!

von Gerhard O. (gerhard_)


Lesenswert?

Hallo Markus,

Habe Deine Antwort erst jetzt bemerkt.

Markus schrieb:
> Danke für deine Tolle und ausführliche Mühe, Gerhard. Aber so ganz
> ist
> meine Frage damit immer noch nicht beantwortet, eventuell denke ich aber
> gerade auch zu viel kompliziert drüber, desshalb das ganze nochmal in
> einzel Schritten:
> (ich schreibe nach jeder Vermutung ein Fragezeichen, eventuell kann man
> das so leichter abhacken, ob richtig oder falsch
>
> 1) bevor ich etwas in mein BUFFER schreibe, prüfe ich ob es leer ist
Ja. Wenn man während des Senden schreibt werden die existierenden Daten 
gestört und man soll das nicht machen.
> 2) ich sende 1 Byte
Das Senden erfolgt voll automatisch nach Erhalt des Daten Bytes sobald 
der Prozessorschreibvorgang zu Ende ist. Das macht die SPI 
Ablaufsteuerung die im Blockschaltbild nicht gezeigt ist.
>
> 3) Dieses Byte geht ja dann mit der Prozessor Geschwindigkeit in den
> Buffer ?
Insofern ist nur die interne Prozessortaktung von Bedeutung. Jeder 
Prozessor braucht intern je nach Instruktion 1-12 Takte um die 
Instruktion zu vervollständigen. (Beim alten 8051 sind das 12 
Taktperioden; beim AVR 1 oder 2). Hier ist aber der Knackpunkt: Sobald 
die Tranferinstruktion um das Bufferregister zu laden komplett ist, ist 
die Funktion des SPI Blocks aus den Händen der Prozessoreinheit. Nimm 
mal an, das Datenbyte sitzt in einem Prozessor Register, fertig um in 
das Buffer Register verfrachtet zu werden. Zu diesem Zeitpunkt werden 
gerade nur so viel Taktperioden verwendet wie die jeweilige Instruktion 
braucht, also 1 Takt beim AVR.( Ob das nun 1 oder 2 beim AVR sind, kann 
ich ohne Nachschauen jetzt nicht faktual bezeugen)


> 4)Vom Buffer aus, geht es wie du gesagt hast, parallel zum
> SCHIEBEREGISTER, mit der Frequenz des SPI Moduls ?
Ab hier nimmt die interne SPI Ablauffsteuerung das Zepter in die Hand. 
Die interne Ablaufsteuerung beginnt nun vollautomatisch das Senden (und 
den gleichzeitigen Empfang) des geladenen DatenbTes und notifiziert dann 
den Erfolg im Statusregister mit Setzen eines Bits oder läßt dann den 
Prozessor in einen Interrupt springen je nach Programm Design.
>
> 5) Aus dem Schieberegister wird jetzt jedes BIT EINZELN, mit der SPI
> Taktfrequenz an den SDO Pin weitergeleitet.
Ja.
>
> Ich habe testweise, für eine 1 Byte Übertragung das ganze am Oszi
> gemessen: Vor der Übertragung ein Pin auf High, und nach der Übertragung
> dann auf Low.
> Rechnerich komme ich aber nicht auf diese Zeit zurück. 1/(SPI Takt) *
> Bits = ZEIT OSZI ?
>
> Was sagst du dazu ?
Wenn Du zufällig einen Arduino hast, laß mal ein kleines Testprogram in 
einer Loop laufen. Das kann man dann mit dem Oszi bequem studieren.

Für ein Byte müssen acht Takt Perioden sichtbar sein.
Der SDO Pin Zustand ändert sich dann je nach Einstellung der SPI HW z.B. 
bei den jeweilig folgenden H->L Transitionen des Taktes. Der Empfänger 
soll so eingestellt sein, dass die Daten an der L->H Transition des 
Taktes gesampelt werden.

Die gültige BIT dauer am SDO Pin ist gerado so lang wie eine komplette 
Takt Periode. Den genauen Zeitpunkt bestimmt die Konfigurierung der SPI 
Hardware. Meisten ist es so eingestellt, daß die neuen Datenbits vor der 
L->H Transition des Taktsignals am SYdO Pin erscheinen und der Empfänger 
dann das Datenbit bei der L->H Transition sampelt und dann wiederholt 
sich das Spiel bis alle 8 Bit abgearbeitet sind.

Die Periode des SCK Taktsignals ist von der Einstellung des SPI 
Prescaler abhängig. Beim AVR kann man das bis zu AVR Clock / 2 
einstellen, also 8Mhz. Ohne Nachschauen kann ich Dir die Möglichkeiten 
nicht quotieren. Beim AVR kann man meist 8 Möglichkeiten wählen und es 
könnte noch eine zusätzliche Einstellung geben. Da müsste uch mal das 
Datenblatt konsultieren. Geht jetzt schlecht beim iPad. Beim AVR kann 
man bis zu 1024 vorteilen.

Ich glaube was Dich verwirrt ist die fehlende Indikation der 
Ablaufsteuerung im SPI Block. Da ist viel mehr Logik im Blockschaltbild 
vorhanden wie Dir dort gezeigt wird.

Versuch die SPI Hardware abstrakt als Black Box zu verstehen die nur das 
macht was im Datenblatt beschrieen ist. Die SPI HW hat sozusagen als 
Black Box ein "Eigenleben". Ist ähnlich wie bei der Post. Sobald man den 
Brief in den Schlitz des Postkasten steckst ist die Nachricht aus Deinen 
Händen und geht von dann mit der Geschwindigkeit der Post von statten:-)

Was meinst Du dazu? Hilft das weiter?
Gerhard
>
> Danke!

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus schrieb:
> 4)Vom Buffer aus, geht es wie du gesagt hast, parallel zum
> SCHIEBEREGISTER, mit der Frequenz des SPI Moduls ?
Sieh dir mal den SPI als simple gekoppelte Schieberegister an. dort z.B. 
in der Mitte:
http://www.lothar-miller.de/s9y/archives/15-SPI.html

Und dann überleg dir, wie du es schaffen könntest, diese Schieberegister 
laufend mit Daten zu versorgen. Du wirst darauf kommen, dass vor das 
TX-Schieberegister ein Puffer muss. Und hier das RX-Schieberegister 
auch. Denn wenn dann im TX Bufer was steht, dann kann der SPI sofort 
weitermachen. Und dein µC hat währen dieser Übertragung Zeit, den 
Puffer wieder zu befüllen.

Wenn du dir mit diesem Hintergrundwissen mal das Blockschaltbild des 
SPI-Moduls deines µC ansishst (und dann am besten noch das einiger ganz 
anderer µC), dann erkennst du schnell, welche Funktion welches Register 
im Übertragungsprozess hat.

So ist z.B. bei einigen µC der Puffer nicht einfach nur ein einziges 
Register, sondern die zu sendenden Daten stehen im RAM und per DMA wird 
Byte für Byte übertragen. Genauso in der Empfangsrichtung...

Und um diese Abläufe zu steuern, sind einige Automaten am Werk, die über 
passende Konfigurationsregister eingestellt werden müssen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.