реклама на сайте
подробности

 
 
> Прерывание в UART1, Help
srg_co
сообщение Jul 16 2008, 17:52
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Исходные данные: KEIL322a, LPC2138

Исходник:

Код
void main ( void ) {


//выполняется обмен с модемом
GSMInit()
OutMenu( "Вывод меню пользователя через UART0" );
while (1);
}


Инициализация UART:

Код
    //UART0 - 115200 - Отладочный порт
    PINSEL0 |= 0x00000005;                                //Enable RxD and TxD pins
    U0LCR = 0x83;                                         //8 bits, no Parity, 1 Stop bit
    U0DLL = (VPB_CLOCK/16/BAUD_RATE0) & 0xFF;              //Setup Baudrate
    U0DLM = ((VPB_CLOCK/16/BAUD_RATE0) >> 8) & 0xFF;
    U0LCR = 0x03;                                         //DLAB = 0

    //настройка прерывания UART0
    VICVectAddr6 = (unsigned long)uart0_interrupt;      //прерывание на 6 векторе
      VICVectCntl6 = 0x20 | 0x06;
    VICIntEnable |= 0x00000040;                            //включить прерывание от UART0

    U0IER = IER_RBR | IER_THRE;                            //конфигурация прерывания UART0
                                                        //приняты данные, буфер пуст

    //UART1
    PINSEL0 |= 0x00050000;                                 //Enable RxD and TxD pins
    U1LCR = 0x83;                                         //8 bits, no Parity, 1 Stop bit
    U1DLL = (VPB_CLOCK/16/BAUD_RATE1) & 0xFF;              //Setup Baudrate
    U1DLM = ((VPB_CLOCK/16/BAUD_RATE1) >> 8) & 0xFF;
    U1FCR = 0x07;                                       //Разрешение работы и сброс TX and RX FIFO, граница - 1 байт
    U1LCR = 0x03;                                         //DLAB = 0 разрешить работу порта

    //настройка прерывания UART1
    VICVectAddr7 = (unsigned long)uart1_interrupt;
      VICVectCntl7 = 0x20 | 0x07;
    VICIntEnable |= 0x00000080;
    U1IER = IER_RBR | IER_THRE;

Обработка прерывания:

Код
__irq void uart1_interrupt( void ) {

    int IIRValue, LSRValue;
    char ch, RBRValue;
    volatile char Dummy;

    IIRValue = U1IIR;
    IIRValue = (IIRValue & 0x0E) >> 1;    // Выделяем информацию об источнике прерывания

    if ( IIRValue == 0x03 ) {
        //Изменился статус приемной линии
        //сбросим времени счетчик последнего обмена
        LSRValue = U1LSR;
        if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) {
            //Пустое чтения для сброса флага прерывания
            Dummy = U1RBR;    
            VICVectAddr = 0;
            return;
          }  
      }
    if ( IIRValue == IIR_RDA || IIRValue == IIR_CTI ) {
        //Принят новый байт данных и достигнута граница тригера
        RBRValue = U1RBR;
        GSMRecv( RBRValue );
      }
      
    if ( IIRValue == IIR_THRE ) {
        //Прочитаем статус и убедимся, что действительно THR пуст
        LSRValue = U1LSR;
        if ( LSRValue & LSR_THRE )
            //буфер передачи пуст
            UART1TxEmpty = 1;
            /*if ( GSMSendByte( &ch ) )
                U1THR = ch;*/
        else UART1TxEmpty = 0;
      }
    //сброс прерывания
    VICVectAddr = 0;
  }


GSMInit – отрабатывает нормально в main, передает несколько команд в модем, но как только попадаем в while(1) функция перестает отрабатывать, т.е. передается один байт и все. Вход в __irq void uart1_interrupt( void ) не происходит вообще, программа вешается. Второй вызов GSMInit выполняется по нажатию пользовательской кнопки или по команде с консоли. Если отключить вызов GSMInit в main а потом вызвать отдельно, ситуация повторяется, т.е. передача одного байта и ступор. Обмен по UART0 идет без проблен, пока не вызывать GSMInit sad.gif
В чем может быть проблема, может что-то пропустил при инициализации !? Гляньте пожалуйста свежим взглядом !
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- srg_co   Прерывание в UART1   Jul 16 2008, 17:52
- - HARMHARM   Приведите пожалуйста код передачи байтов в UART1. ...   Jul 16 2008, 20:36
|- - srg_co   Цитата(HARMHARM @ Jul 17 2008, 00:36) При...   Jul 17 2008, 18:29
- - Qwertty   По моему очевидно, что проблема в GSMInit. Сегодня...   Jul 17 2008, 20:30
- - Roman Mich.   UART1TxEmpty обявлена как volatile?   Jul 18 2008, 03:01
- - srg_co   Нет, обычный int Цитата(Qwertty @ Jul 18 200...   Jul 18 2008, 08:37
|- - HARMHARM   Цитата(srg_co @ Jul 18 2008, 11:37) Возмо...   Jul 18 2008, 14:44
- - srg_co   Весь исходник в файле. Цитата(Qwertty @ Jul...   Jul 18 2008, 18:58
- - srg_co   Так что скажут профессионалы ?   Jul 21 2008, 19:56
- - defunct   Цитатаif ( IIRValue == IIR_RDA || IIRValue == IIR_...   Jul 21 2008, 20:28
- - srg_co   Коментарий исправлю. С константами все нормально:...   Jul 22 2008, 06:34
|- - defunct   Цитата(srg_co @ Jul 22 2008, 09:34) После...   Jul 22 2008, 11:20
- - srg_co   Только он его и использует, UART0 - отладочный UA...   Jul 22 2008, 11:53
|- - defunct   Цитата(srg_co @ Jul 22 2008, 14:53) Тольк...   Jul 23 2008, 00:19
- - srg_co   Вот: Код__irq void uart0_interrupt( void ...   Jul 23 2008, 06:48
- - srg_co   Нашел похожую тему, но ответа на проблему не нашел...   Jul 25 2008, 10:26
|- - defunct   Цитата(srg_co @ Jul 25 2008, 13:26) но от...   Jul 26 2008, 00:17
- - srg_co   В общем помог перенос Кодif ( endinp ) ...   Jul 28 2008, 07:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 05:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016