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
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
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?
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
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.
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.