Why does 4 wire SPI read operation need me to read MISO line on every transmit operation?
Why does 4 wire SPI read operation need me to read MISO line on every transmit operation?

Because:

For performance reasons, the HAL implementers wrote SPI_Write without the &quot;wait for transmit register empty&quot; loop built in, but SPI_Read has such a loop. In that case, issuing writes without reads would overrun the buffer. Your implementation also wastes time in that loop - once you can read, you can write, too; or

The hardware abstraction library (HAL) you're using configures the silicon to work that way, when the silicon doesn't require it to be so,

and perhaps you're not configuring the HAL to do it the way you want, in case the HAL supported it (and necessarily also the silicon); or

perhaps you're not configuring the silicon to do the &quot;right&quot; thing when the silicon allows that; or

the silicon is designed to work that way and no other way.


I don't recall the details of SPI implementation on the chips you're using, but:

Some SPI implementations can have the receiver switched off, and thus reads won't be necessary since that function will be disabled.

SPI can be probably used with DMA, thus you won't care about the overhead of doing the reads too much.

Even if you do it in software, the reads may be cheap. Not using the HAL would probably help with that too, although be sure to compile the code in optimized release configuration, and audit the assembly to confirm that it doesn't do anything unnecessary. Even your hand-written code does unnecessary things.