Spezielle Fragen zur Software SPI

Gast #3898863
Lesenswert?

Hallo,

um kompatibel zum bleiben zur gegenüber liegenden HW SPI habe ich CPOL=1 
und CPHA = 1 gewählt, d.h. die Daten werden auf der steigenden Flanke 
gesampled und nach der fallenden Flanke aktualsiert.

Ein SPI Sniffer erkennt auch die Daten einwandfrei und stellt sie 
richtig dar. Was mir noch "wahlfrei" zu seien scheint ist, dass ich mir 
aktuell aussuchen kann, ob die neuen Masterdaten VOR oder NACH der 
ersten fallenden Flanke aktualisiert werden und ob ich MOSI nach der 
steigenden Flanke auf 0 zurück nehme oder nicht. Aktuell bleibt SDO da 
wo es steht nach einem Bit und wird erst vor der neuen Flanke aufs 
nächste Datum gesetzt. Setzt man es zurück sind oben nur noch Nadeln zu 
sehen, statt Flächen.

Die nächste Idee wäre auf beiden Flanken zu samplen aber eines nach dem 
anderen.

Gibt es da Konventionen?
1
uint8_t spi_transmit(uint8_t data)
2
{
3

4
    uint8_t inbyte;
5
    uint8_t i;
6

7
    STI_GPIP = STI_GPIP | SCLK;     // Clock = HIGH
8
    inbyte   = 0;
9
    
10
    CLI;
11
    for (i=0;i<8;i++)
12
    {
13
       // ----- Clock LOW  (Slave sampled) ------
14
        #ifdef DELAY_ON
15
         delay8(PAUSE);
16
        #endif 
17
         STI_GPIP = STI_GPIP & ~SCLK;
18

19
        // // ----- Bit out SDO  ------
20
        if (data & 0x80)
21
           STI_GPIP = STI_GPIP | SDO;      // "1" out
22
        else 
23
           STI_GPIP = STI_GPIP & ~SDO;     // "0" out
24

25
         // // ----- Clock HIGH  ------
26
        #ifdef DELAY_ON
27
         delay8(PAUSE);
28
        #endif  
29
         STI_GPIP = STI_GPIP | SCLK;
30
         
31
        // // ----- Sample Bit In SDI  ------
32
         if (STI_GPIP & SDI)      // Eine 1 Input?
33
              inbyte |=  0x01;
34
              
35
        // 0 muss nicht berücksichtigt werden, Inbyte = 0
36
              
37
        // Nächste Position, MSB zuletzt
38
        data   <<= 1;        
39
        inbyte <<= 1;
40
    }
41
    STI_GPIP = STI_GPIP & ~SDO;        // "0" out
42
    STI_GPIP = STI_GPIP | SCLK;        // SCLK = 1
43
    
44
    EI;
45
    return (inbyte);
46
}
Angehängte Dateien:
(Firma: Vescomp) #3898923
Lesenswert?

Christian J. schrieb:
> um kompatibel zum bleiben zur gegenüber liegenden HW SPI habe ich CPOL=1
> und CPHA = 1 gewählt, d.h. die Daten werden auf der steigenden Flanke
> gesampled und nach der fallenden Flanke aktualsiert.

 Solange du nicht mit ISR arbeitest, gibt es keine Flanken, sondern
 Pegel.
 Als Master erzeugst du den Takt selbst, ist also uninteressant.

 Als Slave (oder Sniffer) wartest du auf CLK=High und ubernimmst den
 aktuellen SDA Zustand.

 Sehe da keinen Problem, ausser dass man bei SPI normalerweise zuerst
 MSB rausschickt, also ist dein Kommentar falsch.
Gast #3898955
Lesenswert?

Marc Vesely schrieb:
> Sehe da keinen Problem, ausser dass man bei SPI normalerweise zuerst
>  MSB rausschickt, also ist dein Kommentar falsch.

Danke, der ist noch übrig geblieben, es war zuerst anders herum. Also 
lassen wir es wie es ist, ich arbeite ohne ISR, da die uC während der 
übertragung nichts anderes zu tun haben, auch nicht Bügeln oder Wäsche 
waschen.

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