Перейти к содержанию

stm32f4 usb fs - непойму как работает bulkIN

Привет всем!
уже довольно долго мучаюсь с попыткой поднять стек MSD на unicore-mx. портит все дело внезапные остановы отправки пакетов в bulkIN точке. (почемуто на точке0 никаких проблем нету)
вот последний анамнез ставящий меня в тупик:

Код
        cm_disable_interrupts();
        REBASE(DWC_OTG_DIEPxTSIZ, ep_num) =     mc_from_flags(transfer->flags) |     DWC_OTG_DIEPTSIZ_PKTCNT(pktcnt) |DWC_OTG_DIEPTSIZ_XFRSIZ(transfer->length);
//* вот тут вот установлен NACK - чтобы точка не вела активность пока в ее ФИФО чтото кидается
        REBASE(DWC_OTG_DIEPxCTL, ep_num) = DWC_OTG_DIEPCTL_EPENA |    DWC_OTG_DIEPCTL_MPSIZ(transfer->ep_size) |    DWC_OTG_DIEPCTL_SNAK | DWC_OTG_DIEPCTL_TXFNUM(ep_num) | ptyp_map[transfer->ep_type] | DWC_OTG_DIEPCTL_USBAEP;

        USBD_LOGF_LN(USB_VIO, "USBD:submit urb%"PRIurb" on ep8%"PRIx8" DIEPxTSIZ=%x"
                , view_urbid(urb->id), ep_num, REBASE(DWC_OTG_DIEPxTSIZ, ep_num) );

        /* Push first packet to memory! */
        if (transfer->length) {
            /* Enable empty interrupt mask */
            REBASE(DWC_OTG_DIEPEMPMSK) |= DWC_OTG_DIEPEMPMSK_INEPTXFEM(ep_num);

            urb_to_fifo_1pkt(dev, urb);
        }
//* вот тут вот установлен ACK - чтобы точка начала отправку
        REBASE(DWC_OTG_DIEPxCTL, ep_num) |= DWC_OTG_DIEPCTL_CNAK;
        cm_enable_interrupts();

        /* Enable Interrupt */
        REBASE(DWC_OTG_DAINTMSK) |= DWC_OTG_DAINTMSK_IEPM(ep_num);

останов на последнем операторе - включение прерываний, показывает изумительную картину:
флаг XFRC - установлен, что и понятно, вссь пакет ушел в фифо.
флаг TXFE - чист, а DTXFSTSx - показывает что в фифо завис мой пакет, и никуда не отправляется. при этом DIEPCTL показывает флаг NACKSTS = 0

на этом месте обмен с хостом останавливается, и спустя таймаут хоста требует ресета.

Кто боролся с ФИФО в стмах - расскажите что я нетак курю? как правильно работать с отправкой балк-пакетов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация