2017-11-03 3 views
0

Die STM32F723IEK6 Discovery-Board hat eine volle Geschwindigkeit USB-Schnittstelle. Ich versuche es vergebens zu initialisieren. Das Rücksetzsignal wird niemals vom Host empfangen und das entsprechende Interrupt-Flag ist nicht gesetzt.STM32F7 Entdeckung - USB FS Host/Device-Modus-Erkennung

Die FS-Schnittstelle ist OTG. Es soll die VBUS-Spannung und den Zustand des ID-Pins erkennen, um festzustellen, ob es als Host oder als Gerät angeschlossen ist. Im Gerätemodus sollte VBUS vom Host bereitgestellt werden und der ID-Pin sollte getrennt und auf HIGH gezogen werden. Wenn das Gerät eine Verbindung erkennt, sollte es den DP-Pin ziehen, um die Verbindung zum Host anzuzeigen. Dann sendet der Host das RESET-Signal durch Ziehen von Datenleitungen niedrig. Das ist die Theorie.

Es scheint, dass der Vorstand nicht hoch, um die DP-Leitung nicht ziehen. In der Standard-OTG-Konfiguration (wie im folgenden Programm) werden bei aktivierter VBUS-Erkennung nur CIDSCHG- (ID-Änderung), SRQINT- (Sitzung) und SOF-Bits im GINTSTS-Register gesetzt. Das CMOD-Bit ist Null und zeigt den Gerätemodus an. Die ID-Leitung scheint niedrig zu sein, auch wenn das Kabel nicht angeschlossen ist.

I konfigurieren, dass die entsprechenden Stifte (A9, A10, A11, A12) im Modus 10 AF (OTG FS). Dies kann jedoch unnötig sein, da der FS-PHY direkt mit den Pins verbunden zu sein scheint, wobei der GPIO-Multiplexer umgangen wird (nicht sicher).

I haben versucht, den Gerätemodus zwingen und VBUS Detektions Deaktivierung, aber dies keinen Effekt verursacht wird, sowie das Ziehen des ID Linie von GPIO auf.

Ich habe den gleichen Code, bevor sie auf einem STM32F4 Board laufen und hatte keine derartigen Probleme.

Ich mag würde verstehen, warum Verbindung Erkennung funktioniert nicht.

Der Code ist unten, tut mir leid, dass worry, es hat die Uhr, GPIO und USB-Initialisierungscode, einige Hilfsfunktionen sind weggelassen.

STM32F72x Referenzhandbuch (15MB!) http://www.st.com/resource/en/reference_manual/dm00305990.pdf

Datenblatt http://www.st.com/resource/en/datasheet/DM00330506.pdf

Vorstand Handbuch http://www.st.com/resource/en/user_manual/dm00342318.pdf

#include "stm32f7xx.h" 

#define PLL_M 25 
#define PLL_N 336 
#define PLL_P 0 
#define PLL_Q 7 
#define SYS_FREQ 168000000 

void rcc_config(void) 
{ 
    RCC->APB1ENR |= RCC_APB1ENR_PWREN; 
    PWR->CR1 = (PWR->CR1 & ~PWR_CR1_VOS_Msk) 
      | PWR_CR1_VOS_1; 
    RCC->CR |= RCC_CR_HSEON; 
    while ((RCC->CR & RCC_CR_HSERDY) == 0); 
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (PLL_P << 16) | RCC_PLLCFGR_PLLSRC_HSE | (PLL_Q << 24); 
    RCC->CR |= RCC_CR_PLLON; 
    RCC->CFGR = (RCC->CFGR & ~(RCC_CFGR_HPRE_Msk | RCC_CFGR_PPRE1_Msk | RCC_CFGR_PPRE2_Msk)) 
      | RCC_CFGR_HPRE_DIV1 
      | RCC_CFGR_PPRE2_DIV2 
      | RCC_CFGR_PPRE1_DIV4; 
    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ARTEN | FLASH_ACR_LATENCY_5WS; 
    while ((RCC->CR & RCC_CR_PLLRDY) == 0); 
    while ((PWR->CSR1 & PWR_CSR1_VOSRDY) == 0); 
    RCC->CFGR &= RCC_CFGR_SW; 
    RCC->CFGR |= RCC_CFGR_SW_PLL; 
    while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); 
} 

#define GPIO_OTYPE_PP 0 
#define GPIO_OTYPE_OD 1 
#define GPIO_PULLUP 1 

void gpio_config_mode(GPIO_TypeDef* gpio, unsigned pin, unsigned mode) 
{ 
    gpio->MODER = (gpio->MODER & ~(3u << (2 * pin))) | (mode << (2 * pin)); 
} 
void gpio_config_in(GPIO_TypeDef* gpio, unsigned pin) 
{ 
    gpio_config_mode(gpio, pin, 0); 
} 
void gpio_config_out(GPIO_TypeDef* gpio, unsigned pin, unsigned otype, unsigned ospeed) 
{ 
    gpio_config_mode(gpio, pin, 1); 
    gpio->OTYPER = (gpio->OTYPER & ~(1u << (1 * pin))) | (otype << (1 * pin)); 
    gpio->OSPEEDR = (gpio->OSPEEDR & ~(3u << (2 * pin))) | (ospeed << (2 * pin)); 
} 
void gpio_config_af(GPIO_TypeDef* gpio, unsigned pin, unsigned af) 
{ 
    gpio_config_mode(gpio, pin, 2); 
    unsigned pin_group = pin >> 3; 
    unsigned pin_offset = pin & 7; 
    gpio->AFR[pin_group] = (gpio->AFR[pin_group] & ~(0xf << (pin_offset * 4))) 
      | (af << (pin_offset * 4)); 
} 
void gpio_config_pullup(GPIO_TypeDef* gpio, unsigned pin, unsigned pupd) 
{ 
    gpio->PUPDR = (gpio->PUPDR & ~(3u << (2 * pin))) | (pupd << (2 * pin)); 
} 

USB_OTG_GlobalTypeDef *usb = USB_OTG_FS; 
USB_OTG_DeviceTypeDef *usb_dev = (USB_OTG_DeviceTypeDef *)(USB_OTG_FS_PERIPH_BASE + USB_OTG_DEVICE_BASE); 

void usb_config(void) 
{ 
    /* The application must program this register before starting any transactions 
    * on either the AHB or the USB. Do not make changes to this register after 
    * the initial programming. */ 
    usb->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL; // TODO: no effect for F7, read-only bit 
// usb->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD; 
    /* After setting the force bit, the application must wait at least * 25 ms 
    * before the change takes effect. */ 
    delay_ms(25); 

    // USB core reset 
    while ((usb->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0); 
    usb->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; 
    while ((usb->GRSTCTL & USB_OTG_GRSTCTL_CSRST) != 0); 
    delay_us(1); // actually, 3 PHY clocks 

    usb_dev->DCFG = USB_OTG_DCFG_DSPD_0 | USB_OTG_DCFG_DSPD_1; // full speed 
// usb->GAHBCFG = 0; 
// usb->PCGCTL = 0; 
    usb->GCCFG |= USB_OTG_GCCFG_VBDEN; // VBUS detection 
    usb->GCCFG |= USB_OTG_GCCFG_PWRDWN; // enable PHY 

/// usb->GINTSTS= 0xFFFFFFFF; 
// usb->GINTMSK = 0; 
// usb->GINTSTS = 0xFFFFFFFF; 
// usb->GAHBCFG |= USB_OTG_GAHBCFG_GINT; 
} 

void usb_poll(void) 
{ 
    uint32_t intsts = usb->GINTSTS; 
    if (intsts & USB_OTG_GINTSTS_USBRST) 
     usb->GINTSTS = USB_OTG_GINTSTS_USBRST; 
    if (intsts & USB_OTG_GINTSTS_RSTDET) 
     usb->GINTSTS = USB_OTG_GINTSTS_RSTDET; 
    if (intsts & USB_OTG_GINTSTS_ENUMDNE) 
     usb->GINTSTS = USB_OTG_GINTSTS_ENUMDNE; 
    if (intsts & USB_OTG_GINTSTS_CIDSCHG) 
     usb->GINTSTS = USB_OTG_GINTSTS_CIDSCHG; 
    if (intsts & USB_OTG_GINTSTS_SRQINT) 
     usb->GINTSTS = USB_OTG_GINTSTS_SRQINT; 
} 

#define LED_PIN 5 
#define USB_AF 10 

int main() 
{ 
    rcc_config(); 

    SysTick->LOAD = 0xffffffu; 
    SysTick->VAL = 0; 
    SysTick->CTRL = 5; 

    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; 
    gpio_config_out(GPIOA, LED_PIN, GPIO_OTYPE_PP, 0); 
    gpio_config_af(GPIOA, 9, USB_AF); // VBUS_DET 
    gpio_config_af(GPIOA, 10, USB_AF); // ID 
    gpio_config_af(GPIOA, 11, USB_AF); // DM 
    gpio_config_af(GPIOA, 12, USB_AF); // DP 

    RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN; 
    usb_config(); 
    while (1) 
     usb_poll(); 
} 

Antwort

0

Natürlich.

OTG_FS_DCTL Register:

Bit 1

SDIS:

Weiche disconnect Die Anwendung verwendet dieses Bit der USB-OTG-Kern zu signalisieren, eine weiche disconnect auszuführen. Solange dieses Bit gesetzt ist, sieht der Host nicht, dass das Gerät verbunden ist, und das Gerät empfängt keine Signale auf dem USB. Der Kern verbleibt im getrennten Zustand , bis die Anwendung dieses Bit löscht. 0: Normal Operation. Wenn dieses Bit nach einer Soft-Trennung gelöscht wird, generiert der Core ein Geräteverbindungsereignis zum USB-Host. Wenn das Gerät wieder mit verbunden ist, startet der USB-Host die Geräteauflistung neu. 1: Der Core generiert ein Gerätetrennereignis für den USB-Host.

Vom STM32F411 Handbuch:

Reset-Wert: 0x0000 0000

Vom STM32F723 Handbuch:

Reset-Wert: 0x0000 0002

Sofern der Rücksetzwert nicht von der Anwendung geändert wird, startet der USB-Baustein STM32F7 im Zustand "Soft-Disconnect", während STM32F4 unmittelbar nach Erkennung von VBUS versucht, eine Verbindung herzustellen. Die Dokumentation (z.B. Abschnitt 32.6.2 Periphere Zustände) erwähnt diese Tatsache überhaupt nicht.

In meinem Fall löschte das SDIS-Bit den erfolgreichen Verbindungs-Handshake.