#include <iiclib.h>

/* Deklarace globálních proměnných*/
char dataTransfering,bytesToSend,bytesSent,direction;
char* databuffer;
#define IIC_TIMEOUT 30000
void IICInit(void){
	SOPT2_IICPS = 0; /* Nastaveni portu pro IIC */
	IICC1 = 0xC8; /* Nastavení IIC Control registru 1: IICEN = 1, IICIE = 1, TXAK = 1*/ 
	IICF = 0x95;  /* Nastavení rychlosti přenosu*/
	dataTransfering = 0;
}

void IICTransmit(unsigned char addr, unsigned char bytes, char* ptr){
	direction = 1;
	bytesToSend = bytes;
	bytesSent =  0;
	dataTransfering = 1;
	databuffer = ptr;
	
	IICC1_IICEN = 0; 
	IICC1_IICEN = 1; /* Reset modulu*/
		 
	IICS_IICIF = 1;  /* Vymazání flagu indikující přerušení*/

	IICC1_MST = 0;
 
	IICC1_TX = 1;	/* Nastavení odesílání dat*/
	IICC1_MST = 1;	/* Zapnutí master režimu (odeslání start bitu)*/
	    	
	IICD=(addr<<1)&0xFE;	/* Odeslání adresy doplněné o R/W bit*/
	while(dataTransfering) __RESET_WATCHDOG();
}

void IICReceive(unsigned char addr, unsigned char bytes, char* ptr){
	  unsigned int timeout = 0;
	  direction = 0;
	  bytesToSend = bytes;
	  bytesSent =  0;
	  dataTransfering = 1;
	  databuffer = ptr;
	  
	  IICS_IICIF = 1;	/* Vymazání flagu indikující přerušení*/
	  
	  IICC1_MST = 0;
	      
	  IICC1_TXAK = 0;	/* Zapnutí odesílání ACK bitu po přijetí dat*/
	  IICC1_TX = 1;		/* Nastavení odesílání dat*/
	  IICC1_MST = 1;	/* Zapnutí master režimu (odeslání start bitu)*/
	  
	  IICD=(addr<<1)|0x01;	/* Odeslání adresy doplněné o R/W bit*/
	  while(dataTransfering && timeout < IIC_TIMEOUT)
	  {
		  __RESET_WATCHDOG();
		  timeout++;
	  }
	  dataTransfering = 0;
}

interrupt VectorNumber_Viic void IIC_Control_handler(void){
  IICS_IICIF=1;	/* Vymazání flagu indikující přerušení*/
  if(dataTransfering==1){
	if(direction==1){ /* Odesílání dat*/
    if(bytesSent<bytesToSend){ /* Pokud jsou v bufferu data k odeslání*/
      IICD = *(databuffer + bytesSent);	/* Odeslání jednoho bytu*/
	  bytesSent++;
      return;
    }
	  else{	/* Pokud jsou všechny byty odeslány ukončí se přenos*/
      dataTransfering = 0;			
	  IICC1_TX = 0;
	  IICC1_MST = 0;	/* Vypnutí master režimu (odeslání stop bitu)*/
      return;  				  
	  }
    }
    else{ /* Příjem dat*/
      if(IICC1_TX==1){ /* Tento stav nastane, pokud jsme v režimu přijmu a odeslali jsme adresu*/
        IICC1_TX = 0;
        IICD; /* Vyčtení datového registru po odeslání adresy, pokud přijímáme data*/
        return;
      }
      if(bytesSent<bytesToSend){ /* Nejsou přijaty všechny byty*/
        if((bytesSent+1) == bytesToSend){
		  IICC1_TXAK = 1; /* Vypnutí ACK bitu před přijetím posledního bytu*/
	    }
	    *(databuffer + bytesSent) = IICD;	/* Uložení přijatého bytu*/
	    bytesSent++;
        return;
      }
      else{ /* Všechny byty přijaty*/
        dataTransfering=0;
	    IICC1_MST = 0;	/* Vypnutí master režimu (odeslání stop bitu)*/
	    return;
      }    
    }
  }
}
