I've got an ov7670 sensor I'm trying to communicate with via arduino i2c, most of the time it isn't visible on an i2c scanner. It uses 3v3 i2c, so I am using a level shifter to connect it to arduino. I've been advised use pull up resistors to 3v3 (will this help with it sometimes not responding to i2c?), should I pull up the i2c lines on both sides of the level shifter, or just on the 3v3 side?
Also, do I disable the internal pullups (in wire) or leave them?
Thank you for reading
The AdaFruit level shifter contains 10k pullups already. It will work at 100k (standard Wire library speed) if you increase the speed to 400k you will need to add more pullup. (4.7k or 3.3k) When the bus is driven faster, the pullup value needs to be decreased to increase the pullup current. Without this increased current the signal may not rise fast enough for the devices to register 'HIGH' levels.
Depending on what your level shifter is. if it using bare BSS138 mosfets, then yes. You will need a 4.7k to VCC on the High side and a 4.7k to Vdd on the Low side for each signal.
Here is a link to a NXP semiconductor App Note
the I2C bus needs pullups to function, the Level shifter isolates the high levels from each bus segment. Only Low signals are passed. This means each side needs a pullup to function.
The internal pullups on the CPU are between 40k and 70k, just these alone will NOT support the I2C bus. Just ignore them, they will not bother this usage. Make sure there is at least 4.7k on the I2C bus.