#include "i2c.h" void initI2C(void) { /* set pullups for SDA, SCL lines */ I2C_SDA_PORT |= ((1 << I2C_SDA) | (1 << I2C_SCL)); TWBR = 32; /* set bit rate (p.242): 8MHz / (16+2*TWBR*1) ~= 100kHz */ TWCR |= (1 << TWEN); /* enable */ } void i2cWaitForComplete(void) { loop_until_bit_is_set(TWCR, TWINT); } void i2cStart(void) { TWCR = (_BV(TWINT) | _BV(TWEN) | _BV(TWSTA)); i2cWaitForComplete(); } void i2cStop(void) { TWCR = (_BV(TWINT) | _BV(TWEN) | _BV(TWSTO)); } uint8_t i2cReadAck(void) { TWCR = (_BV(TWINT) | _BV(TWEN) | _BV(TWEA)); i2cWaitForComplete(); return (TWDR); } uint8_t i2cReadNoAck(void) { TWCR = (_BV(TWINT) | _BV(TWEN)); i2cWaitForComplete(); return (TWDR); } void i2cSend(uint8_t data) { TWDR = data; TWCR = (_BV(TWINT) | _BV(TWEN)); /* init and enable */ i2cWaitForComplete(); }