I think the easiest circuit that does what you want would use a N channel MOSFET like the bss138 and two pull-ups, hooked in the following way:
Tell me if it doesnt fit your needs, and why.
Having said this, I have to recommend you to take a look at the MAX3000 series of level converters. I have used them before and they are great bidireccional converters that "simply work" (in apple terms).
Hope it helps.
edit: It seems like the image appears broken with some browsers, you can see it here
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
Upon looking at the data sheet for the max31850, it looks like you want to connect an open-drain 3.3V output (or input) to a 5V input (or output when low).
I don't think this is a good idea to use a zener- the knee is too soft, and the output driver of the max31850 is too wimpy (4mA) to make this work reliably. Also the minimum voltage to be recognized as a 1 is 0.6 Vdd, which is 3.0V, a bit too close to 3.3V for comfort when working in the reverse direction- the zener will be conducting significantly at that voltage. Further, the datasheet typical capacitance for the zener is 450pF at 0V (more when forward biased) so you may not get the speed.
The Zener would draw excessive current from the micro if the port pin was driven high accidentally (and would likely exceed the maximum voltage spec), and the 4.7K plus the zener soft knee would likely lead to 'high' voltages that were not enough to guarantee operation. Generally all bad news.
Powering the ATMega from 3.3V would make these problems go away.