[an error occurred while processing this directive]
|
Когда приходят данные, происходит прерывание, в этом прервании устанавливаю флажек, что данные готовы. Аналогично с отравкой данных.
void TMER1_ISR()
{
while (((U1LSR & 0x01) == 1) && (RxLength1 < USB_VCOM_BUFSIZE))
{//читаю данные из UARTа в буфер
UART2USBBuf1[RxLength1] = U1RBR;
RxLength1++;
}if(Data2UART)
{//Пришли данные для передачи в UART
DeviceData2UART();
Data2UART = 0;
}
else if(Data2Host1)
{//Предыдущий пакет отправлен
if (RxLength1 != 0)
{
USB_WriteEP(0x80 | 0x05, &UART2USBBuf1[0], RxLength1 );
RxLength1 = 0;
Data2Host1 = 0;
}
}
T0IR = 0xff;
}void UART1_ISR()//Прерывание от UART
{//Включено только прерывние по THREif(UART1_cnt == 0)
{
if(UART1_DR)
{//Новая партия данных готова
UART1_pData = &USB2UARTBuf1[0];
UART1_cnt = USB_ReadEP(0x05, UART1_pData);
UART1_DR = false;
}
else
{ //Данных для передачи больше нет
U1IER &= ~0x02;//Запрещаю прерывание
UART1_Tx_complete = true;
return;
}
}for(int i = 0; i < 15; i++)
{
U1THR = *UART1_pData++;
UART1_cnt--;
if(UART1_cnt == 0)return;
}
}void DeviceData2UART()
{
BYTE *pData;
BYTE cnt;if(UART1_Tx_complete)
{
pData = &USB2UARTBuf1[0];
cnt = USB_ReadEP(0x05, pData);
for(int i = 0; i<15; i++)
{
if(cnt != 0)
{
U1THR = *pData++;
cnt--;
}
else break;
}
UART1_cnt = cnt;
UART1_pData = pData;
UART1_Tx_complete = false;
UART1_DR = false;
U1IER |= 0x02;
}
else
{
UART1_DR = true;
}}
void USB_EndPoint5 (DWORD event)
{//Сюда попадаю из прерывания по USB
switch (event)
{
case USB_EVT_IN:
//Данные хосту отправленны
Data2Host1 = 1;
break;
case USB_EVT_OUT:
//Пришли данные от хоста
Data2UART = 1;
break;
}
}