R
RichardH
Guest
Salve
Sto cercando di orologio un continuo flusso di dati mediante la porta SPI (non ho mai letto nulla in cambio), idealmente, vorrei una parola a 16 bit con una interruzione per ricaricare la SPI1BUF ogni volta che è vuota.
Ho creato la SPI
TRISF = 0x0140;
CLKDIV = 0x0040;
SPI1CON1 = 0x013B;
SPI1CON2 = 0x0000;
SPI1STATbits.SISEL0 = 1; / / SISEL fissato a 101 per consentire interrupt uscita
SPI1STATbits.SISEL1 = 0;
SPI1STATbits.SISEL2 = 1;
SPI1CON1bits.MODE16 = 1; / /
mettete in modalità a 16 bit
SPI1STATbits.SPIEN = 1; / / Abilita la SPI
IFS0bits.SPI1IF = 1; / /
eliminiamo interrompere bandiera
IEC0bits.SPI1IE = 1; / / consentire interrompereinterrompere la mia routine
void __attribute__ ((__interrupt__, no_auto_psv)) _SPI1Interrupt (void)
(
SPI1BUF = dati [count ];
IFS0bits.SPI1IF = 0;
)
l'interrupt viene chiamato 2 o 3 volte, poi mai più .......... ma io sono la bandiera di compensazione, per cui non so il motivo per cui si ferma.
Ho cercato di aggiungere
IFS0bits.SPF1IF = 0;
per interrompere il servizio di routine, solo nel caso in cui mi è stato un errore (come lo sono io che non ha ricevuto nulla), ma questo non aiuta.
Tutte le idee che ho perso?
Grazie
RichardAggiunto dopo 5 ore 36 minuti
opo aver cercato varie cose, ho trovato che, se ho
SPI1STATbits.SPIROV = 0;
nel interrompere, quindi, sembra continuare poi con l'interrupt, tuttavia, non sono sicuro che questo è corretto come ho cui sembra di vedere ogni impulsi di clock e dati in uscita.
Qualsiasi idee?
Sto cercando di orologio un continuo flusso di dati mediante la porta SPI (non ho mai letto nulla in cambio), idealmente, vorrei una parola a 16 bit con una interruzione per ricaricare la SPI1BUF ogni volta che è vuota.
Ho creato la SPI
TRISF = 0x0140;
CLKDIV = 0x0040;
SPI1CON1 = 0x013B;
SPI1CON2 = 0x0000;
SPI1STATbits.SISEL0 = 1; / / SISEL fissato a 101 per consentire interrupt uscita
SPI1STATbits.SISEL1 = 0;
SPI1STATbits.SISEL2 = 1;
SPI1CON1bits.MODE16 = 1; / /
mettete in modalità a 16 bit
SPI1STATbits.SPIEN = 1; / / Abilita la SPI
IFS0bits.SPI1IF = 1; / /
eliminiamo interrompere bandiera
IEC0bits.SPI1IE = 1; / / consentire interrompereinterrompere la mia routine
void __attribute__ ((__interrupt__, no_auto_psv)) _SPI1Interrupt (void)
(
SPI1BUF = dati [count ];
IFS0bits.SPI1IF = 0;
)
l'interrupt viene chiamato 2 o 3 volte, poi mai più .......... ma io sono la bandiera di compensazione, per cui non so il motivo per cui si ferma.
Ho cercato di aggiungere
IFS0bits.SPF1IF = 0;
per interrompere il servizio di routine, solo nel caso in cui mi è stato un errore (come lo sono io che non ha ricevuto nulla), ma questo non aiuta.
Tutte le idee che ho perso?
Grazie
RichardAggiunto dopo 5 ore 36 minuti
SPI1STATbits.SPIROV = 0;
nel interrompere, quindi, sembra continuare poi con l'interrupt, tuttavia, non sono sicuro che questo è corretto come ho cui sembra di vedere ogni impulsi di clock e dati in uscita.
Qualsiasi idee?