I'm trying to talk to a I2C device using the Arduino MEGA and the wire library. I'm using the SDA and SCL ports. According to the schematics they already have 10k pull-up resistors, so I just hooked it up directly.
I'm fairly certain I got the address right and the chip is powered on. However, if I'm requesting, what's supposed to be a constant value, I get various read backs all over the place. I'm wondering if there's something wrong with the timing.
I was wondering if anybody had any luck hooking up a MEGA to an I2C. Also I have seen different implementations for endTransmission().
I am not sure why, since I have not actually checked the code used by Arduino, but once I was able to make it work just by commenting out the if (Wire.available()) clauses. You could try this, or if you have a logic analyzer or an oscilloscope you could have a look at the actual data transfer.
I can also confirm that I2C works perfectly..
As Johan Adler already said - try to check only once and receive both bytes a t a time. I have in mind that there are certain setbacks in the wire library that might read the returned bytes wrong if you call available() in between running transmissions...
if (Wire.available())
{
data1 = Wire.receive();
data2 = Wire.receive();
}
The other question is qhat 0x04 actually commands the device to do, maybe it is some sort of reset signal and is meant only to be sent once? Maybe it would help to put it into setup?
I tried leaving out the Wire.available() to no avail. Also, if I actually read out the Wire.available() I get 2 bytes being available and 0 after I read them out, so it seems to be doing something.
The 0x04 is setting the address register to return an internal fixed value (I'm using a ADT7410 temperature sensor).
According to the schematics they already have 10k pull-up resistors, so I just hooked it up directly.
Schematics of what? The data sheet suggests a pull up but you have to put it in. Have you wired A0 & A1 to ground? Have you got supply decoupling on the chip?
The mega uses different pins for I2C than the other arduinos, these are pin 20 for data and 21 for clock.
I looked at the Arduino MEGA schematics at http://arduino.cc/en/uploads/Main/arduino-mega-schematic.pdf. On the top right corner it shows that two 10k resistors are connected to SCL and SDA, respectively, hence I assume I don't need to put in another two pull-up resistors. I did wire A0 & A1 to ground and am using address 0x48. I also am using pins 20 and 21.
I didn't try the decoupling and that seems to improve things quite a bit. The values that I'm reading back are much more reasonable. However, it seems that the send still doesn't work quite well. No matter what address register byte I send, I'm always seem to be getting back the current temperature reading.
At least it's a step in the right direction - Thanks!