Du must das SSPIF Bit auch wieder löschen, sonst ist deine erste while Schleife für die Katz, da das SSPIF-Bit ja noch von der letzen fertigen Übertragung gesetzt ist. Das ist auch der Grund warum dein CS gleich wieder hoch geht.
Das gleichst Du jetzt quasi aus, indem Du auf das BF-Flag wartest.

Also lösch mal erst das SSPIF Bit
dann schreib den neuen Wert ins SSPBUF
und dann warte auf das IF Bit

Das BF-Bit ist für deine Anwenung, nur rausschieben, eigentlich irrelevant.

Das Double Buffering hat damit nichts zu tun.
Denn das ist nur beim Empfang aktiv. Beim Senden jedoch nicht.

Ich hoffe, ich liege nicht völlig falsch, hab das auch noch nicht programmiert.