2016-02-09 3 views
0

Je travaille sur un projet où je dois communiquer avec une puce USB PHY. J'utilise un microcontoller STM32. (Stm32f446ret6, http://www.st.com/web/en/resource/technical/document/datasheet/DM00141306.pdf)stm32 interface ULPI

Pour communiquer avec le puce USB PHY, je dois utiliser l'interface de ULPI. Ceci est une communication parallèle. Cette interface a une fréquencefrequence de 60MHz.

La fréquence de mon STM32-contrôleur est 180MHz (son maximum j'ai vérifié cette fois). Donc, pour chaque impulsion d'horloge de l'interface ULPI, le microcontrôleur avait 3 impulsions d'horloge.

Pour communiquer avec la puce USB-PHY, il faut d'abord que je sois au courant, sachant que je veux régler. Lorsque la puce USB-PHY a bien reçu cette commande, il positionne la ligne NXT en position haute.

ULPI timing

Je pense que ceci est mon problème. J'ai besoin de vérifier ou c'est élevé (offcourse avec un if-statement). Et c'est là que se situe mon problème, je pense. Est-il possible que l'instruction if prenne plusieurs cycles d'horloge? Y a-t-il un moyen de résoudre ce problème?

Mon code:

bool UPLI_setRegister_FunctionControl(void) 
{ 

    if((GPIOA -> IDR & 0x01)) {//check if the dir is high 
     return false; 
    } else { 
     GPIOB -> ODR = 4; 
     //int j =0; 

     if((GPIOA -> IDR & (uint16_t)0x0020)) { // wait until the nxt control line is high 
      GPIOB -> ODR = 0b0000000001000000; 
      /* 
      Register settings 
      LMP enable -> 0 
      SuspendM -> 1 
      Reset -> 0 
      Opmode -> 00 
      TermSelect -> 0 
      XcrvSelect -> 00 
      */ 

      if(GPIOA -> IDR & (uint16_t)0x0020) { 
       //NXT still high 
       GPIOA ->ODR |= 0x0002; //stp high 
       for(int i =0; i==1; i++); //waste some time 
       //set outputs back to 0; 
       GPIOB -> ODR = 0x0000; 
       GPIOA ->ODR = 0x0000; 
       return true; 
      } else { 
       GPIOA ->ODR |= 0x0002; //stp high 
       for(int i =0; i==1; i++); //waste some time 
       GPIOB -> ODR = 0x0000000; 
       GPIOA ->ODR = 0x000000; 
       return false; 
      } 
     } 

     else { 
      GPIOA ->ODR |= 0x0002; //stp high 
      for(int i =0; i==1; i++); //waste some time 
      GPIOB -> ODR = 0x0000000; 
      GPIOA ->ODR = 0x000000; 
      return false; 
     } 
    } 

} 

Répondre

1

Vous devez utiliser votre périphérique de microcontrôleur USB_HS interagir avec ce matériel, et non pas ses GPIO. Les GPIO seront incapables de répondre aux exigences de synchronisation.

Des informations sur l'interface matérielle sont disponibles au chapitre 35 ("OTG_HS") de the STM32F4 reference manual, ainsi que dans d'autres documentations de ST.