UART0 dont work with a baud rate of 115200

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

UART0 dont work with a baud rate of 115200

Jump to solution
3,312 Views
paljano
Contributor II

Hello everyone,

I have a Kinetis MK10DX128 VLH7 and Im trying to configure the UART0 module for a baud rate of 115200. I tryed several clock rates but my host receive only garbage. Every other baud rates until 115200 works fine. I tested it with two of my MCUs and they have the same problems. Here is my source code:

#include "derivative.h" /* include peripheral declarations */

#include "driver.h"

int main(void)

{

    int n=0;

    main_clock_init();

    UART_init(115200,72000);

  

    for(;;)

    {

        for(n=0;n<=100000;n++);

        while(!(UART0_S1 & UART_S1_TDRE_MASK)){};

        UART0_D        =    'X';

    }

    return 0;

}

and the funktions in driver.c:

void main_clock_init()                              // Set clockrate to 72MHz

{

    MCG_C4        |=    MCG_C4_DMX32_MASK

                |    MCG_C4_DRST_DRS(2);

}

void UART_init(unsigned short baud,unsigned int uartclk_khz)                    // Initialise UART0

{

    unsigned short sbr,brfa;

    //Initialisation

    SIM_SCGC4        |=    SIM_SCGC4_UART0_MASK;                                    // Activate clock for UART

    SIM_SCGC5        |=    SIM_SCGC5_PORTB_MASK;                                    // Activate clock for PortC

    PORTB_PCR16        =     PORT_PCR_MUX(3);                                        // Set PortB 16 for UARC

    PORTB_PCR17        =     PORT_PCR_MUX(3);                                        // Set PortB 17 for UARC

      

    sbr                =    (unsigned short)((uartclk_khz*1000)/(baud*16));

    UART0_BDH        =    (unsigned char)((sbr & 0x1F00)>>8);                        // Write high word of baud rate into register

    UART0_BDL        =    (unsigned char)(sbr & 0x00FF);                            // Write low word of baud rate into register

  

    brfa            =    (((uartclk_khz*32000)/(baud*16))-(sbr*32));

    UART0_C4        =    (unsigned char)(brfa & 0x001F);                            // Write divider into register 

    UART0_C1        =    0;                                                        // 8-Bit-Mode,No parity

  

    //UART0_BDH        |=    UART_BDH_RXEDGIE_MASK;                                    // Enable interrupts from an edge on RxD

    //enable_irq(45);                                                                // Enable interrupts from UART module

    //NVICIP45        =    0x10;                                                      // Set Priority 1 to the UART module

  

    UART0_C2        |=    (UART_C2_TE_MASK | UART_C2_RE_MASK );                    // Enable receiver and transmitter

  

    while(!(UART0_S1 & UART_S1_TDRE_MASK)){};

            UART0_D        =    'a';

}

It would be nice when you can help me.

regards,

Eric

Labels (1)
0 Kudos
Reply
1 Solution
1,795 Views
mjbcswitzerland
Specialist V

Eric

The slow clock is not very accurate and you look to already have an inaccuracy of -6% a 9600 Baud.This is not adequate for reliable UART operation so you either need to trim the value for each board (it may still be limited over temperature) or use a crystal source to guaranty reliable operation.

Regards

Mark

View solution in original post

0 Kudos
Reply
5 Replies
1,795 Views
mjbcswitzerland
Specialist V

Eric

If you have a 72MHz system clock a fraction value of 0x02 and a divide value of 0x27 gives a Baud rate of 115200 exactly.

Should this not work, verify that you really have 72MHz clock. [Usually after seing the FLL factor MCG_C1 = 0 is used to move to FEE state and enable the oscillator - and wait for the source to become valid]

Also measure the Baud rate that is actually being generated to see whether you can work out what the error factor is because it may help identify any problem.

Regards

Mark

P.S. Is it possible that your clock source is not accurate? Once the baud-rate error becomes > 1.5% errors may start, The error increases as the baud-rate increases so at some point the communication starts failing.

0 Kudos
Reply
1,795 Views
paljano
Contributor II

Hello Mark,

thanks for your answer. I use the slow internal reference clock to generate the system clock. Could that be a problem? There is no restrictions in the manual thats say that this dont work.

Regards

Eric

0 Kudos
Reply
1,795 Views
BlackNight
NXP Employee
NXP Employee

Hi Eric,

as Mark indicates, I think your problem is the inaccurate clock. The internal clock is less accurate, there is drift, and it is affected by temperature and trimming. I suggest you measure the actual baud produced so you know how far you are off.

Erich

0 Kudos
Reply
1,795 Views
paljano
Contributor II

Ok, I configured the baud rate now to 9600 and measured the width of one Bit and its 110µs wide. So I have a baud rate of 9090 instead of 9600. Is that right? Or do I have to consider more things to measure the baud rate?

0 Kudos
Reply
1,796 Views
mjbcswitzerland
Specialist V

Eric

The slow clock is not very accurate and you look to already have an inaccuracy of -6% a 9600 Baud.This is not adequate for reliable UART operation so you either need to trim the value for each board (it may still be limited over temperature) or use a crystal source to guaranty reliable operation.

Regards

Mark

0 Kudos
Reply