Zitat Zitat von steckplatte Beitrag anzeigen
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.
Hallo,

ich hab zwar gerade einen PIC24EPxxx am Wickel, der sollte da identisch sein, komme aber nicht dazu etwas zu testen. Ich würd das mal anders probieren und das Receivebuffer-Flag testen

Code:
uint8_t Send( uint8_t data)
{
    int temp;
    CS = 0;
    temp = SPI1BUF;                // empty receive buffer
    SPI1BUF = data;                  // data into buffer
    while( !SPI1STATbits.SPIRBF ) {   // all bits are shifted, receivebuffer is full
        ;
    }
    CS = 1;
    return SPI1BUF;
}
Wenn der Receivebuffer am Anfang leer ist, kann er erst voll sein, wenn alle Bits einmal durchgeschoben worden sind.

Noch zwei Hinweise deinen Code für andere lesbarer zu machen: wenn hier mit CS=0; //no operation gemeint ist, was der Kommentar sagt, schreib Nop(): hin. Sonst muß man dauernd überlegen, warum hier CS behandelt wird. Und rück bei while(IFS2bits.SPI2IF==0); // wait
wenigstens das Semikolon auf die nächste Zeile. Dann erkennt jemand, der den Code nicht gut kennt (und das bist auch du selbst in 3 Monaten) sofort die Schleife. Ich schreib das normalerweise noch etwas ausführlicher. Dann kann man da auch mal schnell irgendwelchen (Debug)Code einfügen und auch wieder rauskommentieren.

Vielleicht hilfts ja

MfG Klebwax