This may help for HW SPI (From 877A datasheet):
"Any write to the SSPBUF register during transmission/reception of data will be ignored and the write collision detect bit, WCOL (SSPCON<7>), will be set. User software must clear the WCOL bit so that it can be determined if the following write(s) to the SSPBUF register completed successfully."

The following:
WriteSPI (read-modify-write):
WCOL=0
Rx_buff=SSPBUF ' CLEAR THE BUFFER
SSPIF=0 ' CLEAR THE INTERRUP FLAG
SSPBUF=tx_buff ' SEND THE BYTE
IF(wcol) THEN RETURN
WHILE(!SSPIF)
WEND
SSPIF=0;
RETURN

ReadSPI:
rx_buff=SSPBUF ' Clear the buffer
SSPIF=0 ' Clear the interrup flag
SSPBUF=0 ' Shift out a dummy byte What is this?
while(!sspif) ' wait for receive byte
wend
rx_buff=SSPBUF ' Get the byte
return
Can be changed to this:
WriteSPI (write-receive-read):
SSPIF=0 ' CLEAR THE INTERRUP FLAG
WCOL=0 ' CLEAR COLLISION BIT BEFORE WRITING TO SPI
SSPBUF=tx_buff ' SEND THE BYTE
WHILE(!SSPIF) ' WAIT FOR 8-BITS TO BE CLOCKED-OUT/CLOCKED-IN - THIS HAPPENS SIMULTANEOUSLY
WEND
Rx_buff=SSPBUF ' STORE RECEIVED DATA
SSPIF=0 ' CLEAR THE INTERRUP FLAG
RETURN

ReadSPI:
SSPIF=0 ' CLEAR THE INTERRUP FLAG
WCOL=0 ' CLEAR COLLISION BIT BEFORE WRITING TO SPI
SSPBUF=0 ' SEND/CLOCK-OUT DUMMY BYTE TO CLOCK-IN RECEIVED BYTE
WHILE(!SSPIF) ' WAIT FOR 8-BITS TO BE CLOCKED-OUT/CLOCKED-IN - THIS HAPPENS SIMULTANEOUSLY
WEND
Rx_buff=SSPBUF ' STORE RECEIVED DATA
SSPIF=0 ' CLEAR THE INTERRUP FLAG
return