I have a problem that's driving me nuts. I'm designing a robotics platform based on arduino for a very basic robotics course. The idea is to have an arduino with extras, like an H-bridge, some infrared sensors, an accelerometer, a color sensor, some battery charger and things like that, in a robot chassis shaped PCB. So you have a chassis PCB, you assemble the motors and there you go.
Also, I wanted to design it stealing as few pins as possible to the arduino. So everything uses an I2C bus to communicate. There's a secondary PIC16F677 microcontroller to handle the infrared sensors and some other stuff, and it interfaces to the ATMEGA via I2C. The color sensor and the accelerometer are also I2C and require 3.3V signals.
So I'm using an I2C voltage level translator/isolator to translate the 5V from the ATMEGA328 into 3.3V, and those 3.3V I2C lines are distributed to the sensors and the PIC.
So here comes the problem. The PCA9306 is pass-transistor based and requires pretty low value pull-ups to drive enough current through the pass transistor and allow proper operation (with the load imposed by my three devices, the thing should work at 100kHz with 10K pullups, but the use of the PCA forces me to use 1K pullups). It looks like the ATMEGA328 I2C open collector drivers have pretty weak transistors too. So the VOL in the arduino side is somewhat around 180mV (checked with o-scope). For some reason, the VOL in the 3.3V side gets multiplied and it's about 300mV. The accelerometer recognizes that as a 0 and works perfectly, the color sensor does it most of the times (but operates with some glitches) but the PIC doesn't recognize that as a 0 and therefore doesn't work. Well, to be fair it answered two or three times to its slave address in one of the tests, but then no more. I'm using the hardware SSP of the PIC.
I know that the PIC doesn't recognize the zeroes because I made a small testing program which made the I2C bus spit lots of zeroes, and I programmed the PIC to light a LED every time it detected a zero, and the LED just gave random pulses of light, and its activation signal didn't look as the I2C stream at all.
So next step, go for another bus translator. This time a TXS0102 from TI which I had on hand. Also pass-transistor based, but it requires far less current. The problem gets better but the PIC still doesn't recognize the zeroes with a VOL of 200mV.
So the whole project is based on I2C and it's the only part that doesn't work. Any advice? I'm thinking about trying an I2C translator WITH repeater like the PCA9517...
Any advice?


