Andreas1 1 2 марта, 2021 Опубликовано 2 марта, 2021 · Жалоба STM32H743с внешним ULPI USB3315 Модифицирую старый работающий(еще с stm32f105) код для работы с новым семейством. С FIFO все работает, но не устраивает скорость. Пытаюсь запустить встроенный DMA и вообще не идут прерывания от конечной точки и нет никакой передачи. _OTG_GENERAL->CCFG = OTG_FS_GENERAL_CCFG_PWRDWN;//0; //disable HNP/SRP _OTG_GENERAL->OTGCTL = 0; //Device init: for stm32h7 must select phy and device mode before reset. _OTG_DEVICE->CFG = 0 | (1 << 14); _OTG_GENERAL->USBCFG = (1 << 21) | (1 << 15) | OTG_FS_GENERAL_USBCFG_FDMOD | (9 << OTG_FS_GENERAL_USBCFG_TRDT_POS) | (17 << OTG_FS_GENERAL_USBCFG_TOCAL_POS); //reset core _OTG_GENERAL->RSTCTL |= OTG_FS_GENERAL_RSTCTL_CSRST; while (_OTG_GENERAL->RSTCTL & OTG_FS_GENERAL_RSTCTL_CSRST) {}; while ((_OTG_GENERAL->RSTCTL & OTG_FS_GENERAL_RSTCTL_AHBIDL) == 0) {} for(int i = 0; i < 1000; i++) __NOP(); _OTG_GENERAL->AHBCFG = (OTG_FS_GENERAL_AHBCFG_GINT) | OTG_FS_GENERAL_AHBCFG_HBSTLEN_INCR4 | OTG_FS_GENERAL_AHBCFG_DMAEN; _OTG_DEVICE->THRCTL = OTG_HS_DEVICE_THRCTL_ARPEN | OTG_HS_DEVICE_THRCTL_NONISOTHREN | (4 << OTG_HS_DEVICE_THRCTL_TXTHRLEN_Msk) | (4 << OTG_HS_DEVICE_THRCTL_RXTHRLEN_Msk); //repeat setup after reset _OTG_GENERAL->USBCFG = (1 << 21) | (1 << 15) | OTG_FS_GENERAL_USBCFG_FDMOD | (trdt << OTG_FS_GENERAL_USBCFG_TRDT_POS) | (17 << OTG_FS_GENERAL_USBCFG_TOCAL_POS); _OTG_GENERAL->INTMSK = OTG_FS_GENERAL_INTMSK_USBSUSPM | OTG_FS_GENERAL_INTMSK_ENUMDNEM | OTG_FS_GENERAL_INTMSK_IEPM | OTG_FS_GENERAL_INTMSK_OEPM; _OTG_DEVICE->OEPMSK = 0xffffffff | OTG_FS_DEVICE_OEPMSK_XFRCM | OTG_FS_DEVICE_OEPMSK_STUPM; _OTG_GENERAL->CCFG |= OTG_FS_GENERAL_CCFG_VBUSBSEN; //disable endpoint interrupts, except IN XFRC _OTG_DEVICE->IEPMSK = OTG_FS_DEVICE_IEPMSK_XFRCM; _OTG_DEVICE->CTL = OTG_FS_DEVICE_CTL_POPRGDNE; //Setup data FIFO _OTG_GENERAL->RXFSIZ = ((64 / 4) + 1) * 2 + 10 + 1; //Unmask global interrupts _OTG_GENERAL->INTMSK |= OTG_FS_GENERAL_INTMSK_OTGM; _OTG_DEVICE->OEPMSK = 0xffffffff; _OTG_DEVICE->AINTMSK = 0xffffffff; _OTG_DEVICE->OUTEP[0].TSIZ = (1U << 19) | (64) | (1 << USB_OTG_DOEPTSIZ_STUPCNT_Pos); _OTG_DEVICE->OUTEP[0].DMA = (uint32_t)&setup; SCB_InvalidateDCache_by_Addr((((uint32_t)&setup) +31)&31, 64); _OTG_DEVICE->OUTEP[0].CTL = OTG_FS_DEVICE_ENDPOINT_CTL_CNAK | OTG_FS_DEVICE_ENDPOINT_CTL_USBAEP; После подключения получаю прерывание ENDNUM, по нему раньше включалась IN0, OUT0. И больше никаких прерываний не происходит. _OTG_DEVICE->OUTEP[0].INT=0 , хотя SETUP пакет получен, флаг OTG_FS_GENERAL_INTMSK_RXFLVLM взведен и я могу прочитать из FIFO правильные данные. При этом в буфере DMA ничего нет. В версии с FIFO по флагу OTG_FS_GENERAL_INTMSK_RXFLVLM читается принятые данные и в зависимости от OTG_GRXSTSR распределяются по назначени. При этом я пробовал печатать OUTEP[0].INT в разные моменты и при этом никакие флаги в процессе приема SETUP не взводятся. В HAL от ST обработка без DMA также ведется по якобы отладочному регистру OTG_GRXSTSR . Но при DMA прерывание по флагу непустого FIFO не включается и якобы обработка ведется только по прерыванию от конечной точки. Но его нет!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vil-2 0 2 марта, 2021 Опубликовано 2 марта, 2021 · Жалоба Я не работал с USB на таких процах. Но кину свой пробный камень - он скорее всего будет "мимо", а может чисто случайно и поможет. Просьба не пинать за невежество :-) Когда флаг готовности данных используется для запуска DMA, то по окончании транзакции этот флаг сбрасывается контроллером DMA (т.е. почти мгновенно). Если хочется, чтобы вместе с передачей по DMA еще выполнялся запрос на прерывание, необходимо чтобы флаг разрешения прерывания ПЕРИФЕРИИ(а не NVIC) был установлен ДО разрешения работы по DMA (или чтобы он тупо был всегда установлен). Иначе запрос на прерывание не дойдет до NVIC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться