diff options
-rw-r--r-- | avr/Tupfile | 3 | ||||
-rw-r--r-- | avr/i2c.c | 39 |
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 @@ -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); |