55 TWSR &= ~((1 << TWPS1) | (1 << TWPS0));
65 _i2c_start(uint8_t addr, uint8_t rep) {
69 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
70 while (!(TWCR & (1 << TWINT))) {
76 if ((TWSR & 0xF8) != ((!rep) ? I2C_START : I2C_REP_START))
80 TWCR = (1 << TWINT) | (1 << TWEN);
83 while (!(TWCR & (1 << TWINT))) {
88 if (!(((TWSR & 0xF8) == I2C_MT_SLA_ACK) || ((TWSR & 0xF8) == I2C_MR_SLA_ACK)))
95 i2c_start(uint8_t addr) {
96 return _i2c_start(addr, 0);
100 i2c_rep_start(uint8_t addr) {
101 return _i2c_start(addr, 1);
109 TWCR = (1 << TWINT) | (1 << TWEN);
111 while (!(TWCR & (1 << TWINT))) {
117 if ((TWSR & 0xF8) != I2C_MT_DATA_ACK)
124 i2c_read(uint8_t *data, uint8_t ack) {
126 TWCR = (1 << TWINT) | (1 << TWEN) | (ack ? (1 << TWEA) : 0);
127 while (!(TWCR & (1 << TWINT))) {
132 if ((TWSR & 0xF8) != (ack ? I2C_MR_DATA_ACK : I2C_MR_DATA_NACK))
139 i2c_read_ack(uint8_t *data) {
140 return i2c_read(data, 1);
144 i2c_read_nack(uint8_t *data) {
145 return i2c_read(data, 0);
152 TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
153 while (TWCR & (1 << TWSTO)) {
159 TWCR &= ~(1 << TWEN);
162 DDRC &= ~((1 << PC0) | (1 << PC1));
163 PORTC |= ((1 << PC0) | (1 << PC1));