I'm wanting to use this power module:
and control it from an Atmega328P or maybe an Arduino Nano or other small Arduino. But I'm finding it very difficult to understand the PMBus thing. On the datasheet it mentions PMBus High voltage mode (Max 3.6V) and Low Voltage mode (Max 0.8V). Not quite sure what that is or how to select which one to use. I understand I have to use the digital pin 4 and 5 (SDA and SCL) to communicate via I²C, but isn't the voltage out of those pins at 5V? Would that not cause problems as the max input is listed as previously mentioned 3.6V? Also, the datasheet only mentions that the communication back to the controller is only Low Voltage at 0.4V which seems too low for the Arduino to register? Is there some extra device I have to use between the Arduino and the Power Board to deal with I²C or can the Arduino handle it as is? Very confused, every reference I try to look up online says "For more information check ......" and I eventually end up coming back round in a circle to the original document without the question being answered. Very frustrating. Please help, I beg of you
Done a bit more reading. Please correct me if I'm wrong here. I²C works by the pin either being floating or pulled to ground to indicate a 1 or a 0 (or clock pulse?) so no actual voltage is supplied by the pins themselves. The pins instead are externally pulled up to a voltage source by resistors. If this is the case, I should be able to simply connect a resistor of suitable value from both SDA and SCL to the 3.3V line of the Arduino Nano (if it's being powered by usb) and all should be fine? The only thing that's confusing me is the "PMBus Voltage Out" in the datasheet, if I²C doesn't actually output voltages via the pins what on earth does that mean?
Hmmm, it's occurring to me that although the power module would "see" the data from the Arduino as the power module is calibrated to operate around 3.3V, the Arduino itself is expecting to see 5V, so it may be that I can send commands to the power module OK but be unable to receive any data back as the level would be too low for the Arduino to read it. It's going to be a bit tricky to make a logic level changer circuit that is bi-directional and open-drain. I'll keep at it.
Well I just touched a 22k resistor between a data pin configured as input and to 3V3. The pin read as steady high, touching the resistor between the data pin and GND obviously it went steady low. So it may work, the Arduino tolerance on input seems to allow it.
To confirm this I set up a small circuit with 2 leds and a two way switch to switch the digital pin between 3V3 and GND. In the sketch I have a fast loop continually reading the pin, if it's high led#1 is turned on, if it's low led#1 is turned off. led#2 is made to blink for instant if the logic level changes from the last time it was read. When the switch is toggled, led#1 turns on and off as expected and led#2 only blinks when I toggle the switch, it doesn't blink at all at any other time, suggesting the level is indeed high enough for a reliable read. Does this sound correct?
Even though I'm sure the 3V3 line will work OK on the arduino's input side, if I did want to make a signal converter to interface 3V and 5V i²C devices. Would this circuit work? I'd need 2 of the circuits for each line of course.