summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--avr/Tupfile3
-rw-r--r--avr/i2c.c39
2 files changed, 14 insertions, 28 deletions
diff --git a/avr/Tupfile b/avr/Tupfile
index 61cb577..9227f2b 100644
--- a/avr/Tupfile
+++ b/avr/Tupfile
@@ -52,9 +52,12 @@ CFLAGS += -ffunction-sections
CFLAGS += -fdata-sections
CFLAGS += -fno-tree-loop-optimize
CFLAGS += -fno-move-loop-invariants
+CFLAGS += -fno-split-wide-types
#CFLAGS += -flto
CFLAGS += -fshort-enums
+#CFLAGS += -fdiagnostics-color=always
+
#CFLAGS += -save-temps
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);