A ver si te ayudo.
El shift bit que hace en realidad no va al SPI, es una preparacion del dato a enviar por SPI.
/*
** SPI_Write_Char
*/
void SPI_Write_Char(char spi_data) <<<< el byte a transmitir se pasa al llamar la funcion, equivale a cargarlo en W y llamar a la rutina en assembler
{
char temp1,temp2; <<<<<<< Aqui declara dos datos de un byte cada uno
temp1 = (spi_data >> 3) | (0b10000000); <<<< prepara el dato, rota 3 posiciones a la derecha y hace un OR para dejar activo el bit de mayor peso.
temp2 = ((unsigned int)spi_data << 5); <<<< formatea el dato a un byte luego de una rotacion de 5 posiciones
SPI_CS = 1; <<<< pone el pin chip select del SPI en 1 (recien aqui empieza la comunicacion)
SSPBUF = temp1; <<<< Carga el dato en el buffer del SPI por hardware
while(!SSPIF); //wait until transmitted <<< espera a que el hardware termine de transmitir
SSPIF = 0; <<<< creo que limpia la bandera de interrupcion (ver documentacion)
SSPBUF = temp2; <<<<< ahora carga el segundo byte que preparo al principio para enviarlo por SPI
while(!SSPIF); <<< espera a que el hardware termine de transmitir
SSPIF = 0; <<<< creo que limpia la bandera de interrupcion (ver documentacion)
SPI_CS = 0; <<<< pone el pin chip select del SPI en 0 (aqui termina la comunicacion)
}
/*