www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SI4701 Datenblatt, Applikation Notes


Autor: Stampede (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: an leitung (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hoffe das reicht dir.

Autor: an leitung (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und noch ne Beispielhardware.

Autor: Stampede (Gast)
Datum:

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

Gruß
Stampede

Autor: Stampede (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Otto (tarzanwiejane)
Datum:

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

cu Tarzanwiejane

Autor: Daniel P. (ppowers)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stampede (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stampede (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schnitzler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie habt ihr den Chip eigentlich gelötet bekommen?

Autor: Schnitzler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stampede (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#pragma udata
unsigned char SI470xdata[31];        // Commandopacket für SI4701

//
#pragma code
/******************************************************************************
 * Function:        void InitSI470x(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Enables the SI470x
 *
 * Note:            None
 *****************************************************************************/
void SI470xInit(void)
{
  SSP2CON1bits.SSPEN = 0;      // I2C for startup as IO
  TRISDbits.TRISD5 = 0;      // output
  TRISDbits.TRISD6 = 0;      // output
  TRISBbits.TRISB4 = 0;      // output
  LATDbits.LATD5 = 0;        // 
  LATDbits.LATD6 = 0;  
  LATBbits.LATB4 = 0;        // SI4701 reset, GPIO3 automatically low by internal pulldown
    Delay1KTCYx(10);
  LATBbits.LATB4 = 1;        // SI4701 start, wait for Powerup        
    Delay1KTCYx(10);      // SDO MUST BE LOW DURING THIS PERIOD
  TRISDbits.TRISD5 = 1;      // input again
  TRISDbits.TRISD6 = 1;      // input again
  T1CON = 0x4B;          // T1 OSC, OSC EN, start reference clock          
  I2CStart();
  I2CTransmit(SI470x_write);
  I2CAckTx();
  I2CTransmit(0x40);        // See AN230  
  I2CAckTx();
  I2CTransmit(0x01);        // Reg 0x2: Enable, demute  
  I2CAckTx();
  I2CStop();
  Delay10KTCYx(132);        // wait 110ms until powerup is complete
  SI470xClearData();
    // Init Array with correct values
    SI470xdata[Powercfg_h] = SI47_DMUTE;
    SI470xdata[Powercfg_l] = SI47_ENABLE;
    SI470xdata[Channel_h] = !SI47_TUNE;
    SI470xdata[Sysconfig1_h] = SI47_RDS | SI47_DE;
    SI470xdata[Sysconfig1_l] = SI47_BLNDADJ_DEF | SI47_GPIO3_HI | SI47_GPIO2_LO | SI47_GPIO1_HI;
    SI470xdata[Sysconfig2_h] = SI47_SEEKTH;
    SI470xdata[Sysconfig2_l] = SI47_BAND_USA_EUR | SI47_SPACE_100KHZ | SI47_VOLUME;
    SI470xdata[Sysconfig3_h] = SI47_SMUTER_FASTEST | SI47_SMUTEA_16DB;
    SI470xdata[Sysconfig3_l] = SI47_SKSNR | SI47_SKCNT;
  SI470xSend();
  Delay1TCY();
  SI470xRead();          // Status, IDs, etc
}

/******************************************************************************
 * Function:        void SendSI470x(void)
 *
 * PreCondition:    Arry with Command is properly initialised
 *
 * Input:           Array SI470xdata with commands
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Send packet of commands to SI470x
 *
 * Note:            None
 *****************************************************************************/
void SI470xSend(void)
{
  unsigned char i;
  I2CStart();
  I2CTransmit(SI470x_write);
  I2CAckTx();
  for (i=0; i < 10; i++)
  {
  I2CTransmit(SI470xdata[Powercfg_h+i]);      // 
  I2CAckTx();                    //
  }
  I2CStop();
}

/******************************************************************************
 * Function:        void ReadSI470x(void)
 *
 * PreCondition:    None
 *
 * Input:           Array SI470xdata will be updated with read-only values
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Read From
 *
 * Note:            None
 *****************************************************************************/
void SI470xRead(void)
{
  unsigned char i;
  I2CStart();
  I2CTransmit(SI470x_read);
  I2CAckTx();
  for(i=0; i<12; i++)
    {
      SI470xdata[i+StatusRSSI_h] = I2CReceive();    // read beginns on register 10
      I2CAckRx();
    }
  for(i=0; i<4; i++)                    // Array is only 32Byte
    {                          // To wrap araound, new read cycle is needed
      SI470xdata[i] = I2CReceive();
      I2CAckRx();
    }
  I2CReceive();      //dummyread without Ack to end transmission
  I2CNAckRx();
  I2CStop();  
}

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

Autor: Greindl (Gast)
Datum:

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

Autor: Zwirbeljupp (Gast)
Datum:

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

Autor: Greindl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.