Forum: Mikrocontroller und Digitale Elektronik PIC SPI Master Slave


von Diotor (Gast)


Lesenswert?

Hi,
ich benutze zwei PIC18F4550 zur Kommunikation via SPI. Der Master kann 
Daten an den Slave senden, was aber zurueckkommt ist nicht so gewollt.
Ich will dass der Slave den Empfang mit z.B. 0x99 bestaetig, das klappt 
aber nicht, es wird immer irgendwas empfangen.
Master:
1
                CS = 0; // Begin
2
    SSPBUF = 0x33;
3
    while (!SSPSTATbits.BF); // Wait until receive buffer full
4
    receive = SSPBUF; // Copy data to variable
5
    CS = 1; // End

Slave:
1
    while (1)
2
    {
3
      if(SSPSTATbits.BF) // 
4
      {
5
        receive = SSPBUF;  /a
6
              SSPBUF = dummy; // Send ok back (0x99) 
7
8
      }
9
        if (SSPCON1bits.WCOL)
10
      {
11
        SSPCON1bits.WCOL = 0;
12
      }
13
      if (SSPCON1bits.SSPOV)
14
      {
15
        SSPCON1bits.SSPOV = 0;
16
      }
17
    }

von Anja (Gast)


Lesenswert?

Und wo gibtst Du dem Master den Befehl den Wert vom Slave zu lesen?

Um die Antwort zu lesen muß der Master nochmal ein Byte schicken damit 
der Slave getaktet wird.

Gruß Anja

von Diotor (Gast)


Lesenswert?

Leider kommt immer noch Random zurueck.

von Dieter W. (dds5)


Lesenswert?

SPI ist zwangsweise eine Vollduplex Kommunikation, es wird immer 
gleichzeitig gesendet und empfangen.

Der Master muss nach dem Schreiben der Daten an den Slave mindestens so 
lange warten, bis dieser die Antwort in sein SPI-Datenregister 
geschrieben hat.
Erst danach ist noch ein Dummybyte fällig, während dessen Aussendung 
gleichzeitig die Antwort eingelesen wird.

von Diotor (Gast)


Lesenswert?

Wird das Warten nicht mit while (!SSPSTATbits.BF); erledigt?
Welches Bit muss ich dann abfragen?

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.