#include "i2c.h" #include void i2c_init(void) { i2c_sda_hi(); i2c_scl_hi(); _delay_us(i2cbitdelay); } void i2c_writebit( uint8_t c ) { if ( c > 0 ) { i2c_sda_hi(); } else { i2c_sda_lo(); } i2c_scl_hi(); _delay_us(i2cbitdelay); i2c_scl_lo(); _delay_us(i2cbitdelay); if ( c > 0 ) { i2c_sda_lo(); } _delay_us(i2cbitdelay); } uint8_t i2c_readbit(void) { i2c_sda_hi(); i2c_scl_hi(); _delay_us(i2cbitdelay); uint8_t c = bitRead( SDAPORT,SDAPIN); i2c_scl_lo(); _delay_us(i2cbitdelay); return c ? 1 : 0; } void i2c_start(void) { i2c_sda_hi(); i2c_scl_hi(); _delay_us(i2cbitdelay); i2c_sda_lo(); _delay_us(i2cbitdelay); i2c_scl_lo(); _delay_us(i2cbitdelay); } void i2c_repstart(void) { i2c_sda_hi(); i2c_scl_hi(); i2c_scl_lo(); // force SCL low _delay_us(i2cbitdelay); i2c_sda_release(); // release SDA _delay_us(i2cbitdelay); i2c_scl_release(); // release SCL _delay_us(i2cbitdelay); i2c_sda_lo(); // force SDA low _delay_us(i2cbitdelay); } void i2c_stop(void) { i2c_scl_hi(); _delay_us(i2cbitdelay); i2c_sda_hi(); _delay_us(i2cbitdelay); } uint8_t i2c_write( uint8_t c ) { for ( uint8_t i=0;i<8;i++) { i2c_writebit( c & 128 ); c<<=1; } return i2c_readbit(); } uint8_t i2c_read( uint8_t ack ) { uint8_t res = 0; for ( uint8_t i=0;i<8;i++) { res <<= 1; res |= i2c_readbit(); } if ( ack ) i2c_writebit( 0 ); else i2c_writebit( 1 ); _delay_us(i2cbitdelay); return res; }