diff options
Diffstat (limited to 'avr/i2c.c')
-rw-r--r-- | avr/i2c.c | 39 |
1 files changed, 11 insertions, 28 deletions
@@ -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); |