//SL1935.C   programiranje this chip over I2C bus
//digi sat tuner sinti

//s57uuu aug 2004

#include<stdio.h>
#include<dos.h>       //inportb


int LPT=0x378;


//----------------------------------------------------------------------
//------------routines for tuner synth (SL1935) programming-------------

//d0 (pin2) = SCL,  d1 (pin3) = SDA,  error (pin15) = vhod SDA

void del10us()      //10 microsec delay
{int i;for (i=0;i<100;i++){}}

void cddd()                        //SCL low,  SDA low  (transistor invert!)
{outportb(LPT,0xFF);del10us();}
void cddg()                        //SCL low,  SDA high
{outportb(LPT,0xFD);del10us();}
void cgdd()                        //SCL high, SDA low
{outportb(LPT,0xFE);del10us();}
void cgdg()                        //SCL high, SDA high
{outportb(LPT,0xFC);del10us();}

//-------------------

int prog3302(unsigned char bb[])        //send 5 bytes bb[] to I2C bus
{
int i,j,a;unsigned char b;
cgdd();cddd();   //START
a=0;
for (i=0;i<5;i++)
  {
  b=bb[i];
  for (j=0;j<8;j++)
	{
	if ((b&128)==128)
	  {cddg();cgdg();cddg();}
	else
	  {cddd();cgdd();cddd();}
	b=b<<1;
	}
  cddg();cgdg();a=a+(inportb(LPT+1)&8);cddg();	  //ACK
  }
cgdd();cgdg();        //STOP
return a/8;
}

//--------------------

int beri1935(unsigned char adr)       //read status byte from sl1935
{
int i,a;unsigned char b;
cgdd();cddd();        //START
b=192+2*adr+1;
for (i=0;i<8;i++)
  {
  if ((b&128)==128)
	{cddg();cgdg();cddg();}
  else
	{cddd();cgdd();cddd();}
  b=b<<1;
  }
cddg();cgdg();a=(inportb(LPT+1)&8);cddg();	  //ACK
b=0;
for (i=0;i<8;i++)
  {
  cddg();cgdg();b=(b<<1)+((inportb(LPT+1)&8)/8);cddg();
  }
cddg();cgdg();cddg();     //ACK
cddd();cgdd();cgdg();     //STOP
if (a==0) return b; else return -a;
}

//****************************************************************

int main()
{
unsigned char bb[5],adr,cp,bp,buf,tm,rr,vco,p0;
double xtal,fref,frek;
unsigned int n;
int stat;

adr=0;
cp=0;
bp=0;
buf=0;
tm=0;
rr=1;
vco=0;
p0=0;


xtal=4000000.00;
fref=xtal/4;

clrscr();
printf("\n\n*****  SL1935 synthesizer programming *****");

printf("\n\nAssuming reference xtal = %2.3lfMHz",xtal/1000000.0);

printf("\n\nI2C address select on the SL1935:");
printf("\nPin 18 ground => adr = 0");
printf("\nPin 18 open   => adr = 1");
printf("\nPin 18 Vcc/2  => adr = 2");
printf("\nPin 18 Vcc    => adr = 3");

printf("\n\n Enter address [0..3]");scanf("%d",&adr);fflush(stdin);

printf("\n\n Enter frequency [MHz]!");scanf("%lf",&frek);fflush(stdin);

bb[0]=192+2*adr;
bb[1]=0x3;bb[2]=0xE8;
bb[3]=128+cp*32+rr;
bb[4]=tm*32+vco*16+bp*8+buf*2+p0;

do
  {
  n=frek*1000000.0/fref;
  bb[1]=n/256;bb[2]=n%256;
  if (frek<1400) bb[4]=bb[4]|16; else bb[4]=bb[4]&239;
  stat=prog3302(bb);
  if (stat!=0) printf("\n Prog3302: no ACK, stat= %d",stat);
  sleep(1);
  stat=beri1935(adr);
  if (stat<0)
	printf("\n Beri1935: no ACK");
  else
	{printf("\n POR: %d",(stat&128)/128);printf("  LOCK: %d",(stat&64)/64);}
  printf("\n\n Enter frequency (0=end)");scanf("%lf",&frek);fflush(stdin);
  }
while (frek!=0);

}
