Forum: Mikrocontroller und Digitale Elektronik Programm hängt nach SPI Send


von Alex M. (alex_m83)


Lesenswert?

Hallo Zusammen,

ich habe gerade ein Problem mit SPI Module.
Ich habe zwei PICs (SPI Master + SPI Slave).

Sobald ich ein Byte per SPI verschicke, hängt das ganze Programm von PIC 
Master SPI.
Interessanterweise PIC Slave SPI bekommt das richtige Byte und läuft 
weiter.


Weißt jemand, was in der SPI Kommunikation falsch läuft ?

Hier isr der Code:
Master:
SC_SCK_TRIS = 0;
SC_SDO_TRIS = 0;
SC_SDI_TRIS  = 1;

SC_SPISTATbits.CKE = 1;
SC_SPISTATbits.SMP = 0;
SSP1CON1bits.CKP = 1;
// F(spi)= Fsys/16;
SSP1CON1bits.SSPM = 1;
SSP1CON1bits.SSPEN = 1;
//Enable Interrupts
RCONbits.IPEN = 1;        // Enable interrupt priorities
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
INTCONbits.PEIE = 1;

IPR1bits.SSP1IP = 0;
SC_SPI_IE_FLAG = 1;
SC_SPI_INT_FLAG = 0;

// send
void SPIPut(BYTE byte)
{
    BYTE i;
    SC_SSPBUF = byte;
    while(!SC_SPI_INT_FLAG);
  SC_SPI_INT_FLAG = 0;
    i= SC_SSPBUF;

}




Slave:
SC_SCK_TRIS = 1;
SC_SDI_TRIS  = 1;
SC_SDO_TRIS = 0;
PIC_CS_TRIS  = 1;

SC_SPISTATbits.CKE = 1;
//SMP must be cleared when SPI is used in Slave mode
SC_SPISTATbits.SMP = 0;
SSP1CON1bits.CKP = 1;
// F(spi)= Fsys/16;
SSP1CON1bits.SSPM = 4;

IPR1bits.SSP1IP = 0;
SC_SPI_IE_FLAG = 1;
SC_SPI_INT_FLAG = 0;

SSP1CON1bits.SSPEN = 1;
RCONbits.IPEN = 1;        // Enable interrupt priorities
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;


// read
BYTE SPIGet()
{

    BYTE byte;

    byte = SC_SSPBUF;
    while(!SC_SPI_INT_FLAG);
  SC_SPI_INT_FLAG = 0;

    return byte;
}




Danke & Grüße
Alex

von Max H. (hartl192)


Lesenswert?

alex m. schrieb:
> Ich habe zwei PICs
Welche PICs?


> INTCONbits.GIEH = 1;
> INTCONbits.GIEL = 1;
> INTCONbits.PEIE = 1;
>
> IPR1bits.SSP1IP = 0;
> SC_SPI_IE_FLAG = 1;
Wie sieht die ISR aus?

von Alex M. (alex_m83)


Lesenswert?

Das sind zwei PIC18.

Die ISR ist momentan leer, weil ich Flag für SSP1IF gleich in SPIPut auf 
O setze.

#pragma interruptlow LowISR
    void LowISR(void)
    {

    }


#pragma interruptlow HighISR
    void HighISR(void)
    {

    }

von Max H. (hartl192)


Lesenswert?

Was wenn du das SC_SPI_IE_FLAG auf null setzt?

von Alex M. (alex_m83)


Lesenswert?

Mit dem aktiviere ich SPI Interrupt, was für einen Sinn mach das?

von Max H. (hartl192)


Lesenswert?

alex m. schrieb:
> Mit dem aktiviere ich SPI Interrupt, was für einen Sinn mach das?
Welchen Sinn hat das SPI Interrupt wenn du eine leere ISR hast?

von Achim S. (Gast)


Lesenswert?

Max H. schrieb:
> Welchen Sinn hat das SPI Interrupt wenn du eine leere ISR hast?

vielleicht hilft die leere Routine, das SC_SPI_INT_FLAG zu löschen, 
bevor es in SPIPut abgefragt werden kann (so dass SPIPut ewig auf das 
Flag wartet und sich aufhängt)?

von Alex M. (alex_m83)


Lesenswert?

Um zu wissen, wann Receive/Tranceive fertig ist.

Aber das hat super geholfen, Vielen Dank ! :)

von Max H. (hartl192)


Lesenswert?

alex m. schrieb:
> Um zu wissen, wann Receive/Tranceive fertig ist.
>
> Aber das hat super geholfen, Vielen Dank ! :)

Dazu brauchst du aber kein aktiviertes Interrupt, vor allem nicht wenn 
die ISR eh leer ist.

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.