Вот: SPI_DEV_DMA_TX->CCR &= ~DMA_CCR1_EN; // <--- 1
while (SPI_DEV_DMA_TX->CCR & DMA_CCR1_EN) ; // <<--- 2
if ((data.size > 0) && (data.buf != NULL))
{
SPI_DMA->IFCR = 0xFFFF; // <--- 3
Если не добавлено (2), то нет гарантии, что (1) выполнится до того, как будет сделано (3) и далее, а это непорядок.