How do I organize robust communication between a PC and a microcontroller?
I think SPI would be my first choice. I2C and UART are way slower, USB is overkill. 1 MHz is not slow, but certainly doable for a short distance. You might need matched impedances on your lines, and a scope will be very handy for troubleshooting.

I'd assume that errors are rare. On top of SPI, you could implement a go-back protocol: send data as a big block with an ID and a checksum. With each SPI exchange, the ST returns the ID of the last succesfully received block. When that doesn't match what the RaPi hoped for, it must go back to transmitting the last not-yet-succesfully-received block. 

When a block is not received OK, the RaPi will notice this with the transmission of the next block, so two blocks are lost. If this is deemed too much the TS could buffer one extra block, or the acknowledge could be piggybacked on a tail part (dummy bytes) of the block itself.