I am replying to my own question as I eventually figured out what was going wrong.
As a part of my application I need to quickly switch SPI modes. My process to do that is to disable the SPI, set the register bits for CPha and CPol, and then reenable the SPI.
Then later, I use the HAL_SPI_Transmit() function. The internals of this HAL function sets the correct TSIZE and then loads data into the TXDR.
However! You cannot set the TSIZE while the SPI is enabled! If you query the contents of the SPI_CR2 register, it looks as though TSIZE is set correctly, but I think this register is only read when you enable SPI, because it seems to still use the previous value, which, in my case, was 2.
The fix was simply NOT to enable the SPI when switching modes. Now the HAL_SPI_Transmit() function is able to set everything correctly, and then enable the SPI itself.