roboforum.ru

Технический форум по робототехнике.
Текущее время: 26 ноя 2024, 21:29

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: THRE Interrupt срабатывает со второй попытки
СообщениеДобавлено: 28 сен 2009, 01:42 
Не в сети

Зарегистрирован: 15 сен 2009, 22:40
Сообщения: 3
Откуда: pensa
Привет всем.
Пишу проект, обмен данными между центральным устройством и 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);
}




Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: THRE Interrupt срабатывает со второй попытки
СообщениеДобавлено: 28 сен 2009, 10:08 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Идея моя в том что наверно ваш код не соотвтетсвует тому что вы планировали.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO