summaryrefslogtreecommitdiff
path: root/avr/i2c.c
diff options
context:
space:
mode:
authorLeo C2014-08-26 11:19:21 +0200
committerLeo C2014-08-26 11:19:21 +0200
commit85787726aedbb4cd763613f6c2eadf66f9110ff4 (patch)
treea5c7bb2ccbfa787f06f81c8edb988d7f6ed1d114 /avr/i2c.c
parentf14850dbf6369dc42df913c407bda51efb1c620c (diff)
downloadz180-stamp-85787726aedbb4cd763613f6c2eadf66f9110ff4.zip
i2c.c
Diffstat (limited to 'avr/i2c.c')
-rw-r--r--avr/i2c.c39
1 files changed, 11 insertions, 28 deletions
diff --git a/avr/i2c.c b/avr/i2c.c
index 5d414af..dbb5da1 100644
--- a/avr/i2c.c
+++ b/avr/i2c.c
@@ -134,21 +134,11 @@ ISR(TWI_vect)
break;
case TWI_MTX_ADR_ACK:
- tmp_stat |= ADDR_ACK;
-
- if (tmp_idx < xmit.len) { /* all bytes transmited? */
- TWDR = xmit.buf[tmp_idx];
- ++tmp_idx;
- next_twcr = (1<<TWEN)|(1<<TWIE)|(1<<TWINT);
- } else {
- tmp_stat |= XMIT_DONE;
- tmp_stat &= ~BUSY;
- next_twcr = (1<<TWEN)|(0<<TWIE)|(1<<TWINT)|(1<<TWSTO);
- }
- break;
-
case TWI_MTX_DATA_ACK:
- tmp_stat |= DATA_ACK;
+ if ((twsr&0xf8) == TWI_MTX_ADR_ACK)
+ tmp_stat |= ADDR_ACK;
+ else
+ tmp_stat |= DATA_ACK;
if (tmp_idx < xmit.len) { /* all bytes transmited? */
TWDR = xmit.buf[tmp_idx];
@@ -159,7 +149,6 @@ ISR(TWI_vect)
tmp_stat &= ~BUSY;
next_twcr = (1<<TWEN)|(0<<TWIE)|(1<<TWINT)|(1<<TWSTO);
}
-
break;
case TWI_MTX_DATA_NACK:
@@ -168,25 +157,20 @@ ISR(TWI_vect)
next_twcr = (1<<TWEN)|(0<<TWIE)|(1<<TWINT)|(1<<TWSTO);
break;
- case TWI_MRX_ADR_ACK:
- tmp_stat |= ADDR_ACK;
- n = xmit.len-1;
- if (tmp_idx < n) {
- next_twcr = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
- } else {
- next_twcr = (1<<TWEN)|(1<<TWIE)|(1<<TWINT);
- }
- break;
-
case TWI_MRX_DATA_ACK:
- tmp_stat |= DATA_ACK;
xmit.buf[tmp_idx] = TWDR;
++tmp_idx;
+ /* fall thru */
+ case TWI_MRX_ADR_ACK:
+ if ((twsr&0xf8) == TWI_MRX_ADR_ACK)
+ tmp_stat |= ADDR_ACK;
+ else
+ tmp_stat |= DATA_ACK;
+
n = xmit.len-1;
if (tmp_idx < n) {
next_twcr = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
} else {
-
next_twcr = (1<<TWEN)|(1<<TWIE)|(1<<TWINT);
}
break;
@@ -197,7 +181,6 @@ ISR(TWI_vect)
xmit.buf[tmp_idx] = TWDR;
++tmp_idx;
/* fall thru */
-
default:
tmp_stat &= ~BUSY;
next_twcr = (1<<TWEN)|(0<<TWIE)|(1<<TWINT)|(1<<TWSTO);