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
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.)
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.
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.
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?
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.
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. |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.