ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
21 июля
36618 Топик полностью
Abo (03.08.2005 16:57, просмотров: 1) ответил Romario на не совсем по ARM, но работа с UART_TX и сигналом CTS от приёмника. Кому НЕ __лениво__ посмотрите прогу (много внутри)
Ответ: Вот как я это делаю: 
static void Uart1Isr(void)
{
  char isr;
  char c;
  while(1)
  { isr = U1IIR & 0x0f;
    if(isr == 2) // прерывание по передаче 
    { if(U1LSR & 0x20)
      { // Если CTS установлен можно работать 
        if((U1MSR & 0x10)!=0)
        { register int i;
          for (i=12;i>0;i--) // пытаемся отправить сразу 12 байт
          { if(CircBuffer_GetChar(&U1TxBuffer,&c)) // если есть что передавать
            { U1THR = c;
              Uart1Error.TxBytesSent++;
            }   // передаем
            else
            {  U1IER = 0x0d;
               break; // выходим из цикла
            }; // если нечего передавать запрещаем прерывания
          };
        };
      };
      continue;
    };
    if((isr==4)||(isr==0x0c)) // прерывание по приему или таймауту
    { while(U1LSR & 0x01) //-- while Rx FIFO is not empty
      {// надо записать байт в приемный буфер
       if(CircBuffer_AddChar(&U1RxBuffer, U1RBR)==0)
        Uart1Error.RxBuffOvrErr++; // контроль на переполнение входного буфера
       Uart1Error.RxChars++;
      };
      continue;
    };
    if(isr == 6) // ошибка приема
    { register char LSR= U1LSR;
      register TUartError * E=&Uart1Error;
      if(LSR&0x02) E->RxFifoOvrErr++;
      if(LSR&0x04) E->ParityErr++;
      if(LSR&0x08) E->FrameErr++;
      if(LSR&0x10) E->BreakErr++; 
      continue;
    };
    if(isr == 0) // изменение в MSR
    { if(U1MSR & 0x10) // если линия CTS перешла в активное состояние
      {// надо возобновить передачу если в буфере есть что передавать
        if(CircBuffer_GetChar(&U1TxBuffer,&c)) // если есть что передавать
          { U1IER = 0x0f; // разрешим прерывания по передаче
            U1THR = c;
            Uart1Error.TxBytesSent++;
          }; // передаем
      }
      else
      { // наче запретим прерывания по передаче прекратив передачу
        U1IER = 0x0d;
      };
      continue;
    };
    //если никакое прерывание не опознано - вываливаемся 
    break; 
  }; // while
}