timing if statement stm32
- February 9, 2016
- 2 replies
- 1538 views
I'm working on a porject where I need to communicate with an USB PHY chip. I am using a STM32 microcontoller. (stm32f446ret6,
http://www.st.com/web/en/resource/technical/document/datasheet/DM00141306.pdf
)To communicate with the USB PHY chip, I need to use the ULPI interface. This is an parallel communication. This interface has a clockfrequenty of 60MHz.
The frequency of my STM32-controller is 180MHz(his maximum, I checked this twice). So for every clock pulse of the ULPI interface, the microcontroller had 3 clockpulses.
To communicate with the USB-PHY chip, I need first to let the device know, witch register I want to adjust. When the USB-PHY chip received this command good, he will set the NXT line high.
http://i.stack.imgur.com/wsGg2.jpg
I think this is my problem. I need to check or this is high (offcourse with an if-statement). And that is where my problem is, I think. Is it possible that the if-statement takes to many clock-cycles? Is there a way to fix this problem?
My 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; } }} #timing-stm32