The unified diff between revisions [d8ed90db..] and [dea51752..] 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 [dea51752ff3061ddca80de6685b04dac53ac77e1] # # patch "i2c.c" # from [7a497687684cdd6463a65bd4f3e08b1bc8f580a7] # to [b6b9ee4258edaf778f2fc0602e206e9e47d38496] # ============================================================ --- i2c.c 7a497687684cdd6463a65bd4f3e08b1bc8f580a7 +++ i2c.c b6b9ee4258edaf778f2fc0602e206e9e47d38496 @@ -25,12 +25,12 @@ void init_i2c(void) { IREG(I2CONSET) = 0x40; /* Enable I2C ready for Master Tx */ /* Set up for just under 400kHz */ -#if 0 +#ifdef I2C_FAST IWREG(I2SCLL) = (25 * 100); IWREG(I2SCLH) = (12 * 100); #else - IWREG(I2SCLL) = 1475; /* ~5kHz */ - IWREG(I2SCLH) = 1475; + IWREG(I2SCLL) = 73; /* ~100kHz */ + IWREG(I2SCLH) = 73; #endif } @@ -45,11 +45,6 @@ int i2c_wait(void) return stat; } -void i2c_go(void) -{ - IREG(I2CONCLR) = SIFLAG; -} - int i2c_conreg(void) { return IREG(I2CONSET); @@ -64,14 +59,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; } } @@ -81,24 +74,42 @@ bool i2c_send_address(int addr, bool wri return i2c_send_data((addr<<1) + (write?0:1)); } -bool i2c_send_data(int data) +bool i2c_send_data(unsigned 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(unsigned 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. */ }