SPI Interrupt wird nicht ausgelöst nach Sendevorgang
Hallo an alle,
Ich habe ein Problem mit der SPI, und zwar wird nach dem Senden der Daten das Interrupt Flag nicht gesetzt. Es geht um ein dsPic33E.
Hier die SPI und Interrupt Einstellungen:
Code:
INTCON2bits.GIE=0;
IFS2bits.SPI2IF=0;//clear Interrupt flag
IEC2bits.SPI2IE=0;//disable interrupt
SPI2STATbits.SPIEN=0;
SPI2CON1bits.DISSCK=0;
SPI2CON1bits.DISSDO=0;
SPI2CON1bits.MODE16=0;
SPI2CON1bits.MSTEN=1;
SPI2CON1bits.SMP=0;
SPI2CON1bits.CKE=0;
SPI2CON1bits.CKP=0;
SPI2STATbits.SISEL=0b101; //interrupt when transmit is complete
IPC8bits.SPI2IP=0b001; //priorioty 1
SPI2STATbits.SPIEN=1; // ENABLE spi
SPI2BUF=0x00;//clear buf
SPI2STATbits.SPITBF=0; //clear BF
IFS2bits.SPI2IF=0;//clear int flag
INTCON2bits.GIE=1;
IEC2bits.SPI2IE=1; //enable interrupt
Hier der Sendevorgang :
Code:
CS=0;
SPI2BUF=0xAD;
CS=0; //no operation
while(IFS2bits.SPI2IF==0); // wait
IFS2bits.SPI2IF=0;//clear Int flag.
dummy=SPI2BUF;
CS=1;
Die SPI funktioniert, die Daten samt Takt kommen am Oszi an. JEDOCH wird das IFS2bits.SPI2IF Flag nie gesetzt.. Die Einstellungen sind genau so wie aus dem Microchip Datenblatt empfohlen.
Das Problem mit while(SPI2STATbits.SPITBF==1); ist, dass der gesetzt wird wenn der Buffer leer ist, jedoch arbeitet das Schieberegister dann noch, auch gut im Zeitdiagramm zu sehen.
Wer weiß was hier nicht stimmt ?
Vielen dank
Liebe Grüße,
steckplatte
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klebwax,
Vielen dank für deine Antwort.
Leider funktioniert auch das nicht. Ist auch gut im Zeitdiagramm zu erkennen. Möchte auch nicht mit vielen delays und NOP's arbeiten um diese paar Taktzyklen aufzufüllen bis das Receive buffer wieder auf low ist..mit einem Interrupt ist das viel sauberer und genauer.
Das Datenblatt schlägt ja auch vor mit einem Interrupt zu arbeiten, verstehe nur eben nicht warum das nicht funktioniert..
Und Danke für die Tipps, werde das berücksichtigen!
Liebe GrüßeAnhang 33428
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klebwax,
Oh tut mir leid, habe nicht gemerkt dass das Bild so klein geraten ist. Die gelben Marken waren um zu zeigen was ich eingestellt habe(CKE/CKP..)
Okay eventuell war mein Fehler dass ich vorher den Buffer nicht ausgelesen habe, damit der SPIRBF auf Low geht.
Werde dann das hier morgen ausprobieren, hoffe es klappt.
Code:
CS=0;
dummy=SPI2BUF; // auslesen damit SPIRBF auf Low geht
SPI2BUF=0xAD;
while(SPI2STATbits.SPIRBF==0)
; // warten bis SPIRBF wieder High wird
dummy=SPI2BUF;
CS=1;
Es wundert mich nur warum das mit dem Interrupt Flag nicht funktioniert. Hab im Microchip forum viele Problem Threads dazu gelesen, dass das Interrupt Flag einfach nicht gesetzt wird. Da kam auch die Lösung wegen den Remappable Pins, zuerst das SCK auf Eingang zu setzen und dann erst als Ausgang. Aber so richtig geklappt hat das noch nicht.
lG