Forum: Mikrocontroller und Digitale Elektronik SPI mit PIC ohne MSSP


von Marten M. (mcgonahy148)


Lesenswert?

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

von Holger (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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.

von Peter X. (peter_x)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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.

von Joe F. (easylife)


Lesenswert?

Marten Mcgonahy schrieb:
> Hallo zusammen,
> Auf welche Probleme stößt man, wenn man ein SPI Signal generieren will,
> ohne die eingebaute Schnittstelle?

auf keine.

von Volker S. (vloki)


Lesenswert?

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

von Marten M. (mcgonahy148)


Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

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.

von Marten M. (mcgonahy148)


Lesenswert?

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!!!

von Jens P. (picler)


Lesenswert?

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
Noch kein Account? Hier anmelden.