Is I2C different between MEGA and UNO?

I have been experience some I2C problems between MEGA and UNO. First I wire a I2C device#1 to MEGA, and works fine. Then I wire the device#1 to UNO and the same program, and it doesn't work.

A few days later, I did another experiment. I wire I2C device#2?which works with UNO each time) to MEGA, and it doesn't work with the same program.

Then I did a final test with I2C device#3, I work with MEGA at both 400kbps and 100kbps rate, but device#3 can only works with UNO at 100kbps rate.

Can anyone tell me the reason?

Show us the code and wiring you used for the 3 devices and provide links to the datasheets of the parts.

There is no relevant difference between the I2C on the UNO (ATmega328) and the Mega (I guess a ATmega2560). The I2C devices I have work with both of them using the same code but of course there are differences in details because the two boards are different. The capacity of the two solutions may be slightly different, so without external pull-ups you might get different results.

pylon:
Show us the code and wiring you used for the 3 devices and provide links to the datasheets of the parts.

There is no relevant difference between the I2C on the UNO (ATmega328) and the Mega (I guess a ATmega2560). The I2C devices I have work with both of them using the same code but of course there are differences in details because the two boards are different. The capacity of the two solutions may be slightly different, so without external pull-ups you might get different results.

One of the device is http://www.geekonfire.com/wiki/index.php?title=I2C_OLED_Panel(128x64)#Resources. It works on UNO and MEGA at 100kbps, but at 400kbps only works at MEGA.(I have tested it on MEGA2560,MEGA1280 and MEGA Olympic)

code in library:
//uint8_t twbrbackup = TWBR;
//TWBR = 12; // upgrade to 400KHz!
// TWBR = twbrbackup;
if I enable the above sentences, It doesn't work at UNO.

void GOFi2cOLED::display(void) {
sendCommand(0x00 | 0x0); // low col = 0
sendCommand(0x10 | 0x0); // hi col = 0
sendCommand(0x40 | 0x0); // line #0

// save I2C bitrate
//uint8_t twbrbackup = TWBR;
//TWBR = 12; // upgrade to 400KHz!

// I2C
#if defined(ARDUINO) && ARDUINO >= 100
for (uint16_t i=0; i<(12864/8); i++)
{
// send a bunch of data in one xmission
Wire.beginTransmission(SlaveAddress);
Wire.write(GOFi2cOLED_Data_Mode); // data mode
for (uint8_t x=0; x<16; x++)
{
Wire.write(buffer);
i++;
}
i--;
Wire.endTransmission();
}
#else
for (uint16_t i=0; i<(128
64/8); i++)
{
// send a bunch of data in one xmission
Wire.beginTransmission(SlaveAddress);
Wire.send(GOFi2cOLED_Data_Mode); // data mode
for (uint8_t x=0; x<16; x++)
{
Wire.send(buffer);
i++;
}
i--;
Wire.endTransmission();
}
#endif
// TWBR = twbrbackup;
}

What pull-ups do you use?

Have you checked the value of twbrbackup?

Have you set the TWPS value too? The SCL frequency is no only changed by the value of the TWBR register but by the prescaler too.

This is a double post.

http://arduino.cc/forum/index.php/topic,121409.0.html

pylon:
What pull-ups do you use?

Have you checked the value of twbrbackup?

Have you set the TWPS value too? The SCL frequency is no only changed by the value of the TWBR register but by the prescaler too.

pull-ups is 10K? Didn't set TWPS. The same setting works in MEGA but UNO.

Try 2k2 pullups, 10k is to high. If the capacity of the circuitry is just minimally different your pullups may fail to get the necessary level in time at higher frequencies.