115 lines
1.7 KiB
C
115 lines
1.7 KiB
C
#include "i2c.h"
|
|
#include <util/delay.h>
|
|
|
|
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;
|
|
}
|
|
|
|
|