Strange I2C traffic with OV7670

Hi!
I'm trying to talk to FIFO-less OV7670 module using Arduino Leonardo.

I assembled the circuit by analogy with CumputerNerd's projeject with UNO:

in my case, I connected:
XCLK ---------------- pin 13
SCL ---------------- SCL
SDA ---------------- SDA
GRND, PWDN - ----GND
POWER, RESET ---- 3.3V

with resistors as per the pic above, but with 5.1K instead of 4.7K.

I set up 12mhz clock on pin13 with the following code:

DDRC |= (1<<DDC7);   
  // 48 mhz pll
  PLLFRQ = (1 << PDIV2);// | (1 << PDIV1);
    
  // enable and lock PLL
  PLLCSR = (1<<PLLE);
  while((PLLCSR & (1<<PLOCK)) == 0);

  //pll postscaler 1
  PLLFRQ |= (1 << PLLTM0) ;

  // enable  pwm on ocr4a == pc7
  TCCR4A = (1 << COM4A1) | (0 << COM4A0) | (1 << PWM4A);

  TCCR4B = (1 << CS41);
  TCCR4C = 0;
  TCCR4D = 0;
  
  OCR4A = 1;
  OCR4C = 2;

Then I try to talk to the camera using Wire library:

#define camAddr_WR  0x42
#define camAddr_RD  0x43
...
Wire.begin();
....
static void write_reg(uint8_t reg, uint8_t val) {
    Wire.beginTransmission(camAddr_WR);
    Wire.write(reg);
    Wire.write(val);
    Wire.endTransmission();
    
}
....
delay(500);
// soft reset
write_reg(0x12, 0x80);

I use a logic analyzer (tapped just after Leonardo's pins) to control the data on the bus. However, I see something weird:

Setup Write to [0x40] + ACK
0x00 + NAK
0xFC + ACK
0x01 + NAK
Setup Write to [0x70] + ACK
0x00 + ACK
0x3F + ACK
0x00 + NAK
Setup Write to [0x78] + ACK
I2C,0x00 + ACK
0x03 + NAK
0xC3 + ACK
Setup Write to [0x7E] + ACK
0x00 + ACK
0x02 + ACK
0x0F + Missing ACK/NAK

which is totally irrelevant to the single write I'm performing.

When I disconnect camera's SDA/SCL, I can see the same garbage.
When I disconnect the camera from PWM output, I can see normal master's requests without reply:

Setup Write to [0x42] + NAK

What can be wrong with it and how should I debug it?

UPDATE
the mess was gone when I disconnected PWM output from logic analyzer. Still the camera doesn't respond:

Setup Write to [0x42] + NAK

You just found out that 3.3V and 5V nodes can not be mixed up on an I2C bus.

Get a 3.3V Arduino, or an I2C level shifter.

DrDiettrich:
You just found out that 3.3V and 5V nodes can not be mixed up on an I2C bus.

Get a 3.3V Arduino, or an I2C level shifter.

I got it working. There were two issues:

  1. Wrong address. Wire accepts device address without read/write bit, so in my case it had to be 0x21 instead of 0x42
  2. I had to add a short delay after each register write.