SPI communication between STM32F4 and Rasberry Pi produces garbage
The /CS signal is required even with only a single peripheral, because it is key to accomplishing word synchronization between sender and receiver - the receive knows that the first clock after /CS goes low is the one that corresponds to the first bit of data in the word.  Because SPI is a synchronous interface typically without any minimum clock frequency, without synchronization the receiver will simply interpret the first clock it sees (at a time when it is looking for one) as the start of a word.

Alternate schemes where the start of a word is indicated by a time gap in clocking are possible, but they aren't really SPI and your code makes no attempt to implement such a thing.  Critically, if there is ever mis-coordination such as the sender transmitting again while the receiver is still busy generating serial output or recycling after a timed out receive attempt, it may well start receiving bits from the wrong clock cycle.

And even if you don't end up with the bits shifted in a word, you may still end up with words shifted in a message.

Finally, when doing binary-level communication between distinct systems using different languages, you must put care into making sure that they use compatible data encodings.  Python has functions for packing binary data objects in pretty much any element size and endianness combination you could desire, it would be good to use those to explicitly establish compatibility with the data type the STM32 will be interpreting the received information as.