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
Vielen vielen Dank! Wenn du noch mehr Dokumente hast schick sie mir bitte per Mail (s.o.) zu! Gruß Stampede
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
@stampede ich kriege meinen chip erst in ein paar wochen, dann probier ich es mal. cu Tarzanwiejane
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
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?
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 :)
Hallo, wo habt ihr den SI4701 geordert? Bei Digikey gibt's den. Is mir für einen Chip aber zu teuer. Gruß Jörg
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
* 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.
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
Welche Beschaltung verwendet ihr für die Antenne? Hat jemand von euch die Application note "AN231: Si4700/1 Headphone and Antenna Interface"?
Beim Antenneninterface solltest Du Dich an das Referenzdesigns des USB-Radios halten. Die AN231 ist nicht wirklich eine Hilfe.
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?
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.