Я работаю над проектом, где мне нужно общаться с чипом 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.
Я думаю, что это моя проблема. Мне нужно проверить или это высоко (с сообщением 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;
}
}
}