SPI Software

Gast #4789606
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
Gast #4789618
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.
#4789646
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.
#4789720
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
    }
Gast #4789726
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.
Gast #4789745
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
(Firma: Vescomp) #4789860
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.
#4790081
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.
Gast #4790104
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!
Gast #4790187
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
Gast #4790202
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?
Gast #4790224
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.
Gast #4790247
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?
(Firma: Vescomp) #4790298
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.
Gast #4790325
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?
Gast #4790714
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren