Forum: Mikrocontroller und Digitale Elektronik SI4701 Datenblatt, Applikation Notes


von Stampede (Gast)


Lesenswert?

Hallo,

hat irgendjemand hier im Forum schon mal den SI4700, SI4701 oder SI47xx 
zum Laufen gebracht? Ich habe zwar ein Datenblatt, da steht aber nichts 
über das Kommunikationsprotokoll drin, und dazu brauche ich dringend 
Informationen. Ich versuche gerade über so eine Firmware von Silab den 
Code rauszubekommen, leider nutzen die da aber SPI, und nicht I2C, was 
ich für meine Applikation benötige. Falls jemand also mir noch 
zusätzlich Informationen geben kann, wäre ich sehr dankbar, denn über 
google findet man kaum was brauchbares.

Mail: picplayer ät googlemail (dot) com

Gruß

Stampede

von an leitung (Gast)


Angehängte Dateien:

Lesenswert?

Hoffe das reicht dir.

von an leitung (Gast)


Angehängte Dateien:

Lesenswert?

und noch ne Beispielhardware.

von Stampede (Gast)


Lesenswert?

Vielen vielen Dank! Wenn du noch mehr Dokumente hast schick sie mir 
bitte per Mail (s.o.) zu!

Gruß
Stampede

von Stampede (Gast)


Lesenswert?

Also irgendwie steige ich da nicht ganz durch wie diese I2C mit dem 
SI4701 lufen soll. Normalerweise gibt man ja das Register das man 
beschreiben möchte an. Hier heißt es jedoch:

"For write operations, the control word and device acknowledge is 
followed by an eight bit data word latched
internally on rising edges of SCLK. The device always acknowledges the 
data by setting SDIO low on the next
falling SCLK edge. Any number of data bytes may be written and register 
addresses are incremented by an
internal address counter, starting with the upper byte of register 02h, 
followed by the lower byte of register 02h, and
wrapping back to 00h at the end of the register file."

"For read operations, the control word and device acknowledge is 
followed by an eight bit data word shifted out on
falling SCLK edges. The controller IC returns an acknowledge if 
additional data will be transferred. Any number of
data bytes can be read and register addresses are incremented by an 
internal address counter, starting at the
upper byte of register 0Ah, followed by the lower byte of register 0Ah, 
and wrapping back to 00h at the end of the
register file. The transfer ends with the STOP conditions regardless of 
the state of the acknowledge."

Ich beginne nun Register 0x02 mit 0x4001 wie im datenblatt vorgeschlagen 
zu beschreiben. Dann muss ich 110ms warten. Da stellt sich mir die 
Frage, ob ich erst das I2C wieder deaktivieren muss? (ich mache das 
nicht). Komischerweise macht das Teil aber gar nicht, noch nicht mal die 
GPIO1..3 gehen auf high, wie es ihm vorgeschrieben habe...

Wenn ich das richtig verstehe, startet jeder Schreibvorgang bei Register 
0x2, und dann sollen die Folgeregister beschrieben werden. Lustigerweise 
sind die letzten 4 Regiser "reserved", und dazu steht: "Any register not 
listed is reserved and should not be written. Writing to reserved 
registers may result in unpredictable behavior." Wie soll der 
Wrap-around denn jemals funktionieren, wenn man da nicht reinschreiben 
darf? Man braucht ihn zar auch nie, da Reg0x0 und Reg0x1 Read-Only sind, 
trotzdem ist das irgendwie blöd gemacht.
Wenn also jemand noch Erfahrungen mit dem Teil hat bitte posten!

Gruß

Stampede

von Thomas O. (tarzanwiejane)


Lesenswert?

@stampede
ich kriege meinen chip erst in ein paar wochen, dann probier ich es mal.

cu Tarzanwiejane

von Daniel P. (ppowers)


Lesenswert?

Kennst Du den hier schon?
http://terraelectronica.ru/files/news/si4700-B15rev1_0.pdf
Ist zwar eigentlich für den Si4700, aber der Si4701 wird dort auch 
erwähnt. Dieser Datasheet enthält eine vollständige Erklärung der 
Register.

Viel Erfolg!

gruß
daniel

von Stampede (Gast)


Lesenswert?

Ich werd wahnsinnig!!! Diesem Scheisschip ist einfach nichts zu 
entlocken. Das I2C schmiert schon nach dem Schreiben ab. Weiß einer 
woran das liegen könnte?

von Stampede (Gast)


Lesenswert?

Ich empfange! Es lag nicht am SI4701, sondern an einem Hardwarebug des 
MSSP Modul (sendet einfach keine Stop Condidion). Habe I2C nun in 
Software implementiert und ich Kiste läuft :)

von Jörg (Gast)


Lesenswert?

Hallo,
wo habt ihr den SI4701 geordert? Bei Digikey gibt's den. Is mir für 
einen Chip aber zu teuer.
Gruß Jörg

von Schnitzler (Gast)


Lesenswert?

Hallo Stampede,

ich steh derzeit vor dem gleichen Problem wie du damals, ich bekomm das 
ding mit I2C einfach nicht zum laufen.
Der Ablauf meines Programms entspricht genau dem wie es im Datasheet 
spezifiziert is, aber ohne Erfolg.

Kannst du mal die Codesequenz für den Powerup liebenswerter Weise preis 
geben?
bzw was für Probleme hattest du noch mit dem Ding und wie hast du sie 
behoben?


Gruß der Schnitzler

von Jupp (Gast)


Lesenswert?

Wie habt ihr den Chip eigentlich gelötet bekommen?

von Schnitzler (Gast)


Lesenswert?

* also erstmal viel Flussmittel aus so nem Flussmittelstift
* Lötpaste aus so ner Spritzendingsda
* Chip platzieren
* Heißluftfön von unten Platine vorerhitzt
* Heißluftfön von oben bis Lötpaste zu Lötzinn wird

mehr nicht :) geht aber auch mit Lötkolben, sollte allerdings ne 
ziemlich gute kleine Spitze haben. Aber des mit dem Heißluftfön ging 
gut. Du kannst natürlich auch so nen selbstbau Reflowofen verwenden.

von Stampede (Gast)


Lesenswert?

Hallo,

um I2C zu nutzen, muss das Interface korrekt eingestellt sein. Im alten 
Modus bedeutet das, dass die GPIO1..3 auf low liegen (bzw. floating), 
SEN high,  und während des Resets muss SDIO auf low liegen. Alternativ 
kann man I2C auch einstellen, indem GPIO3 auf high liegt, und während 
des Resets GPIO1 auf high gezogen wird.
Wird diese Abfolge eingehalten, funktioniert das I2C Interface des Chips 
ohne Probleme.
1
#pragma udata
2
unsigned char SI470xdata[31];        // Commandopacket für SI4701
3
4
//
5
#pragma code
6
/******************************************************************************
7
 * Function:        void InitSI470x(void)
8
 *
9
 * PreCondition:    None
10
 *
11
 * Input:           None
12
 *
13
 * Output:          None
14
 *
15
 * Side Effects:    None
16
 *
17
 * Overview:        Enables the SI470x
18
 *
19
 * Note:            None
20
 *****************************************************************************/
21
void SI470xInit(void)
22
{
23
  SSP2CON1bits.SSPEN = 0;      // I2C for startup as IO
24
  TRISDbits.TRISD5 = 0;      // output
25
  TRISDbits.TRISD6 = 0;      // output
26
  TRISBbits.TRISB4 = 0;      // output
27
  LATDbits.LATD5 = 0;        // 
28
  LATDbits.LATD6 = 0;  
29
  LATBbits.LATB4 = 0;        // SI4701 reset, GPIO3 automatically low by internal pulldown
30
    Delay1KTCYx(10);
31
  LATBbits.LATB4 = 1;        // SI4701 start, wait for Powerup        
32
    Delay1KTCYx(10);      // SDO MUST BE LOW DURING THIS PERIOD
33
  TRISDbits.TRISD5 = 1;      // input again
34
  TRISDbits.TRISD6 = 1;      // input again
35
  T1CON = 0x4B;          // T1 OSC, OSC EN, start reference clock          
36
  I2CStart();
37
  I2CTransmit(SI470x_write);
38
  I2CAckTx();
39
  I2CTransmit(0x40);        // See AN230  
40
  I2CAckTx();
41
  I2CTransmit(0x01);        // Reg 0x2: Enable, demute  
42
  I2CAckTx();
43
  I2CStop();
44
  Delay10KTCYx(132);        // wait 110ms until powerup is complete
45
  SI470xClearData();
46
    // Init Array with correct values
47
    SI470xdata[Powercfg_h] = SI47_DMUTE;
48
    SI470xdata[Powercfg_l] = SI47_ENABLE;
49
    SI470xdata[Channel_h] = !SI47_TUNE;
50
    SI470xdata[Sysconfig1_h] = SI47_RDS | SI47_DE;
51
    SI470xdata[Sysconfig1_l] = SI47_BLNDADJ_DEF | SI47_GPIO3_HI | SI47_GPIO2_LO | SI47_GPIO1_HI;
52
    SI470xdata[Sysconfig2_h] = SI47_SEEKTH;
53
    SI470xdata[Sysconfig2_l] = SI47_BAND_USA_EUR | SI47_SPACE_100KHZ | SI47_VOLUME;
54
    SI470xdata[Sysconfig3_h] = SI47_SMUTER_FASTEST | SI47_SMUTEA_16DB;
55
    SI470xdata[Sysconfig3_l] = SI47_SKSNR | SI47_SKCNT;
56
  SI470xSend();
57
  Delay1TCY();
58
  SI470xRead();          // Status, IDs, etc
59
}
60
61
/******************************************************************************
62
 * Function:        void SendSI470x(void)
63
 *
64
 * PreCondition:    Arry with Command is properly initialised
65
 *
66
 * Input:           Array SI470xdata with commands
67
 *
68
 * Output:          None
69
 *
70
 * Side Effects:    None
71
 *
72
 * Overview:        Send packet of commands to SI470x
73
 *
74
 * Note:            None
75
 *****************************************************************************/
76
void SI470xSend(void)
77
{
78
  unsigned char i;
79
  I2CStart();
80
  I2CTransmit(SI470x_write);
81
  I2CAckTx();
82
  for (i=0; i < 10; i++)
83
  {
84
  I2CTransmit(SI470xdata[Powercfg_h+i]);      // 
85
  I2CAckTx();                    //
86
  }
87
  I2CStop();
88
}
89
90
/******************************************************************************
91
 * Function:        void ReadSI470x(void)
92
 *
93
 * PreCondition:    None
94
 *
95
 * Input:           Array SI470xdata will be updated with read-only values
96
 *
97
 * Output:          None
98
 *
99
 * Side Effects:    None
100
 *
101
 * Overview:        Read From
102
 *
103
 * Note:            None
104
 *****************************************************************************/
105
void SI470xRead(void)
106
{
107
  unsigned char i;
108
  I2CStart();
109
  I2CTransmit(SI470x_read);
110
  I2CAckTx();
111
  for(i=0; i<12; i++)
112
    {
113
      SI470xdata[i+StatusRSSI_h] = I2CReceive();    // read beginns on register 10
114
      I2CAckRx();
115
    }
116
  for(i=0; i<4; i++)                    // Array is only 32Byte
117
    {                          // To wrap araound, new read cycle is needed
118
      SI470xdata[i] = I2CReceive();
119
      I2CAckRx();
120
    }
121
  I2CReceive();      //dummyread without Ack to end transmission
122
  I2CNAckRx();
123
  I2CStop();  
124
}

Löten des Chips ist eingentlich nicht so schwierig, man braucht nur eine 
möglichst dünne Spitze (ich habe 0.4mm benutzt).
Ich habe 2 Methoden getestet:
1.Löten mit Heißluft, Lötpaste und Infrarotlampe von unten. Klappt sehr 
gut.
2.Rein mit dem Lötkolben, mit Lötpaste durch ein Via von unten. Durch 
das seitlich Verlöten der Pads ist diese Methode nix für zittrige Hände, 
führt aber auch zum Erfolg.

Gruß
Stampede

von Greindl (Gast)


Lesenswert?

Welche Beschaltung verwendet ihr für die Antenne?
Hat jemand von euch die Application note "AN231: Si4700/1 Headphone and 
Antenna Interface"?

von Zwirbeljupp (Gast)


Lesenswert?

Beim Antenneninterface solltest Du Dich an das Referenzdesigns des 
USB-Radios halten. Die AN231 ist nicht wirklich eine Hilfe.

von Greindl (Gast)


Lesenswert?

Danke

Weißt du wie wichtig dabei das RCL-Glied ist?
Wie wichtig ist die Länge der Antenne? bzw kann man die Antenne als 
Leiterschleife realisieren?
Oder sollte man  lieber einen si4704/5 mit interner Antenne verwenden?

von Gast (Gast)


Lesenswert?

Hallo

Ich verwende ebenfalls den I2C-Bus um auf meinen si4703 zuzugreifen.
Für die auswahl des I2C-modus verwende ich den Busselectmode 2. Dazu 
lege ich die GPIO Pin 1 und 3 mit einen 100kohm Pull-up auf Vcc.
VD, VA und Vio lege ich ebenfalls fix auf Vcc (=3.3V)
Als Clock verwende ich eine Oszilator der bereits eine fertiges 
Clocksignal mit 32.768kHz liefert.
Zu Beginn halte ich den Chip im Reset, damit sich die Versorgung 
stabiliseren und sich der Oszilator einschwingen kann.
Die SClk-Leitung halte ich bis zur ersten Startbedingung auf high.
Ich kann auf alle Register schreiben und lesen.

Jedoch wenn ich das ENABLE-Bit setze bleibt auch nach 110ms das 
FIRMWARE-Bits im ChipId Register 0.

Also außer das Lesen/Schreiben der Register funktionier nichts.

Ich weiss nicht mehr was ich noch falsch machen könnte.
Hat jemand eine Idee oder hatte irgendwer ähnliche Problem?

von Peter (Gast)


Lesenswert?

Hi,

waere es moeglich den Source code zu bekommen oder ueber Source Forge 
als Projekt mit einem Schalt/Loetplan zu bekommen? Wuerde gerne 
ausprobieren wie es geht und dann weitere Sachen darauf basierend 
entwickeln.

Gruesse,

Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.