Start by learning the very basics of SPI communication. Sorry to say, but response from @liaifat85 is highly misleading and incorrect.
In SPI, the data transfer is always bidirectional, on bit basis. On every clock cycle Master sends one bit to Slave and receives one bit from Slave. This is explained everywhere.
So, it is not possible for the slave to get a byte from the master and then respond with a byte. The response is sent while the master is sending the command byte. The problem with slave implementation in a microcontroller is that the slave response to a command sent by master may appear no sooner than during the THIRD frame transmitted by master (not even in the second one).
In theory, there is no half duplex, BUT:
In many cases we only need one way communication. For master-to-slave case, master transmits a frame. For slave-to-master case, master also transmits a frame, but there might be no data connection from master to slave. The master doesn't even know this - it is sending (maybe random) bits to generate the clock signal for slave; the slave cannot send anything without the clock signal generated by master, and the only way for master to generate clock pulses is to send data.
There is another case with single, bidirectional data line, still based on the same rules.
Again, Read The F(ine) Docs.
The simplest, baseline advice:
Start by using TransmitReceive() only until you understand more about SPI. Then, maybe, start playing with others (not really necessary).
And if SPI is too hard, use UART, having no problems with asynchronous unidirectional communication. For connecting two MCUs UART is much easier than SPI and it requires only 2 logic signals instead of 4.