Forum: Mikrocontroller und Digitale Elektronik SPI shift register löschen


von PacMan (Gast)


Lesenswert?

Hallo zusammen,
ich bin momentan am verzweifeln. Und zwar benutze ich einen Phycore 
PowerPC MPC5554 als SPI slave. Dieser soll sich mit einem SPI Master 
synchronisieren. Mein Problem:
Die Empfangenen Daten haben das richtige Bitmuster, allerdings sind sie 
um ein paar bits verschoben. Das kann meiner Meinung nur daran liegen, 
dass sich im Shift register noch Daten befinden. Die Lösung wäre das 
shift register zu löschen. ABER WIE?

Mein Vorgehen:
ich sende an den Master SyncFrames woraufhin er aufhört SyncFrames zu 
senden. (Jetzt müsste das Shift register gelöscht werden). Daraufhin 
sende ich an den Master eine Anfrage woraufhin er antwortet. Das tut er 
auch, nur sind die Datenbit verschoben.

Physikalisch kommt auf jeden Fall das richtige an (mit Scope 
nachgemessen).

Kurz und Knapp:
Wie lösche ich das Shift register?

von holger (Gast)


Lesenswert?

>Die Lösung wäre das
>shift register zu löschen. ABER WIE?

Brauchst du nicht zu tun.

>Mein Vorgehen:
>ich sende an den Master SyncFrames woraufhin er aufhört SyncFrames zu
>senden. (Jetzt müsste das Shift register gelöscht werden). Daraufhin
>sende ich an den Master eine Anfrage woraufhin er antwortet. Das tut er
>auch, nur sind die Datenbit verschoben.

Ich glaube du verwechselst Master und Slave.
Ein Slave sendet nie ohne Aufforderung vom Master.
Und somit kann bei der Übertragung auch nichts schief gehen
da der Master ja den SPI Clock vorgibt. Das ganze läuft
synchron zu diesem Clock ab. Und damit dürfte es auch keine
Missverständnisse geben. Es sei denn der Master taktet
zu schnell für den Slave.

von Namenlos (Gast)


Lesenswert?

Du verwendest auf beiden Seiten die gleiche Wortlänge?
Bei SPI gibt es eine Litanei von Einstellmöglichkeiten
(Maskierung, Wortlänge, Mode, ...)

Alle überprüft?

von Peter L. (Firma: Auto) (pacman)


Lesenswert?

@Holger: Nein, ich verwechsle nicht Master mit Slave. Habe nur vergessen 
zu erwähnen, dass ich auf dem PowerPC mit SPIs arbeite (zum Senden als 
Master und zum Empfangen als Slave) auf der Gegenstelle sieht esgenause 
aus.

Danke und Grüße,
Björn

von Peter D. (peda)


Lesenswert?

PacMan wrote:

> Wie lösche ich das Shift register?

Löschen hilft nicht, Du mußt die Register synchronisieren.
Dazu dient das /SS (Slave-Select) Signal.

Der Master legt das /SS des Slave auf low, sendet die Daten und danach 
wieder /SS = high.
Dadurch ist es auch möglich mehrere Slaves anzusprechen. Der Master 
braucht dann für jeden Slave eine zusätzliche /SS-Leitung.


Peter

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


Lesenswert?

> dass ich auf dem PowerPC mit SPIs arbeite (zum Senden als Master
> und zum Empfangen als Slave) auf der Gegenstelle sieht es genauso aus.
Wie hast die dann hardwaremäßig verschaltet?

Ist es so:
Du hast einen PPC A mit 1 SPI-Master und 1 SPI Slave.
Und du hast einen PPC B mit 1 SPI-Master und 1 SPI Slave.
Und du hast den Master vom PPC A mit dem Slave vom PPC B verbunden.
Und du hast den Master vom PPC B mit dem Slave vom PPC A verbunden.

Zu jeder dieser beiden Verbindungen gehören die Signale:
MOSI, MISO, SCLK und SS

Also mußt du 8 Leitungen gezogen haben. Richtig?

von Peter L. (Firma: Auto) (pacman)


Lesenswert?

> Ist es so:
> Du hast einen PPC A mit 1 SPI-Master und 1 SPI Slave.
> Und du hast einen PPC B mit 1 SPI-Master und 1 SPI Slave.
> Und du hast den Master vom PPC A mit dem Slave vom PPC B verbunden.
> Und du hast den Master vom PPC B mit dem Slave vom PPC A verbunden.
>
> Zu jeder dieser beiden Verbindungen gehören die Signale:
> MOSI, MISO, SCLK und SS
>
> Also mußt du 8 Leitungen gezogen haben. Richtig?

Der Aufabu stimmt, nur habe 6 Verbindungen.
Master --> Slave:
 - SCK
 - DATA
 - GND

Master --> Slave:
 - SCK
 - DATA
 - GND

Also SS leitung habe ich keine.

von Peter D. (peda)


Lesenswert?

Peter Lustig wrote:

> Also SS leitung habe ich keine.

Dann brauchst Du aber spezielle magische MCs, die hellsehen können, 
welche Taktflanke welches Datenbit bedeutet.

Darauf zu hoffen, daß nach einem Power-On-Reset beide MCs gleich lang 
zum Initialisieren brauchen und dann für alle Zeit synchron sind, ist 
weder professionell noch zuverlässig.
In der Regel sind die Pins nach nem Reset erstmal hochohmig und wenn der 
eine früher mit Initialisieren fertig ist, kann er sich schön ein paar 
Störimpulse einfangen (einer reicht ja schon).


Es gibt natürlich Protokolle, die ohne Synchronisation über /SS 
auskommen, das ist dann aber kein standard SPI mehr.

Z.B. kann man ein Startbit senden, was immer 1 ist. Dann kann eine 
Synchronisation dadurch erreicht werden, daß 9 Nullen gesendet werden.

Oder zwischen den einzelnen Bytes wird immer eine längere Pause gelassen 
und der Slave mißt die Zeit zwischen 2 Clock-Perioden.

Oder wie beim I2C-Bus über Taktflanken auf SDA.


Peter

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


Lesenswert?

> Also SS leitung habe ich keine.
Bei SPI wird mit der SS-Strippe der Anfang und das Ende der Übertragung 
gekennzeichnet. Es gibt SPI-Devices, die das nicht brauchen, die können 
dann kontinuierlich selektiert bleiben. Allerdings braucht man dann 
irgend eine andere Art der Synchronisation. Am einfachsten ist und 
bleibt der Handshake mit SS.

von Peter L. (Firma: Auto) (pacman)


Lesenswert?

Also dass mit der SS Leitung habe ich schon verstanden und bei einem Bit 
verschiebung passt auch alles nicht.
Nur wenn ich SyncFrames versendet habe, hört der der Empfänger auf zu 
senden. Jetzt müsste ich das shift register löschen!
Nach der Synchronisation sende eine Anfrage an den Empfänger worauf er 
mit einer Nachricht antwortet (die Antwort ist auch korrekt --> mit 
scope gemessen). Nur ist diese Antwort um ein Paar bits verschoben.
Also ich weiß, wann gültige Daten ins shiftregister reinpoltern (da 
würde ich gerne das shift register löschen), aber es ist nicht leer.
Ich habe auch schon versucht eine neuinitialisierung nach der 
Synchronisation zu starten (in der Hoffnung, dass das Shift register 
gelöscht wird). Aber das Shift register wird nicht gelöscht.

Ich bin am verzweifeln :-(

von holger (Gast)


Lesenswert?

>Aber das Shift register wird nicht gelöscht.

Du kannst das Shift Register nicht löschen
und du brauchst es auch nicht zu löschen.
Sobald du was reinschreibst wird das normalerweise
auch gesendet.

von holger (Gast)


Lesenswert?

>Sobald du was reinschreibst wird das normalerweise
>auch gesendet.

Damit meinte ich beim Löschversuch wird evtl. gleich
wieder etwas gesendet.

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


Lesenswert?

> Aber das Shift register wird nicht gelöscht.
Von welchem Shift-Register sprichst du denn?

Du hast üblicherweise in einem uC 2 Schieberegister, die unter der 
selben Adresse angesprochen werden: Das TX-Register wird mit einem 
Write-Befehl angesprochen, das RX-Register mit einem Read-Befehl.
 mov  SPI_SR, dataout; --> schreibt in TX-Register
 mov  datain, SPI_SR;  --> liest mit der selben Adresse vom RX-Register
Also wirst du das RX-Register niemals mit einem Schreibbefehl löschen 
können.

Das habe ich für mich mal festgehalten:
http://www.lothar-miller.de/s9y/archives/15-SPI.html#extended

von Matthias (Gast)


Lesenswert?

Wenn es kein SS gibt, dann musst Du einen GPIO (hat das Teil 
hoffentlich)
dafür benutzen. Ich glaub aber nicht, dass das Teil kein SS hat.
Bisher hat jeder Slave, den ich gesehen hab immer sowas dran.
Auch uC's müssen, wenn sie die Slave Funktion unterstützen, sowas haben.

Bei einem High-Pegel wird das Schieberegister und die interne Logic 
(Bitzähler, etc.) zurückgesetzt. Bei Low-Pegel wird mit jedem Taktpuls
ein Bit eingelesen. Wenn die max. Anzahl Bits drin ist, wird ein IRQ 
ausgelöst (und das Datenwort in das Empfangsregister verschoben).

Poste mal ein Datenblatt von dem Teil. Dann sehen wir weiter....

von Peter L. (Firma: Auto) (pacman)


Lesenswert?

Vielen Dank für die vielen Antworten.
Um Mein Problem noch einmal einfacher zu beschreiben. Ich habe eine 
Empfangs SPI (Slave) ohne ChipSelect-Leitung. Also nur Daten- und Clock- 
Leitung.
Bei jeder negativen Flanke auf der Clock  wird das Signal  der 
Datenleitung ins ShiftRegister geschoben. Sind 8 Bits vorhanden wird ein 
Interrupt ausgelöst und die Daten ausgelesen. Jedoch muss zu einem 
Bestimmten Zeitpunkt den Bitzähler der ShiftRegisters auf Null setzen. 
Ich weiß wann ich es resetten muss, nur nicht wie. Im Prinzip ist doch 
einfach SPI auschalten und wieder anschalten, oder? Dann müssten doch 
die alten Werte (Bitzähler des ShiftRegisters) gelöscht werden.

Das letze mal habe ich mich falsch ausgedrückt („löschen des 
ShiftRegisters“) und meine natürlich den Bitzähler resetten. Das 
Datenblatt konnte ich leider nicht anhängen, aber unter 
http://www.phytec.com/pdf/datasheets/MPC5554_UM.pdf könnt ihr es euch 
anschauen.

Nochmal ein Versuch in kurz und Knapp:
Wie lösche (reset) ich den Bitzähler des ShiftRegister

Ich danke euch allen für die Hilfe

von holger (Gast)


Lesenswert?

>Nochmal ein Versuch in kurz und Knapp:
>Wie lösche (reset) ich den Bitzähler des ShiftRegister

Mit dem SS Pin. Der hat einen! Der Master löscht
den Bitzähler, und nicht der Slave selber.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter Lustig wrote:

> Ich habe eine
> Empfangs SPI (Slave) ohne ChipSelect-Leitung.

Dann hast du ein Fehldesign.  Chipselect gehört nun einmal zum
SPI-Protokoll dazu.

von Matthias (Gast)


Lesenswert?

Auszug aus dem Datenblatt:
--------------------------

20.1.4.2 Slave Mode
Slave mode allows the DSPI to communicate with SPI/DSI bus masters. In 
this mode the DSPI responds to externally controlled serial transfers. 
The DSPI cannot initiate serial transfers in slave mode. In slave mode, 
the SCK signal and the PCS0/SS signal are configured as inputs and 
provided by a bus master. PCS0/SS must be configured as input and pulled 
high. If the internal pull up is being used then the appropriate bits in 
the relevant SIU_PCR must be set (SIU_PCR [WPE=1], [WPS=1]). For more 
information, see [...]


Also der "PCS0/SS" sollte doch die SlaveSelect Funktion haben. Wo liegt 
dann das Problem?

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.