Hallo zusammen, Auf welche Probleme stößt man, wenn man ein SPI Signal generieren will, ohne die eingebaute Schnittstelle? Oder gibt's wen, der hier schon was erstellt hat mit nem Pic18? Gruß, Marten
> Auf welche Probleme stößt man, wenn man ein SPI Signal generieren will, > ohne die eingebaute Schnittstelle? Man muß herausfinden wie man mit zwei Portpins wackelt.
Marten Mcgonahy schrieb: > Auf welche Probleme stößt man, wenn man ein SPI Signal generieren will, > ohne die eingebaute Schnittstelle? Abhängig von der gewünschte Übertragungsrate und dem was der PIC nebenher machen muss könnte es sein, dass der PIC zu langsam ist.
Marten Mcgonahy schrieb: > Auf welche Probleme stößt man, wenn man ein SPI Signal generieren will, > ohne die eingebaute Schnittstelle? Wenn man selbst nicht grafft hat, wie eine SPI Schnittstelle funktioniert
Gefunden :-) Hier ist ein Beispiel wie man Soft-SPI implementieren könnte:
1 | #define SOFT_SPI_SDO LATXbits.LATXy
|
2 | #define SOFT_SPI_SCK LATXbits.LATXy
|
3 | #define SOFT_SPI_SDI PORTXbits.RXy
|
4 | |
5 | unsigned char softSpiTransfer(unsigned char spi_data) |
6 | {
|
7 | unsigned char bit_cnt; |
8 | for(bit_cnt = 0; bit_cnt < 8; bit_cnt++) |
9 | {
|
10 | if(spi_data & 0x80) // Writes bit |
11 | SOFT_SPI_SDO = 1; |
12 | else
|
13 | SOFT_SPI_SDO = 0; |
14 | |
15 | spi_data = spi_data << 1; |
16 | |
17 | SOFT_SPI_SCK = 1; // SCK high |
18 | |
19 | if(SOFT_SPI_SDI) // Reads input |
20 | spi_data |= 1; |
21 | else
|
22 | spi_data &= ~1; |
23 | |
24 | SOFT_SPI_SCK = 0; // SCK low |
25 | }
|
26 | return(spi_data); |
27 | }
|
Hat zwar 100% CPU Auslastung während dem Senden/Empfangen, bei vielen Anwendungen wird das aber kein Problem sein.
Marten Mcgonahy schrieb: > Hallo zusammen, > Auf welche Probleme stößt man, wenn man ein SPI Signal generieren will, > ohne die eingebaute Schnittstelle? auf keine.
Max H. schrieb: > Hier ist ein Beispiel wie man Soft-SPI implementieren könnte: Hier noch eines:
1 | #define SPI_DOUT LATXbits.LATXy
|
2 | ...
|
3 | |
4 | #ifndef SPI_WAIT
|
5 | #define SPI_WAIT {_asm nop ... nop _endasm} //ndamit es nicht zu schnell geht ;-)
|
6 | #endif
|
7 | |
8 | #define SPI_OUT() { \
|
9 | SPI_DOUT = spiData.bit7; \
|
10 | SPI_CLK = 1;SPI_WAIT; \
|
11 | SPI_CLK = 0; \
|
12 | SPI_DOUT = spiData.bit6; \
|
13 | SPI_CLK = 1;SPI_WAIT; \
|
14 | SPI_CLK = 0; \
|
15 | SPI_DOUT = spiData.bit5; \
|
16 | SPI_CLK = 1;SPI_WAIT; \
|
17 | SPI_CLK = 0; \
|
18 | SPI_DOUT = spiData.bit4; \
|
19 | SPI_CLK = 1;SPI_WAIT; \
|
20 | SPI_CLK = 0; \
|
21 | SPI_DOUT = spiData.bit3; \
|
22 | SPI_CLK = 1;SPI_WAIT; \
|
23 | SPI_CLK = 0; \
|
24 | SPI_DOUT = spiData.bit2; \
|
25 | SPI_CLK = 1;SPI_WAIT; \
|
26 | SPI_CLK = 0; \
|
27 | SPI_DOUT = spiData.bit1; \
|
28 | SPI_CLK = 1;SPI_WAIT; \
|
29 | SPI_CLK = 0; \
|
30 | SPI_DOUT = spiData.bit0; \
|
31 | SPI_CLK = 1;SPI_WAIT; \
|
32 | SPI_CLK = 0; \
|
33 | }// end SPI_OUT()
|
34 | |
35 | #define SPI_IN() { \
|
36 | spiData.all = 0; \
|
37 | SPI_CLK = 1; \
|
38 | spiData.bit7 = SPI_DIN; \
|
39 | SPI_CLK = 0;SPI_WAIT; \
|
40 | SPI_CLK = 1; \
|
41 | spiData.bit6 = SPI_DIN; \
|
42 | SPI_CLK = 0;SPI_WAIT; \
|
43 | SPI_CLK = 1; \
|
44 | spiData.bit5 = SPI_DIN; \
|
45 | SPI_CLK = 0;SPI_WAIT; \
|
46 | SPI_CLK = 1; \
|
47 | spiData.bit4 = SPI_DIN; \
|
48 | SPI_CLK = 0;SPI_WAIT; \
|
49 | SPI_CLK = 1; \
|
50 | spiData.bit3 = SPI_DIN; \
|
51 | SPI_CLK = 0;SPI_WAIT; \
|
52 | SPI_CLK = 1; \
|
53 | spiData.bit2 = SPI_DIN; \
|
54 | SPI_CLK = 0;SPI_WAIT; \
|
55 | SPI_CLK = 1; \
|
56 | spiData.bit1 = SPI_DIN; \
|
57 | SPI_CLK = 0;SPI_WAIT; \
|
58 | SPI_CLK = 1; \
|
59 | spiData.bit0 = SPI_DIN; \
|
60 | SPI_CLK = 0;SPI_WAIT; \
|
61 | }// end SPI_IN()
|
spiData als Bitfeld ...
Morgen, OK... Stichwort Soft SPI ist also das richtige Wort dafür. Also f bzw Takt ist kein Problem, 1hz ist auch okay und reiner Master Mode. Bei 8 bis 16 bit spi sollte sich die Auslastung in Grenzen halten. Aber jetzt noch was anderes....wie geht man eigentlich mit Interrupts um, bei Generierung serieller Daten? Also auch wenn die mssp zum Einsatz kommt... Wenn nun mitten drin ein IR ommt, dann is die Übertragung ja wieder Muell. Also dann nach IR einfach nochmal schicken? Gruß, Marten
Das MSSP Modul arbeitet autonom und ist von einem IR nicht betroffen. Auch die Softwarelösung (auf der Massterseite) ist bei synchroner Übertragung (mit einem Taktsignal) unkritisch weil Zeitverzögerungen, welche durch Interrupts entstehen könnten, den Slave nicht interessieren. Der Slave kann sich nur am Takt orientieren. Der Zustand der Daten beim aktiven Takt wird durch zeitliche Verschiebungen nicht verfälscht.
Volker SchK schrieb: > Das MSSP Modul arbeitet autonom und ist von einem IR nicht betroffen. > > Auch die Softwarelösung (auf der Massterseite) ist bei synchroner > Übertragung (mit einem Taktsignal) unkritisch weil Zeitverzögerungen, > welche durch Interrupts entstehen könnten, den Slave nicht > interessieren. > Der Slave kann sich nur am Takt orientieren. > Der Zustand der Daten beim aktiven Takt wird durch zeitliche > Verschiebungen nicht verfälscht. Ok...gut zu wissen...das wusste ich nicht, dass der MSSP nicht unterbrochen wird. Und bei der SW-Lösung hast du schon recht, der Slave reagiert ja dann nur auf die Flanken...die kommt halt dann später, verfälscht aber jetzt nicht die Daten. Nur wenn es zeitkritisch wäre, wäre das natürlich ein Problem. Guter Input auf alle Fälle! Besten Dank euch!!!
Wenn du die Funktionsweise von SPI verstanden hättest, wäre deine Frage gegenstandslos. SPI ist im wesentlichen ein statisches Seriell zu Parallel-Schieberegister. Du legst an den Dateneingang ein Bit an und wackelst ein paar µs oder h später mit dem Clk-Pin. Das einzige Problem, worauf du achten musst, ist die Zeit zwischen Bitausgabe und Wackeln vom Clock. Wenn die Zeit zu kurz ist, kann es passieren, dass das Datenbit noch keinen gültigen Pegel hat. Allerdings bewegt sich das je nach Portpin etc. im Bereich kleiner 1 µs, also großer 1MHz. Die rein statische Arbeitsweise von SPI ist auch der große Vorteil gegenüber einer rein seriellen Übertragung. Denn dort gibt es festgelegte Bitlängen.
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.