#ifndef I2C_H #define I2C_H #include #include #define PCA9555_ADDR_OTHER 0b0100111 #define PCA9555_ADDR_SELF 0b0100000 #define REG_INPUT_PORT0 0x00 #define REG_INPUT_PORT1 0x01 #define REG_OUTPUT_PORT0 0x02 #define REG_OUTPUT_PORT1 0x03 #define REG_CONFIG_PORT0 0x06 #define REG_CONFIG_PORT1 0x07 #define I2C_CLOCK 100000UL #define I2C_ADDR(ADDR, RW) ((ADDR) << 1 | (RW & 1)) void i2c_init(void); void i2c_start(void); void i2c_stop(void); void i2c_write(uint8_t); uint8_t i2c_read_nack(void); uint8_t i2c_read_ack(void); uint8_t pca9555_read(uint8_t addr, uint8_t reg); void pca9555_write(uint8_t addr, uint8_t reg, uint8_t value); static inline void pca9555_set_output(uint8_t addr, uint8_t port, uint8_t mask) { uint8_t cfg = pca9555_read(addr, port); cfg &= ~mask; pca9555_write(addr, port, cfg); } static inline void pca9555_set_low(uint8_t addr, uint8_t port, uint8_t mask) { uint8_t out = pca9555_read(addr, port); out &= ~mask; // clear bit pca9555_write(addr, port, out); } static inline void pca9555_set_high(uint8_t addr, uint8_t port, uint8_t mask) { uint8_t out = pca9555_read(addr, port); out |= mask; // set bit; pca9555_write(addr, port, out); } static inline void pca9555_toggle(uint8_t addr, uint8_t port, uint8_t mask) { uint8_t out = pca9555_read(addr, port); out ^= mask; pca9555_write(addr, port, out); } #endif /* I2C_H */