我正在做一个项目,我需要与USB芯片进行通信。我使用的是STM32微控制器。(stm32f446ret6,http://www.st.com/web/en/resource/technical/document/datasheet/DM00141306.pdf)
为了与USB 芯片通信,我需要使用ULPI接口。这是一种并行通信。此接口的时钟频率为60 This。
我的STM32-controller的频率是180 my (他的最大频率,我检查了两次)。因此,对于ULPI接口的每一个时钟脉冲,单片机都有3个时钟脉冲。
为了与USB-PHY芯片通信,我需要首先让设备知道,女巫注册我想调整。当USB-PHY芯片收到这个命令时,他会把NXT线路调高.

我觉得这是我的问题。我需要检查一下,否则就太高了(如果是声明的话)。我想这就是我的问题所在。如果语句会占用很多时钟周期,是否有可能?有办法解决这个问题吗?
我的代码:
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;
}
}
}发布于 2016-04-14 16:31:15
您需要使用您的微控制器的USB_HS外设与该硬件进行交互,而不是使用它的GPIOs。全球投资组织将无法满足时间要求。
有关硬件接口的信息可在STM32F4参考手册的第35章(“STM32F4参考手册”)以及ST的其他文档中获得。
发布于 2016-04-14 13:21:10
你试着和PHY进行“位敲”模式的交流吗?这是一种非常糟糕的做法。
请查看usb全速设备库和以下应用程序,不要:手册/CD00289278.pdf 00289278.pdf
https://stackoverflow.com/questions/35287799
复制相似问题