
//I2C Master Receiver Firmware pour pic 16F1455-1459
//FOSC , XXXX.SSP1IF , ... adapter selon votre PIC

#include <xc.h>
#include "I2CMaster.h"

#define FOSC 48000000 // Fosc : modifier avec la valeur de votre horloge 48 Mhz ici
#define I2C_BaudRate 100000 // I2C Baud Rate = 100 Kbps
#define  ACK 1
#define  NAK 0

void I2CInit( void) {

   
   PIE1bits.SSP1IE=0;      //Disable IT MSSP
   //TRISX SDA et SCL : positionner en entrée
   //ANSELX  positionner a 0 pour SDA et SCL
   SSP1STAT = 0x00;         // clear all status bits
   SSP1STATbits.SMP = 1;            // SMP 0 = Slew for 400kHz, 1 = 100k
   CKE = 0;            // CKE;  0 = 5V logic level; 1 = 3.3 V logic
   SSPADD = (( FOSC / (4 * i2c_BaudRate) )) - 1; // initialize i2c bus rate
   SSPCON1 = 0x28;         // IIC Master
   SSPCON2=  0x00;         // clear all state bits
   SSPCON3=  0x0;
  

}

void Send_I2C_Start(void)
{
 PIR1bits.SSP1IF = 0; // clear interrupt flag
 SSP1CON2bits.SEN = 1; // send start sera remis à 0 par hardware
 while(!PIR1bits.SSP1IF); // Wait for the SSPIF bit to return high
}

void Send_I2C_Stop(void)
{
 PIR1bits.SSP1IF = 0; // clear interrupt flag
 SSP1CON2bits.PEN = 1; // Initiate the Stop condition
 while(!PIR1bits.SSP1IF); // Wait for the SSPIF bit to return high
}

char Write_I2C (char data)//retoune 0 si slave n'acquitte pas, 1 si slave acquitte
{
 SSP1BUF = data; // Transmit begins as soon as SSP1BUF is written  
 PIR1bits.SSP1IF = 0; // clear interrupt flag
 while (!PIR1bits.SSP1IF); // Wait for interrupt flag to return high
 if(ACKSTAT)return 0;//Not bAcknowledge
 else return 1;//Acknowledge
}

char Read_I2C(char ACK)
{
 SSP1CON2bits.RCEN = 1; // set the receive enable bit to initiate a read
 PIR1bits.SSP1IF = 0; // clear interrupt flag
 if (ack){SSP1CON2bits.ACKDT = 0;} else {SSP1CON2bits.ACKDT = 1;}
 while (!PIR1bits.SSP1IF) ; // wait for a flag to be set
 SSP1CON2bits.ACKEN = 1; // send acknowledge sequence
 PIR1bits.SSP1IF = 0; // clear interrupt flag
 while (!PIR1bits.SSP1IF) ; // wait for a flag to be set
 return (SSP1BUF); // Received data is now in the SSP1BUF
}


//-------------------------------------------------------------------------------------------------------------------
//Utilisation:
//unsigned char Tab[3];
//if LecNecI2c(&Tab)...

unsigned char LecNecI2c(unsigned char * Table)  
//retourne 0 si erreur ou ff si ok
{
 Send_I2C_Start();// initiate START condition
 if(!Write_I2C ( AddSlaveI2cNec | 0x01))
      return(0);            // slave n'acquitte pas

     Table[0]= Read_I2C (ACK); // 1 = ACK, 0 = NAK
              

     Table[1]=Read_I2C (ACK); // 1 = ACK, 0 = NAK
               

    Table[2]=Read_I2C (NAK); // 1 = ACK, 0 = NAK
              
	
	Send_I2C_Stop();

  return (0xff);               // return with no error

}


//************************************************************************