SPI mit PIC ohne MSSP

Gast
> 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.
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.
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 ...
OP
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.
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.