The STM32F3 SPI data register DR can respond to reads and writes differently, based on whether the access is 8 bits wide, or 16 (or more) bits wide. For example, when the configured SPI data frame size is 8 bits or less, a single 16-bit write to DR will be interpreted as two data frames. This is called data packing, and is described in the reference manual (see STM32F303x/328x Reference Manual, RM0316, DM00043574, p.965 "Data Packing").
The stm32f30x crate currently has no way of performing a DR register read or write that is not 32 bits, so e.g. a write using
let data_out: u8 = 0xa5;
(*SPI2.get()).dr.write(|w| w.dr().bits(data_out as u16));
results in two data frames being loaded into the transmit FIFO. As a work-around, one may write
core::ptr::write_volatile(&(*SPI2.get()).dr as *const _ as *mut u8, data_out);
to write a single data frame, but at that point, one may as well be using C. :)
I don't recall, nor could I find in a quick search, any other instances of STM32 peripherals behaving this way, but there may be other circumstances where the access width is important. Since the stm32f30x crate is auto-generated from SVD, maybe support for SPI belongs in a higher-level HAL or BSP. But at minimum, it would be nice if the SVD patch added a bit of documentation on the DR register making note of this.