Jump to content

    

Одновременная работа нескольких UART в LPC2368

В общем никак не получается настроить несколько Уартов в МК LPC2368. Работает только UART0. Код привожу ниже. (прерывания по приему символа не испольую так как данные по уарту только отправляю)

#include "LPC23xx.h"                     /* LPC23xx definitions               */
#include "target.h"

#include <string.h>
#include "comm.h"

//#define UART0
#define BPS         115200

// KEIL MCP2300
// UART0 TX P0.2 RX P0.3 MAIN diagnostic
#define U0_TX_PINSEL_REG  PINSEL0
#define U0_TX_PINSEL     (1UL<<4)  /* PINSEL0 Value for UART0 TX */
#define U0_TX_PINMASK    (3UL<<4)  /* PINSEL0 Mask  for UART0 RX */
#define U0_RX_PINSEL_REG  PINSEL0
#define U0_RX_PINSEL     (1UL<<6)  /* PINSEL0 Value for UART0 TX */
#define U0_RX_PINMASK    (3UL<<6)  /* PINSEL0 Mask  for UART0 RX */
// UART1 TX P0.15 RX P0.16 1)RS485
#define U1_TX_PINSEL_REG  PINSEL0
#define U1_TX_PINSEL     (1UL<<30)  /* PINSEL0 Value for UART1 TX */
#define U1_TX_PINMASK    (3UL<<30)  /* PINSEL0 Mask  for UART1 RX */
#define U1_RX_PINSEL_REG  PINSEL1
#define U1_RX_PINSEL     (1UL<<0)  /* PINSEL0 Value for UART1 TX */
#define U1_RX_PINMASK    (3UL<<0)  /* PINSEL0 Mask  for UART1 RX */
// UART2 TX P0.10 RX P0.11 2)RS485
#define U2_TX_PINSEL_REG  PINSEL0
#define U2_TX_PINSEL     (1UL<<20)  /* PINSEL0 Value for UART2 TX */
#define U2_TX_PINMASK    (3UL<<20)  /* PINSEL0 Mask  for UART2 RX */
#define U2_RX_PINSEL_REG  PINSEL0
#define U2_RX_PINSEL     (1UL<<22)  /* PINSEL0 Value for UART2 TX */
#define U2_RX_PINMASK    (3UL<<22)  /* PINSEL0 Mask  for UART2 RX */

BYTE uart_get(void)
{
    while ( !uart_test() ) {; }
    
    return U0RBR;
}

BYTE uart_get_ex(BYTE nUart)
{
    while ( !uart_test_ex(nUart) ) {; }

    if(nUart==1)
        return U1RBR;
    if(nUart==2)
        return U2RBR;
}

static void uart_xmit( BYTE d )
{
    while ( !( U0LSR & 0x20 ) ) {
        // wait for send possible
    ; 
    }
    U0THR = d;
}

static void uart_xmit_ex( BYTE d, BYTE nUart )
{
    if(nUart==1)
    {
        while ( !( U1LSR & 0x20 ) ) {
            // wait for send possible
        ; 
        }
    U1THR = d;
    }
    if(nUart==2)
    {
        while ( !( U2LSR & 0x20 ) ) {
            // wait for send possible
        ; 
        }
    U2THR = d;
    }
}
void uart_init (void)
{
    U0_TX_PINSEL_REG = ( U0_TX_PINSEL_REG & ~U0_TX_PINMASK ) | U0_TX_PINSEL;
    U0_RX_PINSEL_REG = ( U0_RX_PINSEL_REG & ~U0_RX_PINMASK ) | U0_RX_PINSEL;
    //
    U1_TX_PINSEL_REG = ( U1_TX_PINSEL_REG & ~U1_TX_PINMASK ) | U1_TX_PINSEL;
    U1_RX_PINSEL_REG = ( U1_RX_PINSEL_REG & ~U1_RX_PINMASK ) | U1_RX_PINSEL;
    //
    U2_TX_PINSEL_REG = ( U2_TX_PINSEL_REG & ~U2_TX_PINMASK ) | U2_TX_PINSEL;
    U2_RX_PINSEL_REG = ( U2_RX_PINSEL_REG & ~U2_RX_PINMASK ) | U2_RX_PINSEL;
    //
    U0FDR = 0;
    U0LCR = 0x83; // 8,n,1
    U0DLL = ( Fpclk / 16 ) / BPS; // divider
    U0DLM = 0;
    U0LCR = 0x03;
    //
    U1FDR = 0;
    U1LCR = 0x03; // 8,n,1
    U1DLL = ( Fpclk / 16 ) / BPS; // divider
    U1LCR = 0;
    U1IER = 0x03;
    //
    U2FDR = 0;    
    U2LCR = 0x83; // 8,n,1
    U2DLL = ( Fpclk / 16 ) / BPS; // divider
    U2DLM = 0;
    U2LCR = 0x03;
}

Share this post


Link to post
Share on other sites

Телепатирую:

U1LCR = 0x03; // 8,n,1

должно быть

U1LCR = 0x83; // 8,n,1

 

U1LCR = 0;

должно быть

U1LCR = 0x03;

 

и далее по тексту.

 

Для UART2 смотритe PCONP

Share this post


Link to post
Share on other sites

Сделал как по user manual по МК, но ничего не изменилось, как UART1 и UART2 не работал, так и не работает

void uart_init (void)
{
    PCONP |=(1<<3);
    PCONP |=(1<<24);
    PCONP |=(1<<25);
    U0FDR = 0;    // no extended uart
    U0LCR = 0x83; // 8,n,1
    U0DLL = ( Fpclk / 16 ) / BPS; // divider
    U0DLM = 0;
    //
    U0_TX_PINSEL_REG = ( U0_TX_PINSEL_REG & ~U0_TX_PINMASK ) | U0_TX_PINSEL;
    U0_RX_PINSEL_REG = ( U0_RX_PINSEL_REG & ~U0_RX_PINMASK ) | U0_RX_PINSEL;
    //
    U0LCR = 0x03;
    //
    //
    PCONP |=(1<<4);
    PCLKSEL0 |=(1<<8);
    PCLKSEL0 |=(1<<9);
    U1FDR = 0;    // no extended uart
    U1LCR = 0x83; // 8,n,1
    U1DLL = ( Fpclk / 16 ) / BPS; // divider
    U1DLM = 0;
    //
    U1_TX_PINSEL_REG = ( U1_TX_PINSEL_REG & ~U1_TX_PINMASK ) | U1_TX_PINSEL;
    U1_RX_PINSEL_REG = ( U1_RX_PINSEL_REG & ~U1_RX_PINMASK ) | U1_RX_PINSEL;
    //
    U1LCR = 0x03;
    //
    PCLKSEL1 |=(1<<17);
    PCLKSEL1 |=(1<<16);
    U2FDR = 0;    // no extended uart
    U2LCR = 0x83; // 8,n,1
    U2DLL = ( Fpclk / 16 ) / BPS; // divider
    U2DLM = 0;
    //
    U2_TX_PINSEL_REG = ( U2_TX_PINSEL_REG & ~U2_TX_PINMASK ) | U2_TX_PINSEL;
    U2_RX_PINSEL_REG = ( U2_RX_PINSEL_REG & ~U2_RX_PINMASK ) | U2_RX_PINSEL;
    //

    U2LCR = 0x03;
}

Share this post


Link to post
Share on other sites

Кстати, немного неверно протестировал железо я. С тем кодом что привел выше заработал UART2 на скорость 56200 бод, но UART1 не заработал ни на какой скорости. Насколько я понимаю UART1 совмещает в себе функции модема, может их надо как то отключить?

Share this post


Link to post
Share on other sites

Проблема то у вас в чем. Вы хоть осцилом тыкались? Скорости получаются не те или данные вовсе не выходят с порта?

Share this post


Link to post
Share on other sites

Осциллографом проверял. На UART1 вообще данные не выходят ни на какой скорости

Share this post


Link to post
Share on other sites

В прикркплении работающий код.

Обратите внимание на BOOL UART_open(...)

UART.c.zip

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this