58 #define I2C_PxDIR P3DIR
60 #define I2C_PxOUT P3OUT
61 #define I2C_PxSEL P3SEL
69 #define SDA_0() (I2C_PxDIR |= BV(SDA))
70 #define SDA_1() (I2C_PxDIR &= ~BV(SDA))
71 #define SDA_IS_1 (I2C_PxIN & BV(SDA))
73 #define SCL_0() (I2C_PxDIR |= BV(SCL))
74 #define SCL_1() (I2C_PxDIR &= ~BV(SCL))
75 #define SCL_IS_1 (I2C_PxIN & BV(SCL))
80 #define SCL_WAIT_FOR_1() do{}while (!SCL_IS_1)
82 #define delay_4_7us() do{ _NOP(); _NOP(); _NOP(); _NOP(); \
83 _NOP(); _NOP(); _NOP(); _NOP(); \
84 _NOP(); _NOP(); _NOP(); _NOP(); }while(0)
86 #define delay_4us() do{ _NOP(); _NOP(); _NOP(); _NOP(); \
87 _NOP(); _NOP(); _NOP(); _NOP(); \
88 _NOP(); _NOP(); }while(0)
90 static unsigned char old_pxsel, old_pxout, old_pxdir;
99 unsigned char sda_scl = BV(SDA)|BV(SCL);
101 old_pxsel = I2C_PxSEL & sda_scl;
102 old_pxout = I2C_PxOUT & sda_scl;
103 old_pxdir = I2C_PxDIR & sda_scl;
107 I2C_PxSEL &= ~sda_scl;
109 I2C_PxOUT &= ~sda_scl;
111 I2C_PxDIR |= BV(SCL);
112 I2C_PxDIR &= ~BV(SDA);
122 unsigned char not_sda_scl = ~(BV(SDA)|BV(SCL));
124 I2C_PxDIR = (I2C_PxDIR & not_sda_scl) | old_pxdir;
125 I2C_PxOUT = (I2C_PxOUT & not_sda_scl) | old_pxout;
126 I2C_PxSEL = (I2C_PxSEL & not_sda_scl) | old_pxsel;
141 for (n = 0; n < 100000 && !SCL_IS_1; n++)
170 unsigned char c = _c;
175 for (i = 0; i < 8; i++, c <<= 1) {
188 for (n = 0; n < 250000; n++) {
204 unsigned char c = 0x00;
207 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.