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