Using higher I2C voltage then MCU supply (but still in limits)

I am working on a project where there is 1x MCU and 2x I2C devices

1. device needs 2.8 V using I2C1
2. device needs 3.3 V using I2C2 (I have a need of seperating bus apart)

If I understand correctly, a I2C port is only like a switch? So could I supply my MCU (possible 1.8 - 5.5 V) with 2.8 V and connecting device 1 to I2C1 (2.8 V bus) and device 2 to I2C2 (3.3 bus - which is higher then MCU supply 2.8 but still under 5.5 V)? I would like to exclude the use of level shifter.

Will appreciate any help or thought about this, thank you :)

• An answer to this question depends upon the actual devices involved and their datasheets. – StainlessSteelRat Jun 20 '19 at 14:44
• How are you planning to connect the pullup resistors? – Elliot Alderson Jun 20 '19 at 14:47
• For a slight difference running I2C with the pullups to the lower voltage will work and meet most VIH specs as long as you never misconfigure as a push-pull GPIO, though even that is likely to be within the allowed overvoltage. Also check to see if your 3v3 part cannot run at 2v8, many modern ones (most ARM MCU's etc) can just fine, though older parts (ATmega for example) may hit a clock vs voltage limit. More can't really be said without the identify of the specific parts, information critically missing from your question. – Chris Stratton Jun 20 '19 at 14:51
• There is no problem running 2,8 V on MCU since it is 1,8 - 5,5 and frequency that I need is only16 MHz (which is half of 32 available). I know I can run MCU at 3,3V and have 2,8V bus. But I was wondering if it is possible other way around as well? – Ram - small roar Jun 20 '19 at 17:31
• If I understand correctly, a I2C port is only like a switch? Not really.... It's more like a channel of devices from master to slave. Each I2C slave has an address that you find in the datasheets and you first choose the slave you want and then you read from that slave. I think a lot of your questions can be answered in the datasheet. – KingDuken Jun 20 '19 at 21:34

2 Answers

Your proposal may work as long as you connect the I2C pull-up resistors to 2.8V (the lower voltage) for both I2C1 and I2C2. This way, both I2C busses would be working at 2.8V.

You have to check how much margin you have for I2C2's VOH when the pull-up resistors drive the lines to 2.8V while the I2C peripheral expects 3.3V.

My recommendation is to simply use level shifters with N-FETs. They are extremely simple and work really well.

The following references show how to implement them:

I2C level shifting NXP application note

SparkFun I2C level shifter schematics

If I understand your question correctly, you have the two slaves on separate I2C buses. The pullups on one bus are to 3.3V, the pullups on the other are to 2.8V, and the MCU is powered at 2.8V.

You could check the Absolute Maximum ratings in the MCU's datasheet to see if it is OK to have SDA and SCL at VCC + 0.5V.

However, in general your normal use case shouldn't be in the Abs Max range... It would be much better if you used 2.8V I2C for the 3.3V device. Check the datasheet of the 3.3V device to see if you can do this without violating the VIH spec.