uint8_t i2c_write(uint8_t data) { i2c_sclLo(); uint8_t mask; for (mask = 0x80; mask != 0; mask >>=1) { i2c_sdaOut(data & mask); i2c_sclHi(); i2c_sclLo(); } i2c_sdaOut(1); i2c_sclHi(); uint8_t ack = ! i2c_sdaIn(); i2c_sclLo(); return ack; }
INLINE bool i2c_bitbang_start_1(struct I2c *i2c) { bool ret; /* Clear all error, we restart */ i2c->errors &= ~(I2C_NO_ACK | I2C_ARB_LOST); if (old_api) { SDA_HI; SCL_HI; I2C_HALFBIT_DELAY(); SDA_LO; I2C_HALFBIT_DELAY(); ret = !SDA_IN; } else { i2c_sdaHi(I2C_DEV(i2c)); i2c_sclHi(I2C_DEV(i2c)); i2c_halfbitDelay(I2C_DEV(i2c)); i2c_sdaLo(I2C_DEV(i2c)); i2c_halfbitDelay(I2C_DEV(i2c)); ret = !i2c_sdaIn(I2C_DEV(i2c)); } return ret; }
uint8_t i2c_read(uint8_t last) { uint8_t data = 0; uint8_t mask; for (mask = 0x80; mask !=0; mask >>=1) { i2c_sclHi(); if (i2c_sdaIn()) { data |= mask; } i2c_sclLo(); } i2c_sdaOut(last); i2c_sclHi(); i2c_sclLo(); if (last) { i2c_stop(); } i2c_sdaOut(1); return data; }
static void i2c_bitbang_stop_1(struct I2c *i2c) { if (old_api) { SDA_LO; SCL_HI; I2C_HALFBIT_DELAY(); SDA_HI; } else { i2c_sdaLo(I2C_DEV(i2c)); i2c_sclHi(I2C_DEV(i2c)); i2c_halfbitDelay(I2C_DEV(i2c)); i2c_sdaHi(I2C_DEV(i2c)); } }
void i2c_stop() { i2c_sdaOut(0); i2c_sclHi(); i2c_sdaOut(1); }
uint8_t i2c_start(uint8_t addr) { i2c_sclLo(); i2c_sclHi(); i2c_sdaOut(0); return i2c_write(addr); }
void i2c_init() { i2c_sdaOut(1); PINMODE(SCL_DDR,SCL,OUTPUT); i2c_sclHi(); }