Problems with I2C communication to Wii Classic Controller

Hello everyone. A while ago, my Wii Classic Controller to USB adaptor failed, and I decided rather than replace it (again), I would take the connector and make my own adaptor with the Arduino. So far so good, except I can’t actually talk to the Classic Controller on I2C and I’m having a hard time isolating what might be wrong.

Here are some photos of my setup:

Port and wire numbers obviously correspond. I’ve cross-checked my wiring with a multimeter to be sure I didn’t mix up any connections. Based on the various references I’ve found online, pin 1 = 3.3V in, 2 = connect sense, 3 = SDA, 4 = SCL. The \ pin is not connected, and GND… is ground.

Here is my initial test code. I’m not using the Arduino library I found mainly because I wanted to use the I2C calls directly, and I wanted more control on how the output data is organized. I don’t see any obvious differences for the initial connection with the example, or with examples of other I2C peripherals.

#include "Wire.h"
#include <stdbool.h>

/** \brief Standard Arduino setup() procedure.
 */
void setup()
{                
    Serial.begin(115200);
    pinMode(13, OUTPUT);
    pinMode(3, INPUT_PULLUP);
    pinMode(2, INPUT);
    
    
    Wire.begin();
}

bool connected = false;

/** \brief Standard Arduino loop() procedure.
 */
void loop()
{
    uint8_t i = 0;
    uint8_t bytes[6];
    
    if (connected)
    {
        if (!digitalRead(2))
        {
            Serial.println("Classic Controller disconnected.");
            connected = false;
        }
        else
        {
            Wire.requestFrom (0x52, 6);
            while (Wire.available ())
            {
                bytes[i] = Wire.read();
                ++i;
            }
            
            for (i = 0; i < 6; ++i)
            {
                Serial.print((int)bytes[i], HEX);
                Serial.print(" ");
            }
            
            Wire.beginTransmission (0x52);      // transmit to device 0x52
            Wire.write (0x00);           // sends one byte
            Wire.endTransmission ();    // stop transmitting
            
            Serial.println();
        }
    }
    else
    {
        delay(100);
        if (digitalRead(2))
        {
            Serial.println("Classic Controller connected. Performing setup.");
            Wire.beginTransmission (0x52);      // transmit to device 0x52
            Wire.write (0x40);           // sends memory address
            Wire.write (0x00);           // sends memory address
            Wire.endTransmission ();    // stop transmitting
            Serial.println("Setup Complete.");
            
            connected = true;
        }
    }
}

The sense connect pin is connected to pin 2 on the Arduino per the above code, and that is working fine. This also means that 3.3V must be at least wired correctly too, or the Classic Controller wouldn’t be able to pull it up when connected. Unfortunately, here is the output I see on my oscilloscope when I actually try to talk:

A whole lot of nothing.

My serial output obvious returns nothing at all too:

Classic Controller connected. Performing setup.
Setup Complete.
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0

So any suggestions to where I can go from here?

Have you run an i2c scanner program and confirmed that you can indeed see the device at 0x52?

The I2C scanner does not find any devices.

... which doesn't surprise me, but unfortunately doesn't suggest an obvious way forward either. Let me try another Arduino Due to see if my board is somehow faulty.

EDIT: Nope, the second Arduino behaves the same.

(deleted)

Not manually, no. However, the lines appear to be pulled up regardless by looking at my scope trace.