i2c to Si570 data message question.

I modified the wti.c library to disconnect the internal pull ups.
I have 4.7k pull ups external to 3.3V outside of the arduino.

I am sending one byte to the Si570, looking at the SDA line with a scope. See attachment.
The chip address is 55 Dec.
I have also tried 110 Dec, 55 left justified.
The start (SCL Hi, SDA goes low) and stop (SCL Hi, SDA goes High) bits are correct.
The data address looks OK. 0110111=55 DEC.
Bit 8 is a zero, so Write.
Bit 9 is a 1= NACK.
Why am I getting a NACK?
Should not the slave drive the SDA line low on the 9th bit is the data was received properly?
Why is it not ACK?

Buy the way; reg_7=226 Dec

void wire()
{
Wire.beginTransmission(55); // transmit to device #55 (0x2c)
Wire.write(byte(0x07)); // write to register 7 on the Si570
Wire.write(byte (reg_7)); // sends data values
Wire.endTransmission(55); // stop transmitting
}

TWI Data&Clock Byte 1.jpg

I had the same problem talking to the Si570 from a Raspberry Pi Model 3B via I2C-1.

Turned out to be a hold time violation - SDA was going high to low too soon compared to SCl high to low.

I added a 68pf capacitor to ground on the SDA line. Now hold time is 180 ns; all works perfectly.

Wire.endTransmission(55); // stop transmitting

Why is the argument is the deviceAddress(55)? It should be either true or false or empty (true/stop). Please, look here.

Yes! After sending the 7-bit deviceAddress (55 = 0x37 = 0110111), the Master sends the write bit (R-W/=0); the Master then momentarily releases the SDA line at H-state so that the slave can pull-down it to Low-state to create ACK signal. This is shown in the following diagram prepared for EEPROM device. |500x232

The following diagram that you have captured does not show ACK = LL. (It should!)

You may execute the following codes to monitor the status code of transmission. A value of 0x00 will indicate that the transmission has been successful and the ACK pulses were created as required. A non-zero value will justify your capture information where ACK = LH.

byte status;

{
    Wire.beginTransmission(55);        // queue device addess
    Wire.write(0x07));                      // queue address of register 7 on the Si570
    Wire.write(0xE2);                        // queue data for register 7 (values 226)
    status = Wire.endTransmission();          // transfer all data from queue and assert STOP condition
}

Serial.println(status, HEX);

If you are noy getting 0x00 for the status code, you must isolate the fault by removing your Si570 device first, and then checking the TWI using a working TWI device like DS1307/DS3231/24C512/I2C LCD/etc.

BTW: connecting any other components on the TWI bus other than the pull-up resistors are not technically recommended; however, things do not always go by the rules; one has the freedom to try all possible ways to solve a problem, and the practice is perfectly alright as long as it appears to be reliable and repetitive!.