I think if you haven't got bypass caps present, then this is very likely to be the problem (especially given the RF isolation)
The datasheet recommends 1uF ceramic caps be placed on both sets of supply pins. Put them as close as possible to the pins.
Also, make sure you have the pullup resistors present on both sides.
If you have an oscilloscope, you should be able to test the lines easily (e.g. send repeated signal and see if what's going in one side is coming out okay the other)
As I understand it, the zener diodes are meant to clamp the lines to a maximum voltage (5.6V in this case) to protect the devices on the bus, and is especially useful for long i2c transmission lines. Is my understanding correct?
This is probably correct, but without knowing where you got the circuit from, it's difficult to know exactly what they had in mind. Since the zener voltage is 5.6 V and the I2C pull-up voltage is 3.3 V, the zeners will have no effect on the circuit in normal operation.
Even on a 5 V I2C bus, the zeners would have no effect in normal operation.
Do I need clamping diodes if all of my i2c slave devices are on the same board, relatively close together?
Very likely, if everything is on the same board, you can simply omit the zeners.
What do the series resistors do, and do I need them?
In the original circuit, the series resistors were probably used to limit the current flow through the zeners in an over-voltage condition.
If you decide you don't need the zeners, you probably don't need these resistors, either.
The battery gauge IC allows up to 6V on its SDA/SCL pins, so is it ok to pull the bus up to 3.3V, even though the gauge is running at 2.5V?
Would it be better to level shift them to 2.5V?
I agree with your reading of the datasheet on this. Input high voltage levels from 1.2 to 6 V are allowed for these signals on this chip. Therefore there's no need to do any level shifting at all --- simply use 3.3 V pull-up for your I2C bus.
Best Answer
The series Rs resistors aren't for 'protection' pe se, the I2C spec notwithstanding (more about this below.) In any event, for Standard (100 KHz) and Fast (400 KHz) mode they're optional.
For the higher-speed I2C modes (1 and 3 Mbit) they are used as series damping to reduce ringing and thus improve signal integrity.
For that case, choose an Rs value such that the driver impedance (Rds(on)) and Rs together are roughly the same as the board trace impedance.
Typical Rs values are 22 to 33 Ohms, which when combined with the driver Rds(on) resistance, yields about 60-70 Ohms, a reasonably good match for typical trace routing.
MORE: The I2C spec states the reason for Rs is to suppress noise spikes, and that Rs is optional.
In reality, the limiting value for Rs depends on several factors:
The bigger your I2C bus (# devices, signal length), the stronger your pullup needs to be to overcome capacitance. Same with faster bus speed: to meet risetime, a stronger pullup is called for.
On the other hand, the driver Rds(on) resistance and Rs form a voltage divider with the pullup resistor Rpu. If Rs is made too large, the output low on the bus might not be low enough to meet the Vin(low) spec for the other devices on the bus. Design accordingly.
Finally, if ESD hardiness is a factor in your system (for example, if your I2C is going to a connector), don't rely on Rs to do this job. Instead, consider an I2C isolation device, and use TVS diodes on the lines for a more robust solution.
(Experience: set-top boxes with HDMI as well as on-board I2C.)