AlexRayne 7 23 мая, 2017 Опубликовано 23 мая, 2017 · Жалоба Привет всем! уже довольно долго мучаюсь с попыткой поднять стек 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 на этом месте обмен с хостом останавливается, и спустя таймаут хоста требует ресета. Кто боролся с ФИФО в стмах - расскажите что я нетак курю? как правильно работать с отправкой балк-пакетов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться