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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren