c++ - stm32时序ULPI接口(interface)

标签 c++ c if-statement timing stm32

我正在开展一个项目,我需要与 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 线设置为高电平。

ULPI timing

我认为这是我的问题。我需要检查或者这是高(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/

相关文章:

python - 用户输入并陷入 while 循环

javascript - 将 div 设置为固定,直到它与其他元素接触并成为绝对元素。向上滚动时不会恢复为固定状态

c++ - 类型转换 void* 并将其放入 ostringstream

c - 在没有 malloc 的情况下在 C 中实现一个简单的链表

c - 如何从十六进制转储中提取字节?

c - 如何在 C 中获取发件人的 UDP 端口?

sql-server - T-SQL - 存储过程 - "IF EXISTS"与 "WHERE EXISTS"

c++ - 如何使我的 std::vector 实现更快?

c++ - 是否有基于参数设置变量的约定?

c++ - 使用 boost interval_map