2016-02-09 2 views
0

Я работаю над проектом, где мне нужно общаться с чипом USB PHY. Я использую микроконтроллер STM32. (Stm32f446ret6, http://www.st.com/web/en/resource/technical/document/datasheet/DM00141306.pdf)stm32 timing ULPI interface

Для связи с USB PHY чип, мне нужно использовать интерфейс ULPI. Это параллельное общение. Этот интерфейс имеет частоту 60 МГц.

Частота моего STM32-контроллер является 180MHz (его максимум, я проверил это дважды). Таким образом, для каждого тактового импульса интерфейса ULPI микроконтроллер имел 3 тактовых импульса.

Чтобы связаться с микросхемой USB-PHY, мне нужно сначала, чтобы знать устройство, регистр witch, который я хочу настроить. Когда чип USB-PHY получил эту команду хорошо, он установит высоту линии NXT.

ULPI timing

Я думаю, что это моя проблема. Мне нужно проверить или это высоко (с сообщением if). И я думаю, что это моя проблема. Возможно ли, что оператор if принимает много тактов? Есть ли способ решить эту проблему?

Мой код:

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; 
     } 
    } 

} 

ответ

1

Вы должны использовать USB_HS периферийное вашего микроконтроллера для взаимодействия с этим оборудованием, а не его GPIOs. GPIO не будут удовлетворять требованиям времени.

Информация об аппаратном интерфейсе доступна в главе 35 («OTG_HS») the STM32F4 reference manual, а также в другой документации от ST.

 Смежные вопросы

  • Нет связанных вопросов^_^