реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Si8051F320 от SiLabs and USB, Передача данных USB_Bulk, прерывание
Kaplinsky
сообщение Sep 27 2005, 15:08
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 97
Регистрация: 26-05-05
Из: Киев, Украина
Пользователь №: 5 426



В даташите к 320-й написано что бит INPRDY (EINCSRL.0) устанавливается програмно а очищается аппаратно. В примере USB_Bulk, в функции BulkOrInterruptIn(...) есть такой кусочек:
Цитата
      // If a FIFO slot is open, write a new packet to the IN FIFO
      if (!(bCsrL & rbInINPRDY)){
        pEpInStatus->uNumBytes = NumBytes;
        pEpInStatus->pData = (BYTE*)DataToWrite;

        // Write <uNumBytes> bytes to the <bEp> FIFO
        FIFOWrite(pEpInStatus->bEp, pEpInStatus->uNumBytes,(BYTE*)pEpInStatus->pData);

        // Set Packet Ready bit (INPRDY)
        UWRITE_BYTE(EINCSRL, rbInINPRDY);
      }


Короче говоря у меня на второй раз этот кусок затыкается - при первой проверке у меня FIFO slot NOT is open

Я же вызываю функцию BulkOrInterruptIn(...) из функции main().
И по идее после того как произойдет передача буфера FIFO вызовется прерывание. КАК ЕГО ОБРАБАТЫВАТЬ ?
Что нужно делать в USB_ISR()
Цитата
void USB_ISR () interrupt 8{
  ....
  // Endpoint1 IN
  if (bInInt & rbIN1){
              ЧТО ДЕЛАТЬ СДЕСЬ ???
    }
  ....
}

cranky.gif


--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание.
Отладка / Софокл, "Аякс".
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Sep 27 2005, 18:37
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(Kaplinsky @ Sep 27 2005, 18:08)
Я же вызываю функцию BulkOrInterruptIn(...) из функции main().
*

В этом случае необходимо гарантировать отсутствие прерываний на все время работы с выбранной IN endpoint. Простое и грубое решение - запретить все прерывания на время выполнения функции BulkOrInterruptIn(...), т.е.:
void BulkOrInterruptIn (...)
{
BYTE bCsrL, bCsrH;
EA =0; // Turn off interrupts
...
...
...
EA =1; // Turn on interrupts
}

Если этого не сделать, то возможны самые разнообразные "глюки" от отсутствия обмена до "зависания" контроллера.



Цитата(Kaplinsky @ Sep 27 2005, 18:08)
Короче говоря у меня на второй раз этот кусок затыкается - при первой проверке у меня FIFO slot NOT is open
*

Будет понятнее, если написать так: при первом вызове функции BulkOrInterruptIn(...) в FIFO есть место для записи пакета (из 64 байт). А при следующем вызове этой функции в FIFO нет места для нового пакета. Такая ситуация возможна, если SIE не успевает передать пакет за время между первым и вторым вызовом функции BulkOrInterruptIn(...). То есть, или промежуток времени слишком мал, или Windows не распознала устройство и не подключила драйвер устройства.



Цитата(Kaplinsky @ Sep 27 2005, 18:08)
Что нужно делать в USB_ISR()
*

В случае вызова функции BulkOrInterruptIn(...) из функции main() можно ничего не делать.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 23:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016