INDEX...
Georg Acher's Homepage
ABOUT
PROJECTS
LINKS
TGI@TUM
   
NOKIA TUNER

Nokia TV-Tuner 5827

Im folgenden eine Kurzbeschreibung des Nokia 5827-Tuners, den es für 19.95DM (oder so) bei Pollin gibt. Ich habe das Teil reverse-engineered und ein paar Daten zusammengetragen. Es fehlt sicherlich noch einiges, da der Tuner noch einige seltsame CMOS-Schalter und I/Os hat, dessen genaue  Bedeutung ich noch nicht rausgefunden habe.
 

Obwohl das Ding in meiner Eigenbau-Stereoanlage wunderbar geht, ist alles folgende ohne Gewähr:
 

Pinbelegung: (Achtung: bis 31.3.99 waren noch zwei (harmlose) Typos in der Belegung)

Zählrichtung beginnt bei der Seite des HF-Antennen-Eingangs:
 

Pin Signal
3 +33V in 
6 GND
9 GND
10 +12V
11 SDA in (s.u.)
12 SCLK in
13 GND
14 +5V
19 +12V
20 FBAS out
23,24 GND
27 NF1 out
28 Mute in (offen lassen)
29 NF2 out
30 GND

An FBAS hat man das Video-Signal, an NF1 das Mono-Signal, damit an NF2 was rauskommt, muß man einen Widerstand auf der Platine ändern(???), dann hat man aber nur 2-Kanal-Ton, für Stereo braucht man noch einen Extra-Chip (zB. TDA 8415, nur ein Quarz und per I2C steuerbar).
 

Die Ansteuerung des Tuners erfolgt über das "übliche" I2C-Protokoll (SDA: Daten, SCLK: Schiebetakt).

SDA braucht einen Pullup (ca. 1K) nach +5V, dann Diode zum O-Port (Anode zu SDA)
 



 


Die 5V/12V können von einem 7805/7812 geliefert werden, die +33V (nicht so kritisch, aber über 37V funktioniert die PLL nicht mehr vernünftig) habe ich mit einem Schaltregler TL497 aus 5V erzeugt:

(Ja, ich weiß, der TL497 könnte auch selber regeln, eine ZD33 ist aber einfacher. Eigentlich sollte noch ein 100pF-C an Pin 3 für den Oszillator, es geht aber so auch ;-)
 
 

Der I2C PLL-Chip TSA5511 (Datenblatt bei Philips)


Die Ansteuerungsgrundlage ist das serielle Ausgeben eines Bytes:

Assembler Code für 68030:

; Gibt 1 Byte (in d0) auf I2C aus (oberstes Bit zuerst)
i2c_dataout:            ; int val
        moveq #7,d1     ; 8 bit ausgeben
.loop:
        bsr i2c_clk0    ; zuerst immer SCLK=0
        btst d1,d0
        beq.s .set0     ; Wenn Bit #d1 in d0 '0' ist, springe
        bsr i2c_data1   ; SCKL=0, SDA=1
        bra.s .next
.set0:                  ; oder
        bsr i2c_data0   ; SCKL=0, SDA=0
.next:
        bsr i2c_clk1    ; SCLK=1
        bsr i2c_clk0    ; SCLK=0
        dbra d1,.loop   ; 8 Bits reintaktem
        bsr i2c_data0   ; SDA=0
        bsr i2c_clk0    ; SCLK=0
        bsr i2c_clk1    ; SCLK=1
        rts
 

Für 68000-Unkundige: beq "branch if equal", bsr "branch to subroutine", dbra "decrement and branch if not zero".

Da das Ansteuern von SDA/SCLK systemspezifisch ist, habe ich das hier weggelassen.

Das SCLK-Wackeln nach dem 8ten Bit ist unbedingt nötig! Da muß das angesprochene Device sein "0"-Acknowledge auf SDA geben (kann man anschauen, ist aber egal, daher aber die Diode, sonst gibts eine Kollision). Die Subroutinen haben eine Warteschleife von ca. 10-100uS, SCLK darf so max. 100-200kHz haben.

Die Ausgabe eines Steuerwortes val (16bit) auf die I2C-Adresse adr (8Bit)
geht in C so:

(i2c_datax()/i2c_clkx() setzen die jeweiligen Signale auf x)

void i2c_out(int adr,int val)
{
        i2c_data1();i2c_clk1();         // Startbit
        i2c_data0();
        i2c_dataout(adr);               // Adresse
        i2c_dataout(val>>8);            // Obere 8 Bit
        i2c_dataout(val);               // Untere 8 Bit
        i2c_data0();
        i2c_clk1();i2c_data1();
        i2c_clk0();i2c_clk1();          // Stopbit
}

Der TSA5511 fühlt sich immer bei Adresse 0xC2 angesprochen. Nach der 8bit-Adresse bekommt der 5511 auch noch 16bit (2*8) Daten, entweder die PLL-Einstellung (Bit15=0) oder Kontrollinfos (Bit15=1, Frequenzband etc.)
 

Die Ausgabe der Frequenz freq (in 62.5kHz-Schritten) geht dann so
(inkl. Auswahl des richtigen Bandes):

#define UHFMIN  (int)(460000.0/62.5)
#define VHF3MIN (int)(160000.0/62.5)

void tuner_set_tv(int prog)
{
int freq,tnctrl;

        freq=stb->tuner_info[prog].freq;

// frequ: PLL-Teilerfaktor (s.u.)

        if (freq>UHFMIN)
                tnctrl=1;            // UHF
        else if (freq>VHF3MIN)
                tnctrl=2;            // VHF III
        else
                tnctrl=4;            // VHF I

        i2c_out(0xc2,0x80f0+tnctrl);  // Selektion des richtigen
                                        // Frequenzbandes
        i2c_out(0xc2,freq);             // Ausgabe der Frequenz
}

Zur Berechnung der PLL-Einstellung aus der üblichen Kanalnummer (0-99, wobei die Sonderkanäle S1-S20 von 80-99 gehen):

int channel_to_div(int c)
{

        if ((c>=91)&&(c<=99))
                c=4320+112*(c-91);
        if ((c==0)||(c==100))
                c=4320+112*9;
        if ((c>=5)&&(c<=12))
                c=3424+112*(c-5);
        if ((c>=21)&&(c<69))
                c=8160+128*(c-21);
        if ((c>=81)&&(c<=90))
                c=2304+112*(c-81);
        if ((c>=1)&&(c<=4))
                c=1280+112*(c-1);

        return c;
}

(Ob und wie man die Hyperbandkanäle S21... einstellen kann, habe ich noch ausprobiert.)

Die Frequenz, die man einstellt, liegt 38.5MHz (1te ZF) über der eigentlich gewünschten Frequenz.

Also zuerst mit channel_to_div den PLL-Teiler ausrechnen, dann mit set_tuner_tv setzen.

Damit sollte es eigentlich machbar sein, dem Tuner ein Bild zu entlocken.

PS: Eine Menge Tuner arbeiten mit I2C, recht viele haben sogar kompatible PLL-Chips (zB. SDA3302, wird von Grundig gern benutzt).
 
Georg Acher
Last Update: 2000-09-30