Quoting "Laurent FAILLIE" <l_fail...@yahoo.com>:

> Hello,
>
> I googled but w/o success ... can someone point me out a tutorial or  
> at least an example of I2C slave programming with SDcc on PIC (I'm  
> using 16F88) ?
>

I don't know if the 16F88 has a hardware I2C circuit, but if it has,  
I've used this (just the relevant functions here):


// Send an I2C start sequence
void I2Cstart()
{
   SEN=1;
   while(SEN) {
   }
   SSPIF=0;
}


// Send an I2C STOP sequence
void I2Cstop()
{
   PEN=1;
   while(PEN) {
   }
   SSPIF=0;
}

// Send a repeated START
void I2Crestart()
{
   RSEN=1;
   while(RSEN) {
   }
   SSPIF=0;
}


These were the control signals, next is what I used for the data,  
after calling relevant previous functions (never mind my comments, I  
assume an RTC won't complain about any data errors):

// Shift one byte of data to the bus.
// As of this version, no error checing is done. The function
// assumes the receiver sends an "Acknowledged".
void I2Cwrite(unsigned char c)
{
   SSPBUF=c;
   while(!SSPIF);
   SSPIF=0;
}





// Shift in one byte from the bus and then sends and "Acknowledge"
unsigned char I2Cread(unsigned char ack)
{
   unsigned char c;
   RCEN=1;
   while(!BF);
   c=SSPBUF;
   if(ack) {
     ACKDT=0;
   }
   else {
     ACKDT=1;
   }
   ACKEN=1;
   return(c);
}




************************************
Then, the bit-banged version, if you don't have proper I2C hardware.  
This is on a 16F690, mapping like this:
SDA=PORTB4
SCL=PORTB6

(You can try without the delays, for me it was just for being on the  
safe side)



void I2Cstart(void)
{
   SCL=0;
   I2Cdelay();
   SDA=1;
   I2Cdelay();
   SCL=1;
   I2Cdelay();
   SDA=0;
   I2Cdelay();
}


void I2Cstop(void)
{
   SDA=0;
   I2Cdelay();
   SCL=1;
   I2Cdelay();
   SDA=1;
   I2Cdelay();
}



void I2Cwrite(unsigned char c)
{
   signed char i;
   SCL=0;
   I2Cdelay();
   for(i=7 ; i>=0 ; i--) {
     SDA=((c>>i)&0x01);
     I2Cdelay();
     SCL=1;
     I2Cdelay();
     while(SCL_RD==0) {  // Ensure the clock has been released by the slave
     }
     SCL=0;
     I2Cdelay();
   }
   I2Cdelay();
   while(SDA_RD) {       // wait for ack
   }
   SCL=1;
   I2Cdelay();
   I2Cdelay();
   I2Cdelay();

}




unsigned char I2Cread(unsigned char ack)
{
   unsigned char i,byte;
   byte=0x00;
   SCL=0;
   for(i=0;i<8;i++) {
     I2Cdelay();
     SDA=1;
     SCL=1;
     while(SCL_RD==0) {  // Clock stretch
     }
     I2Cdelay();
     byte=byte << 1;
     byte |= (SDA_RD & 0x01);
     I2Cdelay();
     SCL=0;
   }
   I2Cdelay();
   if(ack==0) {
     SDA=1;
     I2Cdelay();
     SCL=1;
     I2Cdelay();
     SCL=0;
     I2Cdelay();
   }
   else {
     SDA=0;
     I2Cdelay();
     SCL=1;
     I2Cdelay();
     SCL=0;
   }
   return(byte);

}


Note: I haven't bothered with error checking or things like that, you  
may want to add some later on...

I hope this helps at all.

Regards, Robert
















------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to