Hallo zusammen,
wie am Titel zu erkennen, habe auch ich gerade Probleme mit SPI. Es handelt sich bei mir um einen PIC18, der als SPI-Slave mit SS betrieben wird, interner Clock (16MHz).
Problem: Der interrupt wird viel zu spät ausgelöst: es vergehen 11,5µs zwischen <jetzt müsste er auslösen> und <der Ausgang RD5 wurde umgeschalten>. RD5=0 bleibt für 10µs erhalten.
Umgehe ich die interrupt-Routine und baue in der Main-Routine eine Abfrage des PIR1bits.SSPIF == 1 und schalte dann den Ausgang RD5=0, geschieht das mit einem Verzug von etwa 1,1-2,4µs (Jitter natürlich deutlich stärker). RD5 bleibt ca. 1,5µs auf low.
Code:
void spi_init(void) {
INTCON = 0; // Disable all interrupts
PIE1 = 0;
PIR1 = 0;
// ----------------------------
SSPCON1bits.SSPEN = 0; // SSPCON1[5]; Allow Programming of serial port
SSPCON1bits.CKP = 1; // SSPCON1[4]; Clock Polarity Select bit; Idle state for clock is a HIGH level
SSPCON1bits.SSPM3 = 0; // SSPCON1[3]; Synchronous Serial Port Mode Select bits
SSPCON1bits.SSPM2 = 1; // SSPCON1[2]; [3-0] 0100 = SPI Slave mode, clock = SCK pin, SS pin control enabled
SSPCON1bits.SSPM1 = 0; // SSPCON1[1];
SSPCON1bits.SSPM0 = 0; // SSPCON1[0];
// ----------------------------
SSPSTATbits.SMP = 0; // SSPSTAT[7]; Input data sampled at middle data output time
SSPSTATbits.CKE = 0; // SSPSTAT[6]; Transmit occurs on active to idle clock state
// ----------------------------
PIE1bits.SSPIE = 1;
PIR1bits.SSPIF = 0; // Master Synchronous Serial Port Interrupt Flag bit (must be cleared by Software)
// 0 = Waiting to transmit/receive
INTCONbits.PEIE = 1; // Enable Peripheral interupts
INTCONbits.GIE = 1; // Global Interupt enable
SSPCON1bits.SSPEN = 1; // End programming and Start serial port
}
ISR:
Code:
void interrupt isr(void)
{
if (PIR1bits.SSPIF == 1)
{
spi_reg_addr=SSPBUF;
SSPBUF=0x00;
RD5=0;
PIR1bits.SSPIF = 0;
}
}
Main:
Code:
void main(){
pic_init();
spi_init();
while(1)
{
PORTDbits.RD5=1;
}
}
Woran kann es liegen, dass die Interrupt-Routine so spät auslöst bzw. wie kann man es beschleunigen?
Grüß,
NRicola
Lesezeichen