SPI mit PIC ohne MSSP

#3980426
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.
#3980448
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 ...
#3980653
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
#3980726
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.
#3981337
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!!!
#3981353
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.

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