[英]stm32 timing ULPI interface
我正在做一個需要與USB PHY芯片進行通信的項目。 我正在使用STM32微控制器。 (stm32f446ret6, http://www.st.com/web/zh/resource/technical/document/datasheet/DM00141306.pdf )
要與USB PHY芯片通信,我需要使用ULPI接口 。 這是並行通信。 該接口的時鍾頻率為60MHz。
我的STM32控制器的頻率為180MHz (他的最大值,我檢查了兩次)。 因此,對於ULPI接口的每個時鍾脈沖,微控制器都有3個時鍾脈沖。
要與USB-PHY芯片通信,我首先需要讓設備知道,我要調整的寄存器。 當USB-PHY芯片收到此命令良好時,他會將NXT線設置為高電平。
我認為這是我的問題。 我需要檢查還是這個很高(帶有if語句的offcourse)。 我認為這就是我的問題所在。 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;
}
}
}
您需要使用微控制器的USB_HS外設與該硬件(而不是其GPIO)進行交互。 GPIO將無法滿足時序要求。
STM32F4參考手冊的第35章(“ OTG_HS”)以及ST的其他文檔中提供了有關硬件接口的信息。
您嘗試以“位域”模式與PHY通信嗎? 這是一種更糟糕的方法。
請檢出USB全速設備庫和以下應用程序: http : //www.st.com/st-web-ui/static/active/jp/resource/technical/document/user_manual/CD00289278.pdf
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.