I have been individually checking every connection carefully with a multimeter, very carefuly avoided shorting due to soldering, and looked over my design and code thoroughly. Despite this, I cannot seem to get my IMU and Arduino Nano to speak to eachother.
I will upload my code and circuit diagram below (on the stripboard, all ICs have holes cut inbetween each pin - it's just not covered in the diagram).
It seems like there’s a misunderstanding or over generalization regarding the use of the I2C bus. While I2C is not suitable for every application, it remains widely used and reliable for many purposes, particularly for short-distance communication between multiple peripherals and microcontrollers.
Key Points About I2C:
Intended Use: I2C is designed for communication over short distances within the same circuit board or between closely placed modules. It’s ideal for connecting sensors, EEPROMs, RTCs, and other peripheral devices to microcontrollers.
Common Misapplications:
Long Distances: I2C is not well-suited for communication over long cables or between devices far apart due to signal degradation and noise susceptibility.
High-Speed Requirements: I2C's speed (typically up to 400 kHz for standard applications) may not be sufficient for high-speed data transfer needs, such as video signals or high-frequency data streams.
Challenges with I2C:
Pull-up Resistors:Proper pull-up resistors are crucial for stable communication. Incorrect values or missing resistors can lead to signal integrity issues. Be careful of the build up of parallel pull up resistors on modules.
Bus Conflicts: Because I2C is a shared bus, miscommunication or conflicts can arise if not properly managed, especially with multiple devices.
Noise Sensitivity: I2C lines are susceptible to electromagnetic interference (EMI), which can cause errors in noisy environments.
When I2C is a Good Choice:
Small Systems with Close Components: I2C excels in small projects where sensors and microcontrollers are close together.
Low-Speed Sensor Integration: It’s great for interfacing sensors, displays, and other low-speed peripherals that don’t require long communication lines.
Conclusion:
There’s no need to abandon I2C altogether; it’s a valuable tool when used in the right context. The key is to understand its limitations and use it appropriately. For applications where I2C might not be the best fit, consider alternatives like SPI (for faster communication) or UART, CAN, RS485, RS232, etc (for longer-distance serial connections). The I2C bus interface does not source any current, it requires external pull up resistors of the appropriate value.
I agree, most level converters would have components to pull-up the i2c lines. Not a very strong pull-up, but should be fine for a single i2c slave and short wires like you have.
So I don't know what the problem is but I suspect adding more external pull-up resistors may not fix anything.
In your schematic, the GND pin on the HV side of the level converter is not connected. I suspect this may not matter because it is probably internally connected to the GND pin on the LV side. But may be worth trying connecting both GND pins. I think they should really both be connected anyway.
I know it will not work without them. Measure the pins and see if they are at the appropriate VCC, if not the pull up resistors are probably not there. Without a schematic of your level converter I an only guess. I have several types, some discrete and some with a IC, neither has a pull up resistors installed.
Yes. As I said before, the most common type of level converter, the bi-directional type designed for i2c, has pull-up resistors on all the signal pins.
That is what I now have but the originals had no resistors. I purchased them from an online biding/sales outfit about 8 years ago, no record of whom I purchased from. Thanks for catching that. I now just use the ones with the IC, they work very well.