The unified diff between revisions [d8ed90db..] and [b85a3bbc..] is displayed below. It can also be downloaded as a raw diff.

This diff has been restricted to the following files: 'i2c.c'

#
# old_revision [d8ed90db2d4284a290224447c40a0d9cef3fbc31]
# new_revision [b85a3bbccc40f21e02f50101af764be93eeb9538]
#
# patch "i2c.c"
#  from [7a497687684cdd6463a65bd4f3e08b1bc8f580a7]
#    to [aa38cfd51b998ec3960be6052827278b26edcc40]
#
============================================================
--- i2c.c	7a497687684cdd6463a65bd4f3e08b1bc8f580a7
+++ i2c.c	aa38cfd51b998ec3960be6052827278b26edcc40
@@ -29,8 +29,13 @@ void init_i2c(void)
 	IWREG(I2SCLL) = (25 * 100);
 	IWREG(I2SCLH) = (12 * 100);
 #else
+# if 0
 	IWREG(I2SCLL) = 1475; /* ~5kHz */
 	IWREG(I2SCLH) = 1475;
+# else
+	IWREG(I2SCLL) = 73; /* ~100kHz */
+	IWREG(I2SCLH) = 73;
+# endif
 #endif
 }
 
@@ -45,11 +50,6 @@ int i2c_wait(void)
 	return stat;
 }
 
-void i2c_go(void)
-{
-	IREG(I2CONCLR) = SIFLAG;
-}
-
 int i2c_conreg(void)
 {
 	return IREG(I2CONSET);
@@ -64,14 +64,12 @@ bool i2c_send_start(void)
 {
 	IREG(I2CONCLR) = STOFLAG | STAFLAG;
 	IREG(I2CONSET) = STAFLAG;
-/*	i2c_go(); */
 	switch (i2c_wait()) {
 	case 0x08:
 	case 0x10:
-/*		IREG(I2CONCLR) = STAFLAG; */
 		return TRUE;
 	default:
-/*		IREG(I2CONCLR) = STAFLAG; */
+		i2c_send_stop();
 		return FALSE;
 	}
 }
@@ -84,21 +82,39 @@ bool i2c_send_data(int data)
 bool i2c_send_data(int data)
 {
 	IREG(I2DAT) = data;
-	IREG(I2CONCLR) = STAFLAG | SIFLAG;
+	IREG(I2CONCLR) = STAFLAG | STOFLAG | SIFLAG;
 	switch (i2c_wait()) {
 	case 0x18:
 	case 0x28:
+	case 0x40:
 		return TRUE;
 	default:
+		i2c_send_stop();
 		return FALSE;
 	}
 }
 
+bool i2c_receive_data(int *data, bool last)
+{
+	if (!last)
+		IREG(I2CONSET) = AAFLAG;
+	IREG(I2CONCLR) = STAFLAG | STOFLAG | SIFLAG | (last?AAFLAG:0);
+	switch (i2c_wait()) {
+	case 0x50:
+	case 0x58:
+		*data = IREG(I2DAT);
+		return TRUE;
+	default:
+		i2c_send_stop();
+		return FALSE;
+	}
+}
+
 void i2c_send_stop(void)
 {
 	IREG(I2CONCLR) = STAFLAG | AAFLAG;
 	IREG(I2CONSET) = STOFLAG;
-	i2c_go();
+	IREG(I2CONCLR) = SIFLAG;
 	/* Don't think we need to wait here. Could be wrong. */
 }