/*------------------------------------------------------*/
/* Ansteuerung eines 93C46 EEPROMS 64x16 	 	*/
/*------------------------------------------------------*/


/* Definitionen, die die Bitbelegung festlegen 		*/
#define EE_CS P2_7
#define EE_SK P2_6
#define EE_D  P2_5


/*------------------------------------------------------*/
/* ein Word lesen 			 	 	*/
/*------------------------------------------------------*/
unsigned int get_word( unsigned char adresse )
{
  unsigned char i;
  unsigned int d;	/* Datensammler			*/

  adresse &= 0x3F;	/* Adressbereich begrenzen 	*/

  EE_CS=1;		/* jetzt gehts los		*/

  EE_D = 1;
  EE_SK = 1;		/* clock aktivieren		*/
  i = i+1;		/* dummy zum Zeitverbrauch	*/
  EE_SK = 0;		/* clock wieder weg		*/

  EE_D = 1;
  EE_SK = 1;		/* clock aktivieren		*/
  i = i+1;		/* dummy zum Zeitverbrauch	*/
  EE_SK = 0;		/* clock wieder weg		*/

  EE_D = 0;
  EE_SK = 1;		/* clock aktivieren		*/
  i = i+1;		/* dummy zum Zeitverbrauch	*/
  EE_SK = 0;		/* clock wieder weg		*/

  for(i=0;i<6;i++)	/* 8 Bit ausgeben	   	*/
  {			/* oberstes Bit zuerst		*/
    EE_D = (adresse & 0x20) != 0;
    EE_SK = 1;		/* clock aktivieren		*/
    adresse = adresse << 1;  /* naechstes Bit vorbereiten*/
    EE_SK = 0;		/* clock wieder weg		*/
  }

  EE_D=1;		/* Daten high (pull up)		*/

  for(i=0;i<16;i++)	/* 16 Bit einlesen	   	*/
  {			/* oberstes Bit zuerst		*/
    EE_SK = 1;		/* clock aktivieren		*/
    d = d << 1;       	/* Platz fuers bit schaffen	*/
    d |=  EE_D;         /* naechstes Bit hereinholen	*/
    EE_SK = 0;		/* clock wieder weg		*/
  }

  EE_CS = 0;		/* CS = 0			*/

  return d;
}

/*------------------------------------------------------*/
/* ein Word schreiben			 	 	*/
/* loeschen nicht erforderlich !			*/
/*------------------------------------------------------*/
void put_word( unsigned char adresse, unsigned int w)
{
  unsigned char i;

  adresse &= 0x3F;	/* Adressbereich begrenzen 	*/

  EE_CS=1;		/* jetzt gehts los		*/

  EE_D = 1;
  EE_SK = 1;		/* clock aktivieren		*/
  i = i+1;		/* dummy zum Zeitverbrauch	*/
  EE_SK = 0;		/* clock wieder weg		*/

  EE_D = 0;
  EE_SK = 1;		/* clock aktivieren		*/
  i = i+1;		/* dummy zum Zeitverbrauch	*/
  EE_SK = 0;		/* clock wieder weg		*/

  EE_D = 1;
  EE_SK = 1;		/* clock aktivieren		*/
  i = i+1;		/* dummy zum Zeitverbrauch	*/
  EE_SK = 0;		/* clock wieder weg		*/

  for(i=0;i<6;i++)	/* 8 Bit ausgeben	   	*/
  {			/* oberstes Bit zuerst		*/
    EE_D = (adresse & 0x20) != 0;
    EE_SK = 1;		/* clock aktivieren		*/
    adresse = adresse << 1;  /* naechstes Bit vorbereiten*/
    EE_SK = 0;		/* clock wieder weg		*/
  }

  for(i=0;i<16;i++)	/* 16 Bit einlesen	   	*/
  {			/* oberstes Bit zuerst		*/
    EE_D = (w & 0x8000) != 0;
    EE_SK = 1;		/* clock aktivieren		*/
    w = w << 1;  	/* naechstes Bit vorbereiten*/
    EE_SK = 0;		/* clock wieder weg		*/
  }

  EE_D = 1;		/* high impedance		*/
  EE_SK = 0;		/* Clock auf 0			*/
  EE_CS = 0;		/* CS = 0			*/

  for(i=0;i<10;i++);

  EE_CS = 1;		/* verify			*/

  EE_SK = 1;
  EE_SK = 0;		/* dummy 1 ins Register schieben */
 
  while(EE_D==0) ;	/* warte bis Befehl ausgefuehrt */

  EE_CS = 0;		/* fertig			*/
}

/*------------------------------------------------------*/
/* write enable aktivieren                              */
/*------------------------------------------------------*/
void init_ee( void )
{
  int i;

  EE_D = 1;
  EE_SK = 0;
  EE_CS = 0;

  for(i=0;i<10;i++);	/* kurze Pause			*/

  /* schreibschutz aufheben */
  EE_CS = 1;		/* jetzt gehts los             	*/

  EE_D = 1;  EE_SK = 1;  EE_SK = 0;
  EE_D = 0;  EE_SK = 1;  EE_SK = 0;
  EE_D = 0;  EE_SK = 1;  EE_SK = 0;
  EE_D = 1;  EE_SK = 1;  EE_SK = 0;
  EE_D = 1;  EE_SK = 1;  EE_SK = 0;

  EE_CS = 0;

  for(i=0;i<10;i++);

}

