I got DS1631 behaving both with Wire and software i2c. Here's the Wire code:
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(19200);
}
void loop() {
ds1631();
}
void ds1631() {
uint8_t ret, dhi, dlo;
Wire.beginTransmission(0x48);
Wire.send(0x51);
Wire.endTransmission();
delay(750);
Wire.beginTransmission(0x48);
Wire.send(0xAA); // read temperature command...
Wire.endTransmission();
Wire.requestFrom(0x48, 2);
dhi = Wire.receive();
dlo = Wire.receive();
Wire.endTransmission();
int ihi = (int) (dhi);
int ilo = (int) (dlo);
int frac = ihi * 256 + ilo;
if (dhi > 0x80) frac = frac - 65536;
int temp = frac/256;
frac = frac - temp*256;
Serial.print(" Temp (C) = ");
Serial.print(temp);
Serial.print(".");
if(frac < 100) Serial.print("0");
if(frac < 10) Serial.print("0");
Serial.println(frac);
}
Wire has no means to do a repeated start, as the 1631 wants, it won'd send anything unless you do a stop, but it works OK even with the stop.
D.