Forum: Mikrocontroller und Digitale Elektronik Atmel SAM3x USART Frame Error keine Funktion


von Marco H. (damarco)


Lesenswert?

Alles korrekt meiner Meinung funktioniert auch, das "Hallo" ist auf der 
Konsole zu sehen. Daten gehen auch korrekt ins RX Hold Register. Mit 
Debugger nachgeschaut was ankommt.

Also sollte alles korrekt sein ? Mein Problem das Frame Error kommt 
nicht so wie man es erwarten würde.  Wenn es überhaupt kommt. Normal 
wird es gesetzt wenn nach dem letzten RSTSTA mindestens ein Stopbit 0 
war.

Komischer weise löst es dann eben nicht aus. Alle anderen Funktionen wie 
break oder der Timeout funktionieren wie sie sollen.

Nur das break vom DMX512 wird nicht erkannt, obwohl die USART RXRDY 
setzt. Nun habe ich mir mit den break status beholfen das Startbit vom 
DMX zu erkennen das funktioniert auch, ist aber nicht das non plus 
ultra.

Ich steh jetzt völlig ratlos auf den Schlauch, mit einen AVR war das 
kein Thema.
1
 
2
  // set USART0 outputs
3
  pio_configure(PIOA,PIO_PERIPH_A,PIO_PA11A_TXD0,PIO_PULLUP);
4
  pio_configure(PIOA,PIO_PERIPH_A,PIO_PA11A_TXD0,PIO_PULLUP);
5
  // enable clock
6
  pmc_enable_periph_clk(ID_USART0);
7
  // config USART0 for DMX 250kbit 8bit,2 stopbits and no parity 
8
  usart_config.baudrate=250000;
9
  usart_config.channel_mode=US_MR_CHMODE_NORMAL;
10
  usart_config.char_length=US_MR_CHRL_8_BIT;
11
  usart_config.stop_bits=US_MR_NBSTOP_2_BIT;
12
  usart_config.parity_type=US_MR_PAR_NO;
13
14
  
15
usart_init_rs232(USART0,&usart_config, 84000000);
16
//usart_set_rx_timeout(USART0,12);
17
//usart_start_rx_timeout(USART0);
18
// enable interrupt 
19
usart_enable_interrupt(USART0,US_IMR_RXRDY);
20
NVIC_EnableIRQ(USART0_IRQn);
21
// enable USART0
22
usart_enable_rx(USART0);
23
usart_enable_tx(USART0);
24
25
usart_write_line(USART0,"hallo\n");

: Bearbeitet durch User
von Marco H. (damarco)


Lesenswert?

Wie gewohnt musste ich mir wieder selbst behelfen ;)

Also das mit dem Frame Error habe ich nicht hin bekommen.  Ich habe mir 
wie oben schon geschrieben mit dem RXBRK bit beholfen.  Dies ist ein 
erweitertes Frame Error und wird gesetzt wenn alles Null ist also nicht 
nur ein Stopbit.

Vermutlich liegt hier auch die Ursache warum es kein Frame Error ist.

Des weiteren habe ich den RX Timeout genutzt um das Frame Ende zu 
erkennen. Somit könnte man das reine lesen des Frames per DMA erledigen. 
Da das Ende erkannt wird kann der Transfer auch gestoppt werden.

Außerdem wird dieses Bit im RS485 Mode dazu benutzt den RTS Pin zur 
Richtungsumschaltung des Treibers zu generieren.  Stichwort RDM. 
Allerdings muss man das steuern. Es gibt RDS Pakete wo man umschalten 
muss oder auch nicht ;)

Tja und wozu das ganze :) Die DMX Daten werden auf einen WS2812B 
gegeben. Das Datensignal wird aus dem PWM Modul per DMA generiert.  Da 
hier 8 Channels vorhanden sind geht schon mal was ;)

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.