Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Si8051F320 от SiLabs and USB
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Kaplinsky
В даташите к 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
Konst_777
Цитата(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() можно ничего не делать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.