hi pedro,

i compared your code with mine...
its pretty much the same..
i just can't figure it out..

the slave simply doesnt get the bits from the port...
the slave is also bit-banged...this is purely experimental...
it hangs up...waiting for the clock..
everything else runs smoothly, the master is perfect...ie. if it doesnt
get ack, it announces that no slave was found, etc etc..

this is the putbyte fn. of the master:

        int I2C_PutByte(BYTE byte)
        {
          BYTE n; int i=48;
          SDA_Write();             // set dirn of port as output
          SCL_Low();               // this is what the slave looks for
        b4 beginning to read from SDA
          for (n = 0x80; n!= 0; n = n>>1)
            {
              if ( (byte & n) == n )
                        SDA_High();
              else
                        SDA_Low();
              writedigit(4, (char)i);
              i++;
              SCL_Clock();        // scl_high(), wait, then scl_low,
        wait -- so slave waits for clock to become low, b4 reading next
        bit
            }
          I2C_WaitForACK();
          state = ST_IDLE;
          if (ack == 1)
            return I2C_OK;
          else
            return I2C_NACK_ON_DATA;
        }


this is the getbyte fn. in the slave:

        BYTE I2C_GetByte()
        {
          BYTE i = 0x00;
          int n;
          SDA_Read(); SCL_Read();        // set dirns of port as input
          while(isSCL_High());           // make sure SCL is low b4
        going in
          for (n = 0; n < 8; n++)
            {
              i = i << 1;
              i = i | isSDA_High();
              while(isSCL_Low());       // wait for SCL to become high
        -- start of clock pulse
              // this never comes on the lcd, but it should!! the clock
        never becomes high, from the slave's
              // pov. but the master is displaying its clock on the lcd
        and thats workin fine! 
              writedigit(4, (char)(n+48));
              while(isSCL_High());      // wait for SCL to become low --
        clock pulse ended -- explained above
            }
          I2C_SendACK();
          state = ST_IDLE;
          return i;
        }

both the fns. are called simultaneously. ie. as soon as master issues
START condn. the master begins to send the address "PutByte
(slaveaddress)" and the slave,
begins to recv the address. "GetByte (slaveaddress)". However, the
master keeps sending the bits (its displayed on the lcd) but the slave
doesnt even receive the 1st one;
something wrong in the code above?

listed below are the isSCL_Low() and the isSCL_High() fns:


        short isSCL_High()
        { 
          SCL_Read(); BYTE incoming;
          incoming = P2IN & CLKBIT;
          if (incoming == CLKBIT)
            return 1;
          else
            return 0;
        //return ( ((P2IN & CLKBIT) == CLKBIT) ? 1 : 0 ); 
        }
        
        short isSCL_Low()
        { 
          SCL_Read(); BYTE incoming;
          incoming = P2IN & CLKBIT;
          if (incoming == 0)
            return 1;
          else
            return 0;
          // return ( ((P2IN & CLKBIT) == 0x00) ? 1 : 0 ); }
        }


appreciate any help i can get.
thanks,
karan
CM II
Resolution Systems Inc.

Reply via email to