Danke für den Input, das Problem war fast wie du sagst:
Das SSBUF Register muss erst mit dem zu sendenden Byte geladen werden und dann muss man auf das SSPIF Bit warten.
Ich habe das jetzt so gelöst:
Code:
void spi_send(unsigned char data){
LATCbits.LATC2 = 0; // set CS low
SSPBUF = data; // write the data byte to be transmitted to SSPBUF
while(!PIR1bits.SSPIF); // wait for SSPIF bit to be set
while(!SSPSTATbits.BF); // wait for BF bit to be set --> both bits set = transfer complete (-> double buffered)
LATCbits.LATC2 = 1; // set CS high
}
Bei mir tut sich jetzt eine weitere Frage auf: Wenn ich nicht zusätzlich auf das BF Bit warte, geht CS viel zu früh (ca. ab der hälfte der Übertragung) wieder auf high. Laut Datenblatt wird das SSPIF Bit erst gesetzt, nachdem das Byte vollständig gesendet wurde. Meine Vermutung ist das das Double Buffering durch das SSPBUF Register etwas damit zu tun haben könnte.
Mit der jetzigen Lösung bin ich allerdings auch nicht recht zufrieden, da CS relativ früh (8 takte vorher) auf high und auch relativ spät (auch ca. 8 takte) wieder auf high, was natürlich die Übertragungsgeschwindigkeit mindert.
Hat jemand dazu noch eine Idee?
Lesezeichen