roboforum.ru

Технический форум по робототехнике.

THRE Interrupt срабатывает со второй попытки

ARM7, ARM9, ARM11 etc.

THRE Interrupt срабатывает со второй попытки

Сообщение iv_mic » 28 сен 2009, 01:42

Привет всем.
Пишу проект, обмен данными между центральным устройством и MCD2140(LPC2148) через UART, управляемые прерываниями.
Программа симуляции (центральное устройство) посылает телеграмму на MCD2140, в ответ на это посылается ответ.

Телеграмма поступает полностью, все Ок. Но ответ уходит, только на каждую вторую телеграмму. К примеру отсылаю.....--> в буфере приема телеграмма есть, но буфер отсылки пуст. Когда отсылаю вторую, то лишь тогда и буфер отсылки заполняется.

Может у кого какие идеи есть?

Код: Выделить всёРазвернуть

void uart1_irq (void)__irq
{
UINT8                         ucDummy;
UINT8                         ucIIR;
UINT16                        unIO;
volatile struct S_UART1_RECEI *pre;
volatile struct S_UART1_TRANS *ptr;

IENABLE;                       
ucIIR = U1IIR;
switch (ucIIR & 0x0E)
{
  case 0x06:                     
   ucDummy = U1LSR;               
   break;

  case 0x04:                     
  case 0x0C:                     
   pre = &g_sReBuf1;
   unIO = pre->unIn;
   pre->caBuf[unIO++] = U1RBR;
   pre->unIn = unIO & (RBUF1_SIZE - 1);
   break;

  case 0x02:                     
   ptr = &g_sTrBuf1;
   if (ptr->unIn != ptr->unOu)
   {
    unIO = ptr->unOu;
    U1THR = ptr->caBuf[unIO++];
    ptr->unOu = unIO & (TBUF1_SIZE - 1);
    tx_restart1 = 0;
   }
   else
   {
    tx_restart1 = 1;
   }
   break;

  case 0x00:                   
   ucDummy = U1MSR;               
   break;
}
IDISABLE;                       
VICVectAddr = 0;               
}




Код: Выделить всёРазвернуть

INT16 uart1_putstream(UINT8 *pc_str, INT16 nLen)
{
INT16                nCou = 0;
struct S_UART1_TRANS *ptr = &g_sTrBuf1;

do
{
 
  if (tx_restart1)
  {
   tx_restart1 = 0;
   U1THR = *pc_str++;
  }
  else
  {
 
   UINT16 unI = ptr->unIn;
   if ( ((unI+1) & (TBUF1_SIZE - 1)) ==  ptr->unOu) return (-1);

   ptr->caBuf[unI++] = *pc_str++;
   ptr->unIn = unI & (TBUF1_SIZE - 1);
  }
  nCou++;
  nLen--;
}
while (nLen > 0);

return (nCou);
}


iv_mic
 
Сообщения: 3
Зарегистрирован: 15 сен 2009, 22:40
Откуда: pensa

Re: THRE Interrupt срабатывает со второй попытки

Сообщение avr123.nm.ru » 28 сен 2009, 10:08

Идея моя в том что наверно ваш код не соотвтетсвует тому что вы планировали.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8


Вернуться в ARM

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12