AnsweredAssumed Answered

How to properly disable interrupts for endpoint?

Question asked by Антон Таршиков on Jan 24, 2018
Latest reply on Jan 25, 2018 by Антон Таршиков

Добрый день. Использую микроконтроллер lpc54606J512 , KSDK 2.3.0 (released 2017-11-16), IDE Keil 5.24a.
Есть USB устройство с 2-мя интерфейсами, 1 CCID(Endpoint 0x01 0x81), 2 Mass Storage(Endpoint 0x02 0x82).

Mass Storage обрабатывается сразу в прерывании.
CCID в основном потоке, по флагу.

Проблема в том что CCID работает очень медленно, как я понял проблема в слишком часты прерываниях USB(видимо обрабатываться все NAK). Для устранения этой проблемы отключаю endpoint когда они не используются через регистр INTEN и тогда работа CCID значительно ускоряется.
При полном приёме или отправке данных ставлю lpc3511IpState->registerBase->INTEN |= (uint32_t) ((0x01u << endpointIndex))
И когда сново требуется принять или отправить данные сново разрешаю прерывания через lpc3511IpState->registerBase->INTEN |= (uint32_t) (0x01u << endpointIndex);.

Но при большой нагрузке на Mass Storage, ССID в случайный момент времени перестает отвечать, а конкретнее то зависает IN точка.

Подскажите как мне правильно избегать лишних прерываний когда я не использую endpoint?

Good afternoon. I use microcontroller lpc54606J512, KSDK 2.3.0 (released 2017-11-16), IDE Keil 5.24a.
There is a USB device with 2 interfaces, 1 CCID (Endpoint 0x01 0x81), 2 Mass Storage (Endpoint 0x02 0x82).

Mass Storage is processed immediately in an interrupt.
CCID in the main thread, by the flag.

The problem is that CCID works very slowly, as I understood the problem in the USB interrupts too frequent (apparently all NAKs are processed). To solve this problem, I disable the endpoint when they are not used through the INTEN register and then the CCID operation is significantly accelerated.
At full reception or data sending I put lpc3511IpState-> registerBase-> INTEN | = (uint32_t) ((0x01u << endpointIndex))
And when I need to accept or send data again, I resolve the interrupts again through lpc3511IpState-> registerBase-> INTEN | = (uint32_t) (0x01u << endpointIndex) ;.

But with a heavy load on Mass Storage, the CCID stops responding at a random time, and more specifically the IN point hangs.

Tell me how to correctly avoid unnecessary interrupts when I do not use endpoint?

Outcomes