Hi,
also zur HAL kann ich nicht viel sagen. Wenn ich hier einen stm32f446er mit SPI2 in CubeMX auswähle und den Transfer-Master-Mode mit Soft Nss eingebe, dann werden MOSI und CLK mit Alternate Function generiert?!? -> Keine Ahnung warum das bei mir anders ist als bei dir?!?

Zu deinem Code:
TXE und BSY verhalten sich genau umgekehrt wie du es benutzt und die ziehst die CS Leitung nicht runter bevor du schreibst:
Code:
void SndBfhlLCD(char byte){
  SPI2->CR1 |= SPI_CR1_SPE;                     //SPI aktivieren
  GPIOC->BSRR |= GPIO_BSRR_BR_2;                //RS-Pin zurücksetzen
  GPIOC->BSRR |= GPIO_BSRR_BR_3;            // CS runterziehen

  while ( ! (SPI2->SR & SPI_SR_TXE)){                //Warten bis Transmit-Register frei ist
  }
  SPI2->DR = byte;                              //Byte senden
  while ( ! (SPI2->SR & SPI_SR_TXE)){                //Warten bis Transmit-Register frei ist
  }
  while (SPI2->SR & SPI_SR_BSY){             //Warten bis laufende Übertragung abgeschlossen ist
  }

  GPIOC->BSRR |= GPIO_BSRR_BS_3;            // CS high
  GPIOC->BSRR |= GPIO_BSRR_BS_2;                //RS-Pin high
  SPI2->CR1 &= ~SPI_CR1_SPE;                     //SPI deaktivieren
}
Hoffe das das jetzt klappt.
Hab heute auch zwei Stunden nach genau einem Bit gefahndet und kann deinen Ärger verstehen.

Gruss botty