galex1981 0 22 июня, 2010 Опубликовано 22 июня, 2010 · Жалоба В общем никак не получается настроить несколько Уартов в МК 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_Mozzhevilov 0 22 июня, 2010 Опубликовано 22 июня, 2010 · Жалоба Телепатирую: U1LCR = 0x03; // 8,n,1 должно быть U1LCR = 0x83; // 8,n,1 U1LCR = 0; должно быть U1LCR = 0x03; и далее по тексту. Для UART2 смотритe PCONP Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galex1981 0 22 июня, 2010 Опубликовано 22 июня, 2010 · Жалоба Сделал как по 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galex1981 0 22 июня, 2010 Опубликовано 22 июня, 2010 · Жалоба Кстати, немного неверно протестировал железо я. С тем кодом что привел выше заработал UART2 на скорость 56200 бод, но UART1 не заработал ни на какой скорости. Насколько я понимаю UART1 совмещает в себе функции модема, может их надо как то отключить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 23 июня, 2010 Опубликовано 23 июня, 2010 · Жалоба Проблема то у вас в чем. Вы хоть осцилом тыкались? Скорости получаются не те или данные вовсе не выходят с порта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galex1981 0 23 июня, 2010 Опубликовано 23 июня, 2010 · Жалоба Осциллографом проверял. На UART1 вообще данные не выходят ни на какой скорости Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ALexx 0 29 июня, 2010 Опубликовано 29 июня, 2010 · Жалоба В прикркплении работающий код. Обратите внимание на BOOL UART_open(...) UART.c.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться