Forum: Mikrocontroller und Digitale Elektronik STM32 9.Bit in der UART setzen


von paule (Gast)


Lesenswert?

Hallo,

ich möchte gerne zur Maskierung des Framestarts beim ersten gesendeten 
Byte der UART ein 9tes Bit anhängen.

Ich habe soweit die 9Bit aktiviert und im Register wird bei M auch eine 
"1" angezeigt. Ich lese Byteweise die Daten aus und sende byteweise per 
USART1->DR = ch;

Wie kann ich das 9te Bit setzen für das erste zu sendende Byte und wie 
lese ich es wieder aus. Wie ich gelesen habe, ersetzt das 9te Bit dann 
das Parity Bit und ich kann entweder nur Parity oder nur das 9te Bit 
übertragen.

Gruß
paule

von Ralf (Gast)


Lesenswert?

Ich kenne das nur beim AVR, aber da dürften keine Unterschiede sein. 
Sonst könnte der sich dann mit einem STM32 nicht unterhalten. Da wird 
das erste Stopp-Bit verwendet. Man muss als zwei Stopp-Bits vorsehen. 
(Wenn ich das richtig verstanden habe.)

von ... (Gast)


Lesenswert?

Hab zwar noch nie was mit STM32 zu tun gehabt, hab es aber trotzdem 
innerhalb von max 5 min im Referencmanual gefunden 
(http://www.st.com/stonline/products/literature/rm/13902.pdf Seite 
766ff).
Das USART_DR Register ist doch breit genug, da passen doch die 9 Bit 
locker rein. Muß halt einen 16 oder 32 Bit Wert reinschreiben bzw. lesen 
und kein 8Bit char.

von Ralf (Gast)


Lesenswert?

paule schrieb:
> Wie ich gelesen habe, ersetzt das 9te Bit dann
> das Parity Bit und ich kann entweder nur Parity oder nur das 9te Bit
> übertragen.

In der Beschreibung zum STM32 steht da nichts weiter darüber drin. Also 
einfach machen. USART_DR mit dem Wert beschreiben (9 Bits werden 
verwendet, wenn 'M' gestzt ist), der Rest wird einfach hinten dran 
gehangen. Die Verwendung von 2 Stopp-Bits (Beschreibung AVR) hat, wenn 
ich das richtig verstanden habe, nur mit Synchronisation bei Vollduplx 
zu tun.

von paule (Gast)


Lesenswert?

Ja okay, schreib also einen 16 Bit Wert rein, dann werden aber nicht 
daraus zwei Bytes gemacht oder?
Ich denke mir das so, das ich also 16 Bit schreib, aber davon dann nur 9 
bit gesendet werden, richtig?
Beim nächsten Versand wenn Tx Buffer empty, schreib ich die nächsten 16 
bit rein?

von Ralf (Gast)


Lesenswert?

paule schrieb:
> Ich denke mir das so, das ich also 16 Bit schreib, aber davon dann nur 9
> bit gesendet werden, richtig?

Ich hatte den STM32 noch nicht in den Fingern, aber genau so würde ich 
das Datenblatt verstehen (32 Bit USART_DR, nach dem 9. Bit wird alles 
ausgeblendet - ohne gesetztem 'M'-Bit schon nach dem 8.) und das mal so 
ausprobieren.

von paule (Gast)


Lesenswert?

Okay, so werde ich es mal ausprobieren.
Danke!

von ... (Gast)


Lesenswert?

Ralf schrieb:
> paule schrieb:
>> Wie ich gelesen habe, ersetzt das 9te Bit dann
>> das Parity Bit und ich kann entweder nur Parity oder nur das 9te Bit
>> übertragen.
>
> In der Beschreibung zum STM32 steht da nichts weiter darüber drin. Also

Doch, siehe obigen Link Seite 769
1
Bits 8:0 DR[8:0]: Data value
2
...
3
  When transmitting with the parity enabled (PCE bit set to 1 in the USART_CR1 register), the 
4
  value written in the MSB (bit 7 or bit 8 depending on the data length) has no effect because 
5
  it is replaced by the parity.
6
  When receiving with the parity enabled, the value read in the MSB bit is the received parity 
7
  bit.
und auf der folgenden Seite
1
Bit 10 PCE: Parity control enable
2
  ... When the parity control is enabled, the computed parity is inserted at the MSB position
3
  (9th bit if M=1; 8th bit if M=0) ...
Also entweder 9 Bit oder Parity, beides zusammen geht nicht. 
Genausoweinig wie 7 Bit ohne Parity.


Bei der Beschreibung des USART_DR Registers steht übrigens auch 
eindeutig:
1
Bits 31:9 Reserved, forced by hardware to 0.

von Ralf (Gast)


Lesenswert?

... schrieb:
> When transmitting with the parity enabled ...

Okay, Parity-Bit geht flöten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.