grpfrkt wrote:Do I simply put a 2.2K resistor each between the LED driver and Teensy SDA/SCL pins?
Yep.
What you’re doing is making a voltage divider with the 20k pull-up connected to 5V, the 2.2k connected to GND (occasionally) through the Teensy’s SDA or SCL pins, and the IS31IFL3731’s input connected to the point where the two resistors meet.
With those resistor values, about 90% of the voltage difference between 5V and the Teensy’s SDA/SCL pins will fall across the 20k pull-ups. The remaining 10% will show up across the 2.2ks.
I2C pins work by opening/closing a low-resistance path to GND, so we can treat them as switches that are either open (infinite resistance) or closed (zero resistance).
When the resistance through the Teensy’s pins is infinite, the IS31IFL3731’s input pins don’t see any connection to GND at all. They only see a connection to 5V through the 20k pull-up.
When the resistance through the Teensy’s pins is zero, that end of the 2.2k resistor is connected to GND. The voltage difference between the ends of the voltage divider is 5V, and 10% of that voltage.. 500mV.. appears across the 2.2k. The IS31IFL3731’s input sees 0.5V, which it can accept as ‘low enough to count as LOW’.
Things are actually a little more complicated though..
The Teensy’s pins have built-in diodes that keep them from being damaged by voltages above 3.3v or below 0V (static electricity, mostly). Those start to conduct current about 0.4V beyond the supply rails, so the IS31IFL3731’s 20k pull-ups actually see about 3.7V when the Teensy’s SDA/SCL pins are in their high-resistance state.
That’s fine on both sides. The IS31IFL3731 considers ‘high enough to count as HIGH’ to start at 3.5V, and 3.7V is in that range. You do get some current flowing through the 20k pull-ups and protection diodes, but not much. The voltage difference between 3.7V and 5V is 1.3V, and at 1.3V the current through a 20k resistor is 65uA.. easily within the range the Teensy can handle.