I2C connection between 3.3v master and 5v slave

Good evening all!

I've got somewhat an odd question here...

User SomeRandomGuy suggested in an earlier post:

Run 5V to the DS1307's supply pins, but be sure that the pull-up resistors for the i2c are tied to 3.3V on the Due.

LadyAda on learn.adafruit.com instructs to leave out pull-up resistors on the board and use Pi's own pull-ups..

On an Italian robotics site Author explains that Sparkfuns RTC module work with its own pull-ups to 5v... There is a jumper on the module that enables pull-ups. Author also published his sketch which dos not show internal pull-ups activated...

That makes me wondering if Wire library does it (enable internal pull-ups)?

Anyway, the more I read about it the more confusing things become((

So fare found 3 suggestions:

  • Connect pull-ups to 3.3v
  • Disable pull-ups on the board and use internal pull-ups
  • Leave pull-ups to 5v

Any thoughts shedding light on the matter will be greatly appreciated!

P.S. my board is an Arduino Due, but same applies to any 3.3v uC.

That makes me wondering if Wire library does it (enable internal pull-ups)?

Yes it does.

my board is an Arduino Due, but same applies to any 3.3v uC.

No the Raspberry Pi you cited has external pull up resistors on the board.

The proper way is to use a level shift circuit between the two devices with pull ups on either side to their own power supply. Attached is one way to do level shifting with transistors.

You can get away with pulling up to 3V3 only, but this means either hacking the standard wire library or using one that has control over the internal pull ups like this one:-

This will work but has lower noise performance than using a level shifter.

translator-1.pdf (21.4 KB)

Thank very much, Grumpy_Mike!