xmega USART Baudrate

OP #2977182
Lesenswert?
• ▲
▼
Hallo,

wenn ich Baudrate 115200 benutzte, funktioniert alles.
Ich würde aber gerne auf 460800 oder 921600 gehen, aber da funktioniert 
leider nix mehr.

Als Board benutzte ich das Alvidi xmega128A1 mit 16Mhz Quarz.
PC ist der Alix2d

USART ist per TTL angebunden.


Nutze folgende Clock Init:
1
void system_clocks_init( void )
2
{
3
/* konfiguriere Taktquelle */
4
CLKSYS_XOSC_Config(OSC_FRQRANGE_12TO16_gc,false,OSC_XOSCSEL_XTAL_16KCLK_gc);
5

6
/* aktiviere Taktquelle */
7
CLKSYS_Enable( OSC_XOSCEN_bm );
8

9
/* konfiguriere PLL, Taktquelle, Faktor */
10
CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2 ); 
11

12
/* aktiviere PLL */
13
CLKSYS_Enable( OSC_PLLEN_bm );
14

15
/* konfiguriere Prescaler */
16
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
17

18
/* warte bis takt stabil */ 
19
do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
20

21
/* wähle neue Taktquelle */
22
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
23

24
/* deaktiviere internen Oszillator */
25
CLKSYS_Disable( OSC_XOSCEN_bm );
26
}

die Uart Init schaut so aus:
1
void ini_usart(void)
2
{
3
  //#define BAUDRATE 115200
4
  #define BAUDRATE 921600 
5
  
6
  PORTE.DIRSET = PIN3_bm;  // PE3 (TXE0) as output.
7
  PORTE.DIRCLR = PIN2_bm; // PE2 (RXE0) as input.
8
  
9
  USARTE0.CTRLA = USART_RXCINTLVL_MED_gc;
10
  USARTE0.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
11
  USARTE0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
12
  
13
  USARTE0.BAUDCTRLA = ((((F_CPU / BAUDRATE) +8) /16) -1) & 255;
14
  USARTE0.BAUDCTRLB = ((((F_CPU / BAUDRATE) +8) /16) -1) >> 8;
15
  
16
  rx_counter = 0;
17
}

Hoffe Ihr habt eine Idee.

Danke,
Markus
Gast #2977255
Lesenswert?
• ▲
▼
Nabend,

warum nicht:

1
#define BAUD_TOL     1
2
#define BAUD    115200
3
                      
4
#include <util/setbaud.h>
5

6
PORTE.DIRCLR = PIN2_bm;            // RX  -> In
7
PORTE.DIRSET = PIN3_bm;            // TX  -> Out
8

9
USARTE0.BAUDCTRLA = UBRRL_VALUE;   // BSEL LowByte
10
USARTE0.BAUDCTRLB = UBRRH_VALUE;   // BSEL HighByte
11

12
USARTE0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc |
13
                USART_CHSIZE_8BIT_gc;
14

15
USARTE0.CTRLA  = USART_RXCINTLVL_LO_gc | USART_DREINTLVL_LO_gc;
16
USARTE0.CTRLB |= USART_RXEN_bm | USART_TXEN_bm | (USE_2X ? USART_CLK2X_bm:0);
17
PMIC.CTRL     |= PMIC_LOLVLEX_bm;

... ungetestet

frohe Ostern.
OP #2977670
Lesenswert?
• ▲
▼
Frohes neues Jahr...

So nach langem hin und her klappt die Verbindung bei 921600 Baud.
1
  // Baudrate 921600 - normal speed mode bei 32MHz
2
  
3
  PORTE.DIRSET = PIN3_bm;  // PE3 (TXE0) as output.
4
  PORTE.DIRCLR = PIN2_bm; // PE2 (RXE0) as input.
5
    
6

7
  USARTE0.BAUDCTRLA = 150;
8
  USARTE0.BAUDCTRLB = 0b10010000;
9

10

11
  USARTE0.CTRLA = USART_RXCINTLVL_HI_gc;
12
  USARTE0.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
13
  USARTE0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;

lg, markus
OP #3097375
Lesenswert?
• ▲
▼
Hallo,

muss den Fred leider nochmal hochholen.

Habe folgendes Problem: USARTE0 und E1 mit unterschiedlichen Baudraten 
funktioniert nicht.

Clock ist 32MHz.

Hier mein Code für die Init:
1
void init_usart(void)
2
{
3
  // USART E0
4
  // Baudrate 921600 - normal speed mode
5
  
6
  PORTE.DIRSET = PIN3_bm;  // PE3 (TXE0) as output.
7
  PORTE.DIRCLR = PIN2_bm; // PE2 (RXE0) as input.
8
    
9

10
  USARTE0.BAUDCTRLA = 150;
11
  USARTE0.BAUDCTRLB = 0b10010000;
12

13

14
  USARTE0.CTRLA = USART_RXCINTLVL_HI_gc;
15
  USARTE0.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
16
  USARTE0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
17

18
  
19
  // USART E1
20
  // Baudrate 9600 - normal speed mode
21
  
22
  PORTE.DIRSET = PIN7_bm;  // PE7 (TXE1) as output.
23
  PORTE.DIRCLR = PIN6_bm; // PE6 (RXE1) as input.
24
  
25
  USARTE1.BAUDCTRLA = 2094;
26
  USARTE1.BAUDCTRLB = 0b10010000;
27
  
28
  //USARTE1.CTRLA = USART_RXCINTLVL_HI_gc;
29
  USARTE1.CTRLB = USART_TXEN_bm;
30
  USARTE1.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;  
31

32

33
  rx_counter = 0;    // for USART E0
34
}

Wenn ich beide auf 921600 Baud laufen lasse geht es. Aber E0 soll auf 
921600 Baud und E1 auf 9600 Baud.

Finde den Fehler einfach nicht.

Danke,
Markus

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.