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
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];
tmp_stat &= ~BUSY;
next_twcr = (1<<TWEN)|(0<<TWIE)|(1<<TWINT)|(1<<TWSTO);
}
-
break;
case TWI_MTX_DATA_NACK:
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;
xmit.buf[tmp_idx] = TWDR;
++tmp_idx;
/* fall thru */
-
default:
tmp_stat &= ~BUSY;
next_twcr = (1<<TWEN)|(0<<TWIE)|(1<<TWINT)|(1<<TWSTO);