Перейти к содержанию
    

Одновременная работа нескольких 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

должно быть

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

 

U1LCR = 0;

должно быть

U1LCR = 0x03;

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал как по 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...