Voltage levels on muxed PS I2C
PS I2C0 voltage level is 1.8V. It is connected to the PCA9548 mux (IC20), which is the I2C master of different devices, supplied by 3 different voltages :
1.8V devices:
- PS_I2C0_MUX6: EEPROMs IC19 & IC65
2.5V devices:
- PS_I2C0_MUX0: DDR4 EEPROM
3.3V devices:
- PS_I2C0_MUX1: Temperature sensors
- PS_I2C0_MUX2: Current sensors
- PS_I2C0_MUX3: Fans PWM / tachometer
- PS_I2C0_MUX4: IRPS5401 (IC18 and IC36)
- PS_I2C0_MUX5: External I2C
- PS_I2C0_MUX7: Management SFP EEPROMs
Because the mux is transparent, it just connects together PS I2C0 and the slave device selected.
So, when the PS talks to 3.3V devices, the PS I2C0 lines are pulled-up to 3.3V, and this voltage is then clamped by PS internal diodes.
This is a problem for 2 reasons:
- PS internal clamping diodes are not supposed to be permanently clamping voltage, they are designed to be protection devices in case of voltage surge, so they could be damaged over time, which could in turn damage the PS circuitry itself
- Logical high level of 3.3V I2C devices is usually around 60% of supply voltage level. Because this voltage is clamped by PS internal diodes, it falls to levels very close to the high level threshold of some components
Most of the 3.3V devices are working fine (by luck ?), but the IRPS5401 is not able to communicate, and it also crashes the I2C bus when trying to access it.
Possible fixes:
- Shift level of PS I2C0 to 3.3V either by changing the bank voltage to 3.3V or by using a level shifter. Then, the PCA9548 will be able to do the voltage level translation if its supply is lowered from 3.3V to at most 2.8V (outputs are clamping to Vsupply - 1V if there is no pull-up on outputs, see PCA9548_AN262.pdf sections "Voltage Clamping" & "Voltage Translation")
- Use a non-transparent mux which does not directly connect PS I2C0 to the slave device busses, but interfaces the 2 busses so we can pull them up to different voltages
- Use a level shifter after the mux on each 3.3V I2C line