Danke für die zahlreichen Antworten! Zunächst das Wichtigste:
Werner R. schrieb:
> *(volatile uint8_t*) &SPI1->DR = spitx;
Damit funktioniert es, darauf wäre ich echt nie selbst gekommen! Die
Datenlänge stimmt nun immer mit der eingestellten Größe überein, wie es
soll. Damit wäre ich jetzt eigentlich fertig, allerdings würde ich das
gern auch verstehen. Da geraten meine C-Kenntnisse ein wenig an ihre
Grenzen, ich versuche es erst einmal selbst zu verstehen.
liefert mir die Adresse des Registers.
kenne ich nur von einer Deklaration bzw. Definition einer
Zeiger-Variagble, die auf eine uint8_t-Variable zeigt, die sich wiederum
unabhängig vom Programmablauf ändern kann (Register). Ich ändere also
das Datenformat der Register-Adresse auf uint8_t, da das Register
eigentlich 16 Bit hat. Und mit dem Asterisk am Anfang schreibe ich dann
wiederum in den Speicher an der angegebenen Adresse. Letztlich sorge ich
dafür, dass die Variable, in die ich schreibe, als uint8_t-Variable
behandelt wird statt als uint16_t. Ohne den ganzen Zauber "optimiert"
der Compiler das so, dass er meine Variable, die ich in das Register
schreibe, auf uint6_t ändert, bevor er sie schreibt. Verstehe ich das
richtig?
Eine uint_8_t-Variable hatte ich schon getestet, das brachte nämlich
keine Änderung, was mir nun auch logisch erscheint.
So, wie ich das bisher verstehe, auch mit dem Reference Manual, bestimmt
die Datenlänge zunächst, ob das FIFO in 4x8 oder 2x16 Bit organisiert
wird. Bei einer Länge bis einschließlich 8 Bit ist es 4x8 Bit und
darüber 2x16 Bit. Unabhängig davon ist aber das Datenregister 16 Bit
groß. Schreibe ich 16 Bit rein, werden diese 16 Bit in das FIFO
geschrieben. Das SPI-Modul findet dann die 16 Bit im FIFO wieder. Ist
die Datenlänge auf 16 Bit eingestellt, werden diese 16 Bit gesendet, bei
8 Bit dann 2x 8 Bit. Und bei einer anderen Länge werden die
überschüssigen Bits einfach verworfen.
Hab testweise einmal die Länge auf 12 Bit gestellt und wieder ganz
normal eine uint16_t-Variable verwendet, dann klappt es wie erwartet, es
werden 12 Bit gesendet.
Sollte ich einen groben Fehler drin haben, bitte korrigieren,
andernfalls hilft die Erläuterung vielleicht noch jemand anderem.