我正在开展一个项目,我需要与 USB PHY 芯片进行通信。我正在使用 STM32 微 Controller 。 (stm32f446ret6,http://www.st.com/web/en/resource/technical/document/datasheet/DM00141306.pdf)
要与USB PHY芯片通信,我需要使用ULPI接口(interface)。这是一个并行的通信。该接口(interface)的时钟频率为 60MHz。
我的 STM32-controller 的频率是 180MHz(他的最大值,我检查了两次)。因此对于 ULPI 接口(interface)的每个时钟脉冲,微 Controller 有 3 个时钟脉冲。
要与 USB-PHY 芯片通信,我首先需要让设备知道我要调整的寄存器。当USB-PHY 芯片收到这条命令时,他会将NXT 线设置为高电平。
我认为这是我的问题。我需要检查或者这是高(offcourse with if-statement)。我认为这就是我的问题所在。 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;
}
}
}
最佳答案
您需要使用微 Controller 的 USB_HS 外设与该硬件交互,而不是其 GPIO。 GPIO 将无法满足时序要求。
有关硬件接口(interface)的信息可在 the STM32F4 reference manual 的第 35 章(“OTG_HS”)中找到,以及来自 ST 的其他文档。
关于c++ - stm32时序ULPI接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35287799/