60 #define I2C_PxDIR P3DIR
62 #define I2C_PxOUT P3OUT
63 #define I2C_PxSEL P3SEL
71 #define SDA_0() (I2C_PxDIR |= BV(SDA))
72 #define SDA_1() (I2C_PxDIR &= ~BV(SDA))
73 #define SDA_IS_1 (I2C_PxIN & BV(SDA))
75 #define SCL_0() (I2C_PxDIR |= BV(SCL))
76 #define SCL_1() (I2C_PxDIR &= ~BV(SCL))
77 #define SCL_IS_1 (I2C_PxIN & BV(SCL))
82 #define SCL_WAIT_FOR_1() do{}while (!SCL_IS_1)
84 #define delay_4_7us() do{ _NOP(); _NOP(); _NOP(); _NOP(); \
85 _NOP(); _NOP(); _NOP(); _NOP(); \
86 _NOP(); _NOP(); _NOP(); _NOP(); }while(0)
88 #define delay_4us() do{ _NOP(); _NOP(); _NOP(); _NOP(); \
89 _NOP(); _NOP(); _NOP(); _NOP(); \
90 _NOP(); _NOP(); }while(0)
92 static unsigned char old_pxsel, old_pxout, old_pxdir;
101 unsigned char sda_scl = BV(SDA)|BV(SCL);
103 old_pxsel = I2C_PxSEL & sda_scl;
104 old_pxout = I2C_PxOUT & sda_scl;
105 old_pxdir = I2C_PxDIR & sda_scl;
109 I2C_PxSEL &= ~sda_scl;
111 I2C_PxOUT &= ~sda_scl;
113 I2C_PxDIR |= BV(SCL);
114 I2C_PxDIR &= ~BV(SDA);
124 unsigned char not_sda_scl = ~(BV(SDA)|BV(SCL));
126 I2C_PxDIR = (I2C_PxDIR & not_sda_scl) | old_pxdir;
127 I2C_PxOUT = (I2C_PxOUT & not_sda_scl) | old_pxout;
128 I2C_PxSEL = (I2C_PxSEL & not_sda_scl) | old_pxsel;
143 for (n = 0; n < 100000 && !SCL_IS_1; n++)
172 unsigned char c = _c;
177 for (i = 0; i < 8; i++, c <<= 1) {
190 for (n = 0; n < 250000; n++) {
206 unsigned char c = 0x00;
209 for (i = 0; i < 8; i++) {
void i2c_write(uint8_t data)
Send a byte to I2C bus.
void i2c_stop(void)
Generate I2C STOP condition.
uint8_t i2c_read(int ack)
Read a byte from I2C bus.
void i2c_start(void)
Generate I2C START condition.
void i2c_enable(void)
Configure serial controller in I2C mode and set I2C speed.
void i2c_disable(void)
Configure serial controller in disabled mode.