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
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?
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) { }
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?
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)?
Um zu wissen, wann Receive/Tranceive fertig ist. Aber das hat super geholfen, Vielen Dank ! :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.