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

проблема с USB в режиме DMA на STM32H743

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 не включается и якобы обработка ведется только по прерыванию от конечной точки. Но его нет!!

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


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

Я не работал с USB на таких процах. Но кину свой пробный камень - он скорее всего будет "мимо", а может чисто случайно и поможет. Просьба не пинать за невежество :-)

Когда флаг готовности данных используется для запуска DMA, то по окончании транзакции этот флаг сбрасывается контроллером DMA (т.е. почти мгновенно). Если хочется, чтобы вместе с передачей по DMA еще выполнялся запрос на прерывание, необходимо чтобы флаг разрешения прерывания ПЕРИФЕРИИ(а не NVIC) был установлен ДО разрешения работы по DMA (или чтобы он тупо был всегда установлен). Иначе запрос на прерывание не дойдет до NVIC.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...