Forum: Mikrocontroller und Digitale Elektronik SPI Software


von BUS (Gast)


Lesenswert?

Hallo,

wenn ich eine SPI Schnittstelle per Software realisieren möchte, wie 
gehe ich da vor?

Ein paar Gedanken habe ich mir schon gemacht, hier die Fragen die mir 
gerade im Kopf herumkreisen:

Ich müsste ja eine Clock erzeugen sagen wir mal 1kHz für das Clock 
Signal.
Dann muss ich einen weiteren Pin als MOSI toggeln. Benötigt der Pin dann 
1kHz Frequenz für die Bits, oder muss ich die Bits mit 8kHz toggeln, 
Sprich: muss ich pro Clockflankenwechsel einen Bitflankenwechsel 
realisieren, oder muss der MISO ein Byte innerhalb eines Clockzyklus 
reinschieben und damit 8x so schnell sein, wie das Clocksignal?


Und noch eine Frage:
Da die Frequenz ja von dem Master vorgegeben wird, müsste es doch egal 
sein, ob die Taktrate stets gleichbleibend ist oder das eine oder andere 
Bit länger dauert als das andere, ist das richtig?

mfg

von Codix (Gast)


Lesenswert?


von W.A. (Gast)


Lesenswert?

BUS schrieb:
> Benötigt der Pin dann
> 1kHz Frequenz für die Bits, oder muss ich die Bits mit 8kHz toggeln,
> Sprich: muss ich pro Clockflankenwechsel einen Bitflankenwechsel
> realisieren, oder muss der MISO ein Byte innerhalb eines Clockzyklus
> reinschieben und damit 8x so schnell sein, wie das Clocksignal?

Warum guckst du nicht einfach in das Datenblatt eines IC mit SPI 
Interface? Da findest du die tollsten Zeitdiagramme zu den Signalen. Und 
lass dich nicht davon ins Boxhorn jagen, dass die mitunter 
unterschiedlich aussehen - es gibt verschiedene SPI Modi.

von Deutschlehrer (Gast)


Lesenswert?

W.A. schrieb:
> das Datenblatt eines IC mit SPI Interface

SPI Interface
ISR Routine
LCD Display
SDR Radio
Weisses Schimmel-Pferd
.......

von BUS (Gast)


Lesenswert?

Leute, so unkonkret waren meine Fragen nun wirklich nicht, dass hier 
dieser Ton angeschlagen werden müsste.

von Thomas E. (thomase)


Lesenswert?

Du legst das 1. Bit, üblicherweise das Highbit, an deinen Mosi-Pin, dann 
wackelst du einmal am Clock, nächstes Bit, Clock wackeln usw..
Nach 8 Bits und 8 Clocks ist dein Byte drüben.

Teste das mit einem 595er Schieberegister, einmal Latch Up und du hast 
dein erstes Erfolgserlebnis.

: Bearbeitet durch User
von Horst V. (hoschti)


Lesenswert?

Und noch zur Verdeutlichung:
Ja, SPI ist per Definition voll statisch. D.h. man könnte die Signale 
auch mit Schaltern o.ä. erzeugen.

von Jobst M. (jobstens-de)


Lesenswert?

Ich habe da schon mal etwas vorbereitet :-)

Beitrag "RS232 zu SPI"



Gruß

Jobst

von Wilhelm M. (wimalopaan)


Lesenswert?

Wie schon gesagt: SPI geht von 0Hz bis xMHz, solange der Empfänger 
mitkommt. Auch muss der Takt nicht konstant sein: wichtig ist nur, dass 
man bei der passenden Flanke des Taktes das richtige Level an Data hast.
Hier ein Schnipsel eines Masters ohne etwas zu empfangen.
1
   static bool put(uint8_t value) {
2
        if (useDelay) Util::delay(Config::SoftSpiMaster::pulseDelay);
3
        CSPin::low();
4
        for(uint8_t i = 0; i < 8; ++i) {
5
            if (useDelay) Util::delay(Config::SoftSpiMaster::pulseDelay);
6
            ClockPin::low();
7
            if (value & 0x80) { 
8
                DataPin::high();
9
            }
10
            else {
11
                DataPin::low();
12
            }
13
            if (useDelay) Util::delay(Config::SoftSpiMaster::pulseDelay);
14
            ClockPin::high();
15
            value <<= 1;
16
        }
17
        ClockPin::low();
18
        if (useDelay) Util::delay(Config::SoftSpiMaster::pulseDelay);
19
        CSPin::high();
20
        DataPin::low();
21
        return true;
22
    }

von W.A. (Gast)


Lesenswert?

Deutschlehrer schrieb:
> LCD Display

Wenn wir schon bei solchen Details sind:

Liquid Crystal Devices
http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0470032022.html

LED Display
?

von falscherFuß (Gast)


Lesenswert?

Thomas E. schrieb:
> wackelst du einmal am Clock, nächstes Bit, Clock wackeln usw..
> Nach 8 Bits und 8 Clocks ist dein Byte drüben.

Hähhh? An der Uhr wackeln und nach 8 runtergefallenen Uhren ist mein 
Byte drüben? Oder am Takt wackeln? Ist so ein Takt nicht eher was 
regelmäßiges und nicht von Wackelkontakten bestimmt.

Man kann ja nur hoffen, daß der TE son verquasten und Takflankenfreien 
Beitrag ignoriert.

von MiWi (Gast)


Lesenswert?

BUS schrieb:
> Leute, so unkonkret waren meine Fragen nun wirklich nicht, dass hier
> dieser Ton angeschlagen werden müsste.

Deine Frage zeigt, daß Du schlicht und einfach unhöflich bist weil Du 
andere das machen lassen willst was Deine eigene Aufgabe ist: sich erst 
einmal selber schlau machen:

Denn in defakto jedem Datenblatt eines SPI-tauglichen Teils ist auf den 
ersten Blick ersichtlich wie das Timing vom SPI aussieht. Und wenn Du 
zufälligerweise im www das eine Datenblatt gefunden hast in dem das 
nicht drinnensteht schaust Du dir das in der Wikipedia an.

Daher - selbst wenn die Frage im ersten Moment sehr konkret war - sie 
ist auf den 2. Blick ziemlich unhöflich.

MiWi

von Wilhelm M. (wimalopaan)


Lesenswert?

Ich finde die Frage nicht unhöflich: es zwingt niemanden, sich diesen 
Thread anzusehen oder gar zu antworten.

Es ist eben eine Anfängerfrage. Da kann man einen entsprechenden Hinweis 
geben oder einfach der Geschichte seinen Lauf lassen ...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

falscherFuß schrieb:
> Hähhh? An der Uhr wackeln und nach 8 runtergefallenen Uhren ist mein
> Byte drüben? Oder am Takt wackeln? Ist so ein Takt nicht eher was
> regelmäßiges und nicht von Wackelkontakten bestimmt.

 Nein, beim Software-SPI nicht.
 Du kannst mit 8MHz anfangen und mit 8Hz beenden, es macht absolut
 keinen Unterschied, ausser in der Übertragungszeit, natürlich.

falscherFuß schrieb:
> Man kann ja nur hoffen, daß der TE son verquasten und Takflankenfreien
> Beitrag ignoriert.

 Nein, man kann nur hoffen, dass der TO deinen Beitrag ignoriert.

von S. R. (svenska)


Lesenswert?

Wilhelm M. schrieb:
> Es ist eben eine Anfängerfrage. Da kann man einen entsprechenden Hinweis
> geben oder einfach der Geschichte seinen Lauf lassen ...

Eher eine Hausaufgabe, wenn man den Nachbarthread berücksichtigt.

von F. F. (foldi)


Lesenswert?

Thomas E. schrieb:
> Du legst das 1. Bit, üblicherweise das Highbit, an deinen Mosi-Pin, dann
> wackelst du einmal am Clock, nächstes Bit, Clock wackeln usw..
> Nach 8 Bits und 8 Clocks ist dein Byte drüben.

Thomas, das ist ja wohl die allergeilste Beschreibung die ich je las.

von F. F. (foldi)


Lesenswert?

MiWi schrieb:
> Deine Frage zeigt, daß Du schlicht und einfach unhöflich bist weil Du
> andere das machen lassen willst was Deine eigene Aufgabe ist: sich erst
> einmal selber schlau machen:

Grundsätzlich sollte man sich schlau machen. Aber deine Aussage zeigt 
nur, dass du entweder noch sehr unreif und jung bist oder dein Weitblick 
nicht so sehr weit reicht.

Gerade ein Anfänger braucht doch einmal einen richtigen Impuls zum 
suchen der richtigen Dokumente. Es gibt so unendlich viel, über jede 
Sache zu lesen, da weiß ein Anfänger doch oft gar nicht wo er gucken 
soll.

von 123457890 (Gast)


Lesenswert?

F. F. schrieb:
> Gerade ein Anfänger braucht doch einmal einen richtigen Impuls zum
> suchen der richtigen Dokumente. Es gibt so unendlich viel, über jede
> Sache zu lesen, da weiß ein Anfänger doch oft gar nicht wo er gucken
> soll.

Guckst du hier:
https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
Guckst du hier auch noch:
https://de.wikipedia.org/wiki/Serial_Peripheral_Interface
Guckst du hier weiter:
http://www.mct.net/faq/spi.html
Kannst du auch gucken hier:
http://www.mct.de/faq/spi.html
Hier noch mehr gucken:
https://downloadcenter.intel.com/download/22112
Schau an:
http://www.byteparadigm.com/applications/introduction-to-i2c-and-spi-protocols/?/article/AA-00255/22/Introduction-to-SPI-and-IC-protocols.html
Lesen hier:
http://www.corelis.com/education/SPI_Tutorial.htm
...
Eine Suchmaschine hilft gucken!

von F. F. (foldi)


Lesenswert?

123457890 schrieb:
> Guckst du hier:

Ich war nicht der Fragesteller.

von 123457890 (Gast)


Lesenswert?

F. F. schrieb:
> 123457890 schrieb:
>> Guckst du hier:
>
> Ich war nicht der Fragesteller.

Sorry, aber vielleicht hilft ihm die Antwort trotzdem!

von MiWi (Gast)


Lesenswert?

F. F. schrieb:
> MiWi schrieb:
>> Deine Frage zeigt, daß Du schlicht und einfach unhöflich bist weil Du
>> andere das machen lassen willst was Deine eigene Aufgabe ist: sich erst
>> einmal selber schlau machen:
>
> Grundsätzlich sollte man sich schlau machen. Aber deine Aussage zeigt
> nur, dass du entweder noch sehr unreif und jung

Aha.

> bist oder dein Weitblick nicht so sehr weit reicht.

Aha.

>
> Gerade ein Anfänger braucht doch einmal einen richtigen Impuls zum
> suchen der richtigen Dokumente. Es gibt so unendlich viel, über jede
> Sache zu lesen, da weiß ein Anfänger doch oft gar nicht wo er gucken
> soll.

Findest Du es wirklcih schwierig mit Google nach SPI zu suchen, den Link 
der Wikipedia zu öffnen und dann die in den Commons gezeigten 
Timingdiagramme anzuschauen und darüber nachzudenken, wie das gemeint 
ist?

Ich erwarte von meinen Schülern, daß sie sich vorher mit den Fragen erst 
einmal selber beschäftigt haben und die techn Resource Internet 
entsprechend genutzt haben.

Mag sein, daß das für Dich schon zu sehr fordernd ist den TO 
aufzufordern zu zeigen was er schon hat, für mich ist es eine (durchaus 
grantige) Hilfe zu Selbsthilfe.

Für mich sind solche Fragen "Mama ich will" und dann rennt die Meute und 
der TO schaut entspannt auf seinem PC zu .... funktioniert auch wie man 
an dem Thread sieht.

BUS hat sich bis dato mit keinerlei Rückfrage wieder gemeldet...

MiWi

von falscherFuß (Gast)


Lesenswert?

Marc V. schrieb:
> falscherFuß schrieb:
>> Hähhh? An der Uhr wackeln und nach 8 runtergefallenen Uhren ist mein
>> Byte drüben? Oder am Takt wackeln? Ist so ein Takt nicht eher was
>> regelmäßiges und nicht von Wackelkontakten bestimmt.
>
>  Nein, beim Software-SPI nicht.
>  Du kannst mit 8MHz anfangen und mit 8Hz beenden, es macht absolut
>  keinen Unterschied, ausser in der Übertragungszeit, natürlich.

Du bist auch eher von übersichtlichem Verständnis geplagt oder?

von F. F. (foldi)


Lesenswert?

MiWi schrieb:
> BUS hat sich bis dato mit keinerlei Rückfrage wieder gemeldet...

Gibt dir natürlich in gewisser Weise recht ...

von Wolfgang (Gast)


Lesenswert?

falscherFuß schrieb:
> Du bist auch eher von übersichtlichem Verständnis geplagt oder?

Was verstehst du an der Aussage nicht?

Wer im Glaushaus sitzt ...

von falscherFuß (Gast)


Lesenswert?

Wolfgang schrieb:
> Was verstehst du an der Aussage nicht?

An welcher Aussage?

von Noch nicht Rentner (Gast)


Lesenswert?

Nochmals, es braucht keine verlinkten Seiten, oder so'n quatsch.

CS=0;
Clock=0;
Data=(Daten and $01);
clock=1;
Daten=shiftleft(Daten);
clock=0;
Data=(Daten and $01);
clock=1;
Daten=shiftleft(Daten);
clock=0;
..

fertig. Kannst mit dem Timingdiagramm im Datenblatt vergleichen.

von falscher Fuß (Gast)


Lesenswert?

Noch nicht Rentner schrieb:
> Nochmals, es braucht keine verlinkten Seiten, oder so'n quatsch.
>
> CS=0;
> Clock=0;
> Data=(Daten and $01);
> clock=1;
> Daten=shiftleft(Daten);
> clock=0;
> Data=(Daten and $01);
> clock=1;
> Daten=shiftleft(Daten);
> clock=0;
> ..

Wär nicht schlecht, wenn du für unsere Anfänger noch dazuschreiben 
würdest, welcher der vier Moden das sein soll und ob LSB oder MSB 
zuerst.

> fertig. Kannst mit dem Timingdiagramm im Datenblatt vergleichen.

Welches Datenblatt? Wurde vom TE schon ein Datenblatt erwähnt?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

falscher Fuß schrieb:
> Noch nicht Rentner schrieb:
>> Nochmals, es braucht keine verlinkten Seiten, oder so'n quatsch.
>
> Wär nicht schlecht, wenn du für unsere Anfänger noch dazuschreiben
> würdest, welcher der vier Moden das sein soll und ob LSB oder MSB
> zuerst.

 Wär nicht schlecht, wenn man nur über Sachen reden würde, von
 denen man wenigstens ein bisschen Ahnung hat.

 Und das gilt für euch beide.

 Für dich:
 Wenn man nach links schiebt, ist das MSB zuerst.

 Für Noch nicht Rentner:
 Aber, wenn man nach links schiebt, wird kein AND mit 0x01 ausgeführt.
 In Assembler wird überhaupt kein AND benötigt, in C wird das dann mit
 0x80 und bestimmt nicht mit 0x01 gemacht.

: Bearbeitet durch User
von falscherFuß (Gast)


Lesenswert?

Marc V. schrieb:
>  Für dich: (ich glaube er meint mich)
>  Wenn man nach links schiebt, ist das MSB zuerst.
>
>  Für Noch nicht Rentner:
>  Aber, wenn man nach links schiebt, wird kein AND mit 0x01 ausgeführt.
>  In Assembler wird überhaupt kein AND benötigt, in C wird das dann mit
>  0x80 und bestimmt nicht mit 0x01 gemacht.

Wenn man nach rechts schiebt ist das dann LSB zuerst? und würde dann 
mit 0x01 in C verknüpft?

von Markus (Gast)


Lesenswert?

Hier gibt es auch noch ein schönes Code-Beispiel:
https://www.maximintegrated.com/en/app-notes/index.mvp/id/4184

von Wilhelm M. (wimalopaan)


Lesenswert?

Das Ganze stand ja schon weiter oben in einem Post ... Code lesen ist 
meistens wichtiger als Code schreiben ;-)

von A. S. (Gast)


Lesenswert?

Ich kann mir beim UP nicht vorstellen, dass es hier jemals um eine 
Realisierung gegangen ist. Es kann nur eine Hausaufgabe sein. Das jemand 
einen SPI in Software implementieren will und fragt, ob 8Bit während 
einer Clock rausgehauen werden, halte ich für unwahrscheinlich.

Die Antworten sind daher:

> Dann muss ich einen weiteren Pin als MOSI toggeln. Benötigt der Pin dann
> 1kHz Frequenz für die Bits, oder muss ich die Bits mit 8kHz toggeln
weder noch. Für das nächste Bit wird nur getoggelt, wenn es anders ist. 
Und Clock wird je Bit 2 Mal getoggelt. Maximal hat der MOSI damit die 
halbe Frequenz des Clock-Signals.

> Sprich: muss ich pro Clockflankenwechsel einen Bitflankenwechsel
> realisieren, oder muss der MISO ein Byte innerhalb eines Clockzyklus
> reinschieben und damit 8x so schnell sein, wie das Clocksignal?
beides nicht. Für jedes Bit brauchst Du 2 Clockflankenwechsel, während 
ein Bit 0 oder 1 Flankenwechsel hat.

> Und noch eine Frage:
> Da die Frequenz ja von dem Master vorgegeben wird, müsste es doch egal
> sein, ob die Taktrate stets gleichbleibend ist oder das eine oder andere
> Bit länger dauert als das andere, ist das richtig?
Ja.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

123457890 schrieb:
> Eine Suchmaschine hilft gucken!
Das Internet ist für uns alle Neuland!

von Wolfgang (Gast)


Lesenswert?

falscherFuß schrieb:
> An welcher Aussage?

Marc V. schrieb:
> Du kannst mit 8MHz anfangen und mit 8Hz beenden, es macht absolut
> keinen Unterschied, ausser in der Übertragungszeit, natürlich.

von Dr Emmet Brown jr. sr. (Gast)


Lesenswert?

google mit "spi bit bang" liefert auf der ersten Seite u.a. das:
http://www.avrfreaks.net/forum/spi-bitbang-implementation

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Dr Emmet Brown jr. sr. schrieb:
> google mit "spi bit bang" liefert auf der ersten Seite u.a. das:
> http://www.avrfreaks.net/forum/spi-bitbang-implementation

 Wow, ausgezeichnetes Beispiel.
 Da versucht der Slave den Clock zu setzen...

von Dr Emmet Brown jr. sr. (Gast)


Lesenswert?

Marc V. schrieb:
> Dr Emmet Brown jr. sr. schrieb:
>> google mit "spi bit bang" liefert auf der ersten Seite u.a. das:
>> http://www.avrfreaks.net/forum/spi-bitbang-implementation
>
>  Wow, ausgezeichnetes Beispiel.
>  Da versucht der Slave den Clock zu setzen...

Die Beispiele aus denen man beides -richtig und falsch- lernen kann, 
sind die Besten ;-)

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.