What exactly is your setup? Are you trying to send characters, from one PIC to another via SPI? Transmission, or 'master mode' on a PIC is easy, but sometimes a slave can be a bit tricky, as it should always just be based on interupts.
My C is not just rusty, but down right crap (still learning) but I can follow that code. The 'BF' flag is set and cleared by the PIC, if you don't read the byte from the SSBUF (the recieved byte after transfer is complete) when the BF flag is set after transfer, you'll set the overflow flag. I assume you've turned off all interupts like I said before?
If that code is the master, ie: it controls when bytes are to be sent, I would send the byte, THEN wait for the BF flag, then read it:
****************************
CS = 0;
SSPBUF = txdata1;
while(!STAT_BF);
rxdata = SSPBUF;
CS = 1;
<wait a bit here>
CS = 0;
SSPBUF = txdata2;
while(!STAT_BF);
rxdata = SSPBUF;
****************************
The problem with high level languages is, you don't know exactly whats going on
Perhaps if you could post some of the generated assembly, it would highlight any problems.
Also, it would be best to send bytes seperately. In most cases it doesn't matter, but I tihnk the PIC's PIS in slave mode likes to have CS pulled low for every byte, with ti being high for a period inbetween bytes. After all, its the 'SS/CS' line in the slave that initiates communication. Without a gap between bytes, it will probably over write the contents of the previous transfer, and then get really arsey.
So perhaps, rather than sending two bytes in the routine, you just send one, and have another routine that calls it twice.
Try here for C examples:
https://www.microchipc.com/sourcecode/#interface,
worst case scenario, you could add in a small assembly snippet to control the transfer, the code I posted works, at least for sending bytes continuously.