I am trying to make a differential I2C bus signal that is compatible with SparkFun's QWIIC.

  • OK: convert the standard I2C's SDA and SCL to TX/RX lines using P82B96D
  • NOT WORKING: convert TX/RX to differential signals using PCA82C251

Below is the schematic for transforming between the TX/RX signal and the differential signal.

enter image description here

And this is the waveform at SDA1_TX line when the microcontroller is trying to search the bus for a specific address:

enter image description here

As the waveform shows, the SDA1_TX is correctly outputting a 5 V pulse. The other SCL1_TX was also outputting a clock signal in the same way to another PCA82C251, but the differential lines are not outputting any signal. They are just kept at a steady 2.5 V without changing.

What could be causing this problem?

Full schematic of the I2C to dI2C conversion part:

enter image description here

  • 1
    \$\begingroup\$ Do you have pullups on the SDA and SCL lines? Also, please follow schematic conventions. I know you put +Vcc at the bottom and GND at the top because it lets you maintain the numbering on the IC but that is very confusing. It is far more readable to rearrange the pins on the IC symbol and keep +Vcc at the top and GND at the bottom. \$\endgroup\$
    – DKNguyen
    Mar 17, 2023 at 19:43
  • \$\begingroup\$ It's not a problem on SDA/SCL. It's problem on differential SDA/SCLs. The MCU-side SDA/SCL, SDA_TX/SDA_RX and SCL_TX/SCL_RX are all working fine. \$\endgroup\$ Mar 17, 2023 at 19:48
  • 1
    \$\begingroup\$ What does working fine mean? Normally you would not even have separate TX and RX for I2C so it's impossible to guess how that is even supposed to work, before thinking why it does not work. \$\endgroup\$
    – Justme
    Mar 17, 2023 at 19:57
  • \$\begingroup\$ The bi-directional I2C is dispatched into two-wire TX/RX signals using P82B96. As we can see in the Oscilloscope screenshot, the SDA_TX line is correctly outputting the signal converted from SDA line. SCL to SCL_TX conversion also worked. \$\endgroup\$ Mar 17, 2023 at 20:00
  • 1
    \$\begingroup\$ So you want to use a CAN transceiver and have it compatible with 8296? I don't think that's going to happen, at least not without seeing all connections rathen than just the CAN chip. \$\endgroup\$
    – Justme
    Mar 17, 2023 at 20:08

1 Answer 1


The problem caused by my mistake of setting oscilloscope's trigger level. The transceiver circuit was working fine.

While debugging, I checked the SDA_RX and SCL_RX pins, too. To my surprise, the RX lines were repeating the same signal sent to TX lines. This means, the CAN bus transceiver is working correctly. These pictures are from SCL_TX (yellow) / SCL_RX (blue) and SDA_TX (yellow) / SDA_RX (blue).

SCL_TX (yellow) and SCL_RX (blue) SDA_TX (yellow) and SDA_RX (blue)

Then I realised that the CAN bus signal level is oscillating around 2~3V and the oscilloscope cannot detect the CAN signal with the default trigger level 0V. (the oscilloscope's ground is contacted to the board's ground pad). After adjusting the trigger level as 2.5V, I could see the differential signals!

SCL +/- SDA +/-
SCL_P (blue) and SCL_N (yellow) SDA_P (blue) and SDA_N (yellow)

With missing just a very basic Oscilloscope setting, I had to waste 2+ hours! (I tired to replace the PCA82B251 with other CAN bus transceiver chips, SN65HVD232 I had. I tried to adjust the sloping limit resistor, etc. Like in the following picture.)

Trying to adjust sloping limit resistor values

The above result was not correct, though. To be correct differential signal, it should be like this at logic 1.

  • "-" line should raise over "+"
  • "+" line should fall below "-"

So the two signal should cross each other. To fix it, I should modify the transceiver circuit a little more. I'd like to write a blog article about this project and add link here later.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.