AnsweredAssumed Answered

timing if statement stm32

Question asked by bosmans.stijn on Feb 9, 2016
Latest reply on Feb 9, 2016 by Clive One

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.

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


}

Attachments

Outcomes