Forum: Mikrocontroller und Digitale Elektronik Spezielle Fragen zur Software SPI


von Christian J. (Gast)


Angehängte Dateien:

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
}

von Marc V. (Firma: Vescomp) (logarithmus)


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.

von Christian J. (Gast)


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.

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.