Помогите разобраться с COM-портом
От: Аноним  
Дата: 20.11.07 20:06
Оценка:
Здравствуйте!

Мне нужно инициализировать COM-порт, в режиме работы без прерываний, для вывода отладочной информации.
Вроде бы все делаю в соответсвии с мануалом, но отчего-то не работает
Пробовал ставить задержки в разных местах, играться с флагами — ничего не помогает.
UART — 16550.
Подскажите, что здесь не так?


#define UART_RX        0    /* In:  Receive buffer (DLAB=0) */
#define UART_TX        0    /* Out: Transmit buffer (DLAB=0) */
#define UART_DLL    0    /* Out: Divisor Latch Low (DLAB=1) */
#define UART_TRG    0    /* (LCR=BF) FCTR bit 7 selects Rx or Tx
* In: Fifo count
* Out: Fifo custom trigger levels
* XR16C85x only */

#define UART_LSR_THRE    0x20    /* Transmit-hold-register empty */

#define UART_TRG    0    /* (LCR=BF) FCTR bit 7 selects Rx or Tx
#define UART_DLL    0    /* Out: Divisor Latch Low (DLAB=1) */
#define UART_DLM    1    /* Out: Divisor Latch High (DLAB=1) */
#define UART_IER    1    /* Out: Interrupt Enable Register */
#define UART_FCTR    1    /* (LCR=BF) Feature Control Register
* XR16C85x only */

#define UART_IIR    2    /* In:  Interrupt ID Register */
#define UART_FCR    2    /* Out: FIFO Control Register */
#define UART_EFR    2    /* I/O: Extended Features Register */
/* (DLAB=1, 16C660 only) */

#define UART_LCR    3    /* Out: Line Control Register */
#define UART_MCR    4    /* Out: Modem Control Register */
#define UART_LSR    5    /* In:  Line Status Register */
#define UART_MSR    6    /* In:  Modem Status Register */
#define UART_SCR    7    /* I/O: Scratch Register */

    
    portAddr = 0x3f8; // Адрес COM1

    // Инициализация
    __outbyte(portAddr + UART_IER , 0);   /* Turn off interrupts */
    __outbyte(portAddr + UART_LCR , 0x80);  // SET DLAB ON 
    // baud rate = 9600 (divisor 0x0c)
    __outbyte(portAddr + UART_DLL , 0x0C);  // Set Baud rate - Divisor Latch Low Byte 
    __outbyte(portAddr + UART_DLM , 0x00);  // Set Baud rate - Divisor Latch High Byte 
    __outbyte(portAddr + UART_LCR , 0x03);  // 8 Bits, No Parity, 1 Stop Bit 
    __outbyte(portAddr + UART_FCR , 0xC7);  // FIFO enabled, 14 bytes in FIFO
    __outbyte(portAddr + UART_MCR , 0x0B);  // Turn on DTR, RTS, and OUT2
    
    // Проверяем статус
    DbgPrint("LSR=0x%02X\r\n", __inbyte(portAddr + UART_LSR)); // Здесь выводится 0xFF
    
    // Пытаемся что-нибудь вывести
    while (!(__inbyte(portAddr+UART_LSR) & UART_LSR_THRE)) {}
    __outbyte(portAddr+UART_TX, 0x40); // ничего не выводится
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.