2016-02-09 01:37 AM
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-stm322016-02-09 03:36 AM
for(int i =0; i==1; i++); //waste some time
this is not true. On which optimization you working? Your pin driving looks very strange2016-02-09 07:49 AM
This isn't VHDL or assembler, all your instructions are going to take several cycles. If you want some semblance of control use assembler, and review the BSRR port of the GPIO peripheral.
Perhaps you can use a CPLD/FPGA to clock hardware at these speeds?