Привет всем.
Пишу проект, обмен данными между центральным устройством и 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);
}