A piece of my I2C code... then you can compare with yours
/* SCL P2.1 */ #define SCL_L P2OUT &= ~BIT1 #define SCL_H P2OUT |= BIT1 /* SDA P1.4 */ #define SDA_L P1DIR |= BIT4 #define SDA_HIZ P1DIR &= ~BIT4 #define SDA_READ (P1IN & BIT4) #define send_start(x) { SDA_L; SCL_L; } #define send_stop(x) { SDA_L; SCL_H; SDA_HIZ; SDA_L; SCL_H; } #define send_ack(x) { SDA_L; SCL_H; SCL_L; SDA_HIZ; } #define send_noack(x) { SDA_HIZ; SCL_H; SCL_L; } /* return 0 if fails * my I2C device will answer with ACK in less than 100ns * just a nop will be enough to wait ack from device */ int wait_ack(void) { int k = 1; SDA_HIZ; nop(); SCL_H; nop(); if (SDA_READ) k = 0; SCL_L; return k; } #define send_8bits(val) { \ for(i = 0; i < 8; i++) { \ if (val & 0x80) { \ SDA_HIZ; \ } else { \ SDA_L; \ } \ SCL_H; \ val <<= 1; \ SCL_L; \ } \ SDA_HIZ; \ } uint8_t recv_8bits (void) { unsigned int i, val = 0; for (i = 0; i < 8; i++) { val <<= 1; SCL_H; if (SDA_READ) val |= 1; SCL_L; } return val; } void i2c_init(void) { P1SEL &= ~BIT4; /* GPIO P1.4 */ P1OUT &= ~BIT4; /* output always 0 */ SDA_HIZ; P2SEL &= ~BIT1; /* GPIO P2.1 */ P2DIR |= BIT1; /*P2.1 output (SCL) */ SCL_H; } /* size is 0 for 8bits or 1 for 16bits */ int i2c_write (uint8_t addr, uint16_t val, int size) { int i; send_start(); /* BIT0 is 0 for WRITE */ addr <<= 1; send_8bits(addr); if (! wait_ack()) { i2c_sync(); return 0; } if (size) { uint16_t v; v = val >> 8; send_8bits(v); if (! wait_ack()) { i2c_sync(); return 0; } } send_8bits(val); if (! wait_ack()) { i2c_sync(); return 0; } send_stop(); return 1; } /* size is 0 for 8bits or 1 for 16bits */ int i2c_read (uint8_t addr, uint16_t * val, int size) { int i, ret; send_start(); addr <<= 1; /* BIT0 is 1 for READ */ addr |= 0x01; send_8bits(addr); if (wait_ack()) { *val = 0; if (size) { * (((uint8_t *) val) + 1) = recv_8bits(); send_ack(); } * (uint8_t *) val = recv_8bits(); send_noack(); send_stop(); ret = 1; } else { ret = 0; } return ret; } Fri, Sep 24, 2004 at 06:04:25PM -0500, karan wrote: > hi, > im trying to bit-bang i2c... > here's part of my code for checking the line on the port..