工具/软件:
我正在开发一个使用 DS320PR810 转接驱动器的电路板。 我还不知道如何在电路板上配置转接驱动器的最终最佳方法是什么、
因此、我设置了电路板、以便能够通过 3 种主要方式对其进行配置:
-使用引脚配置转接驱动器,在我的情况下,我使用一些 DIP 开关,这种方法似乎是最不可配置但最简单的
-使用外部 EEPROM 时,这种方法似乎提供了更多的配置选项,但根据我的读数,您只能配置整个通道组,因此您似乎不能按通道进行精细配置,但它仍然提供比引脚模式更多的配置选项, 您仍然需要编写 EEPROM 并且配置更加复杂
-使用支持 SMBus 的 MCU 或微控制器。 这似乎提供了最多的配置选项、允许您通过在每个通道的寄存器中写入所需的值来配置每个单独的通道
在我的例子中、微控制器是 STM32、它提供 2 个 SMBus 连接。
根据我到目前为止所读取和理解的内容、转接驱动器的每个寄存器都有自己的地址、因此可以被视为存储器、您可以使用 MCU 写入。
如果我想使用 STM32 来配置转接驱动器、它在 API 中有以下函数可以通过 smbus 写入存储器:
HAL_StatusTypeDef HAL_I2C_Address Mem_Write (I2C_HandleTypeDef *hi2c、uint16_t DevAddress、uint16_t MemAddress、
uint16_t MemAddSize、uint8_t *pData、uint16_t 大小、uint32_t Timeout);
从函数的签名中可以看出、我需要使用 EQ 引脚来配置转接驱动器的地址、以匹配我在调用上述函数“DevAddress"参数“参数时指定的器件地址。
然后、在上述函数中有另一个参数、即 MemAddress、这将是通道寄存器的地址和偏移。
如果 MemAddSize 参数有 1 或 2 个字节、则该参数应该是寄存器的大小。 最后 、pData 是将写入寄存器的实际数据。
我注意到、对于某些情况、您只需要在寄存器内设置一个特定的字节。 我想、要做到这一点、
我首先需要使用以下指令读取寄存器:
HAL_StatusTypeDef HAL_I2C_Address Mem_Read (I2C_HandleTypeDef *hi2c、uint16_t DevAddress、uint16_t MemAddress、
uint16_t MemAddSize、uint8_t *pData、uint16_t 大小、uint32_t Timeout);
寄存器内的实际数据将被写入 pData 中。 读取后、我只能更改读取数据中的一位、并使用第一个函数将其写回。
由于我有 2 个转接驱动器、因此需要使用不同的器件地址运行 2 次配置步骤、可能还需要为每个通道设置 EQ。
有一件事我不能完全弄清楚、就是更新的配置何时生效? 完成配置转接驱动器后、是否需要将其复位? 或者、如果我写入寄存器、更改会立即生效?
其次、在开始建立实际的 PCIe 链路之前是否有足够的时间实际配置转接驱动器? 我计算过、配置转接驱动器最多可能需要 10ms、最有可能需要 5ms。根据我读过的内容、PCIe 初始化在 120ms 后开始、因此留出足够的时间来配置之前的任何内容。
此外、在我的设计中、由于我可以通过所有 3 种主要方式配置转接驱动器、因此我可以决定将 4.7k 上拉电阻器保持连接到转接驱动器的 ALL_DONE 引脚。 这是否会导致任何问题或正常?
这是我的设计:

如果转接驱动器从 EEPROM 读取、我将最后一个转接驱动器的 ALL_DONE 连接到 MCU、以在从 EEPROM 加载完成时通知它。 MCU 捕获 PCIe Express 的 PERST#信号并将其转发至 PCIe 连接器。 我认为、当系统请求对 PCIe 设备进行复位时、也要复位转接驱动器、并实际等待转接驱动器完成加载、然后再上拉 PERST#以重新启用 PCIe 设备。 我刚刚将转接驱动器的 PD 引脚连接到 MCU、以便可以编程方式将其上拉或下拉
我认为如果我使用 MCU 对转接驱动器进行配置、我也需要复位转接驱动器、但在这种情况下、我不需要等待它们。
另外、我还需要配置 MCU、以使 转接驱动器支持的 400kHz 频率运行 I2C/SMBus。