Работаю с виртуальным COM портом (пример с сайта Atmel, называется AVR272). вырезал все что связанно с примером из файла cdc_task.c
Принимаю по прерыванию символ из терминала на компьютере и отвечаю содержимым массива data_tx в случае если пришел символ "q".
написал такой код:
Usb_select_endpoint(RX_EP); //выбираем OUT точку
if (Is_usb_receive_out()) // если прерывание по приему данных; UEINTX&(1<<RXOUTI)
{
Usb_ack_control_out(); // подтверждение; UEINTX &= ~(1<<RXOUTI);
data_rx = Usb_read_byte(); //читаем что пришло
Usb_ack_fifocon(); // освобождение банка точки OUT; UEINTX &= ~(1<<FIFOCON);
if (data_rx == 'q') // если пришел символ "q"
{
Usb_select_endpoint(TX_EP); //выбираем IN точку
if (Is_usb_in_ready()) // Если прерывание по готовности передатчика; UEINTX&(1<<TXINI)
{
Usb_send_control_in(); // подтверждение обработки прерывания; UEINTX &= ~(1<<TXINI);
usb_send_packet(TX_EP,(U8*)&data_tx, 7); // отправляем data_tx
Usb_ack_fifocon(); // сбрасываем бит FIFOCON для отправки; UEINTX &= ~(1<<FIFOCON);
}
}
}
и вставил его в обработчик Прерываний конечных точек
#pragma vector = USB_Endpoint_vect
__interrupt void USB_Endpoint_interrupt()
{
//сюда
}
не заработало, теперь вставил его в обработчик прерываний usb
#pragma vector = USB_General_vect
__interrupt void usb_general_interrupt()
{
//сюда
}
Работает как часы. Почему? как заставить все это работать в USB_Endpoint_vect? согласно даташиту именно этот вектор отвечает за прерывания использованные мной (RXOUTI, TXINI ) ...