Hi, this is code for a master I2C device.

We're talking about slaves here. Make the PIC behave as an I2C device
like an EEPROM or something like that.
Yes that's a bit trickier, even with hardware support :)

Sebastien

On Thu, Jul 8, 2010 at 2:47 AM,  <[email protected]> wrote:
> Quoting "Laurent FAILLIE" <[email protected]>:
>
>> 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/sdcc-user
>

------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to