本帖最后由 steventuring 于 2023-12-27 18:06 编辑
如何通过I2C/smbus控制一个USB Hub?这是一个好问题。
USB4715上电后的启动流程如下图,只有进入CFG_SOC阶段才能通过smbus进行初始化的配置。 在硬件上要确保两个条件: 1. 正确上下拉CONFIG_STRAP[2:1]管脚,在CFG_STRAP阶段确保工作模式是Configuration 5。 2. 在Configuration 5模式下,PF5/PF6分别作为SDA/SCL信号,需要外部上拉。只有在SMBUS_CHECK阶段这两个信号上都检测到高电平才能确保进入到CFG_SOC阶段。 如果硬件设计正确,上电后USB4715会停在CFG_SOC阶段,等待从SOC或MCU通过i2c/smbus发来的指令。USB4715的smbus地址是2Dh。具体smbus的读写格式见AN2651 4.0章节(有点长且难懂)。精华如下文。 首先介绍其中两个常用操作字: 9937h:用于读写寄存器; AA56h:退出CFG_SOC阶段,进入正常的hub启动流程,同时保持smbus有效。 以Pickit4工具为例(这个工具可以清晰地展示i2c/smbus的操作)。如果不改变任何配置,直接让hub进入下一流程,命令如下: 04是Pickit工具的要求,表示后面要写入字节的数目; 5A是写USB4715; AA 56是特殊的操作字,表示要结束CFG_SOC阶段; 00是USB4715要求的结束字符; 写完后hub就可以进入正常的枚举过程了。 如果要在上面结束CFG_SOC前做些事情,比如读VID,填加的命令如下: 第一列是写入要读的寄存器地址 BF80 3000; 第二列9937表示是寄存器操作; 第三列表示要读16 Byte的数据,但实际USB4715返回的有效数据是从第八个字节开始的(这里找了张其他图片,结果不对,但过程没问题): 24 04 02 40 00 06 9B 28 00 第四列表示如果改成读8 Byte数据,实际上USB返回的有效数据只有24一个,前面7个都是无用的。 当USB4715正常枚举后,可以进行FLEX操作。需要操作如下寄存器(注意这个寄存器要在USB4715枚举成功后再操作): 如果想让Port1和Port0进行反转,命令格式如下: I2CWrite 5A,00,00,07,00,01,BF,80,08,08,01 | |
如果想退出反转模式,命令格式如下: I2CWrite 5A,00,00,07,00,01,BF,80,08,08,00 | |
应该是能用的。不能用就请参考下列文档: AN1700 - FlexConnect Applications AN2341 - USB4715 FlexConnect Operation AN2651 - Configuration of Microchip USB47xx/USB49xx USB4715 Datasheet
|