This module is designed to enable long range I2C communications which extends the cable length from several meters to 300 meters. It is ideal for applications that need to run over long wires such as the CAT5e Ethernet cable that is commonly used to make connections between rooms. The signals are transmitted via balanced transmission lines (twisted pairs) which greatly reduces noise and extends the range. NXP PCA9600 I2C bus extender IC is used as the main component on this module. The PCA9600 is designed to isolate I²C-bus capacitance, allowing long buses to be driven in point-to-point or multipoint applications. It can operate at speeds up to at least 1 MHz.
- Bidirectional data transfer of I2C-bus signals
- 100 kHz operation on up to 300 meters of wire
- 1 MHz operation on up to 20 meters of wire
- On-board boost converter
- upto 36V power input
- Device end:
- SCL: I2C SCL
- SDA: I2C SDA
- 5V0: Power OUTPUT of the on-board buck converter. Could be used as 5V INPUT when on-board buck converter is disabled by the jumper.
- GND: GND
- VPU: (optional) SCL/SDA pull-up voltage input (connected to 5V0 by default. It can be disconnected from 5V0 bus when pull-up voltage other than 5V is needed.)
- VBUS: (optional) Power supply INPUT of the on-board DC-DC converter.
- Wire end:
- SCL_L: Negative pin for the SCL differential transmission wire
- SCL_H: Positive pin for the SCL differential transmission wire
- SDA_L: Negative pin for the SDA differential transmission wire
- SDA_H: Positive pin for the SDA differential transmission wire
- GND: (optional) GND. As the communication is differential, there is no need to share a command ground across the wire, especially when the two systems across the wire are at different ground levels.
- VBUS: (optional) Power supply INPUT of the on-board DC-DC converter
Possible Wiring Scheme
- Point-to-point operation
- Multidrop operation
- Arduino Wiring Scheme
- Raspberry Pi Wiring Scheme
To use with Raspberry Pi, user should desolder the solder jumper named “PULL-UP EN” on the back of the module.
SCL and SDA of the I2C interface is bidirectional by its definition. The PCA9600 on the module is used in such a way that it splits SCL into two unidirectional signal, named SCL_TX, and SCL_RX. The same applies to SDA signal. The purpose to split these two signals is that the PCA82C251T differential transceiver requires unidirectional signals.
As shown in the picture above, the J1 could be used to power the VPU to 5V or to disconnect it from 5V. By factory default, VPU is connected to 5V0.
If SCL is driven by local I2C device to logic “0”, the SCL_TX will be logic “0”. Then the SCL_TX will be transmitted as a “dominant” symbol on the SCL_H and SCL_L by PCA82C251T transceiver. At the same time, The RXD pin of PCA82C251T driving the SCL_RX signal to logic “0”, because there is a “dominant” symbol on the SCL_H and SCL_L. PCA9600 keeps sensing the logic state of the SCL_RX, and keeps the SCL to logic “0”. In I2C definition a logic “0” is the dominant bit, so this configuration is consistent with the I2C specification.
If SCL is driven by local I2C device to logic “1”, the SCL_TX will be logic “1”. Then the SCL_TX will be transmitted as a “recessive” symbol on the SCL_H and SCL_L by PCA82C251T transceiver.
- If there is someone driving the SCL_L to SCL_H to “dominant” state. PCA82C251T will output a logic “0” on its RXD pin, which drives the SCL_RX to logic “0”; Then PCA9600 will drive the SCL to logic “0” to acknowledge there is a conflict or start of frame on the bus.
- If there is someone is driving the SCL_L to SCL_H to “recessive” state or there is no other one driving the bus. PCA82C251T will output a logic “1” on its RXD pin, which drives the SCL_RX to logic “1”; Then PCA9600 will drive the SCL to logic “1”, which is the intended logic state of the local I2C device.
The same principles applied to SDA.
As shown in the picture above, there are two jumpers , one for each transceiver. The terminal resistor is required at each termination node on the bus. By factory default, both J3 and J4 are shorted, which means that the terminal resistors are connected to the bus by default.
Another important feature of this module is that there is a on-board buck converter. It is a more efficient way to convert a higher DC voltage coming from VBUS to 5V which could be used to supply the module, compared to LDOs. The buck converter requires a input voltage greater than 7.5V to generate a 5V output. If you want to power the module directly by 5V, you need to connect the jumper named J2. By default the J2 is open, which means the converter is enabled.
Here are some tests result.
The picture below shows the waveform of SCL and SDA when the sensor is directly wired to Arduino via a 15cm length cable. CH1(yellow) is SCL and CH2(blue) is SDA.
Here comes the SCL waveform when connecting the sensor to Arduino via 300m length twisted pair cable.
It could been seen from the picture above that the stray capacitance of the cable has seriously deformed the SCL waveform at both local(CH1) and remote(CH2) end.
Here comes the SCL waveform shows the performance of our differential I2C extender with Arduino, HDC1050, and 300m twisted pair cable.
and if give it a closer look, we can actually see the propagation delay of the SCL signal.
It could be read from the cursors in the picture the propagation delay of the SCL is about 1.76us. The propagation delay of the twisted pair cable is 4.8-5.3ns/m. Given the length of the cable which is 300m, the propagation delay should be 1.4- 1.6us. There are also some delay beween the differential transceivers and some measure erros. So The 1.76us reading is quite reasonable.
Here is the screenshot from the scope of the SCL_H and SCL_L signal.
- Blue – SCL_H
- Yellow – SCL_L
- Purple – SCL_H – SCL_L
The schematics of the buck converter is shown in the picture below.
Here are the locations of the jumpers on the back side of the PCB.
Full schematics is available, please contact us by email.