Hallo Technikbegeisterte, Ich hab ein Problem.Ich bau mir einen Mp3 Player aus dem Encoder VS1011 und einem Atmega128. Meine Mp3 Dateien bekomm ich von einer SD Karte nur leider scheitert es schon daran das der Sinus Test bei mir nicht funktioniert und ich glaube es ist ein schlechtes Zeichen wenn das DREQ Signal die ganze zeit auf LOW bleibt.Zu allen übel messe ich nur ein paar 100mV am RCAP Pin. Am Atmega128 nutze ich den Hardware SPI zur Steuerung des Encoders als auch der SD Karte , daraus ergibt sich folgende Verbindung am Atmega SCK ->PB1 MOSI ->PB2 MISO ->PB3 xCS ->PB4 (CS vom Vs1011) RESET ->PB5 BSYNC ->PB6 DREQ ->PB7 CS ->PA0 (CS von der SD Karte) Ich nutze den Compatibility Mode des VS1011 Mein Quarz ist ein 24.576 MHZ und er schwingt. Ich würde jetzt gerne wissen ob ich bei der Hardware irgendeinen Fehler gemacht habe und hoffe das jemand schon einige Erfahrungen mit diesem Encoder hat und mir helfen kann.Wenn mit der Hardware alles OK ist ,werde ich dann meine C-Files für den Sinus Test posten. Im Anhang befindet sich meine Schematic. Vielen dank schon im vorraus. mfg M.F.
Wow so schnell hätt ich nicht mit einer Antwort gerechnet.Besten Dank Andreas. Also hier ist der wichtigste Teil meines Codes:
1 | int main (void) |
2 | {
|
3 | |
4 | DDRB = (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB4) | (1<<PB5) | (1<<PB6); |
5 | |
6 | |
7 | |
8 | vs1011_nulls(32); |
9 | |
10 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); |
11 | |
12 | |
13 | Mp3PutInReset(); |
14 | |
15 | _delay_ms(1); // 1 mS |
16 | Mp3ReleaseFromReset(); // RESET- hi |
17 | _delay_ms(5); // 5 mS |
18 | |
19 | _delay_ms(3); |
20 | vs1011_nulls(32); |
21 | |
22 | |
23 | while(1) |
24 | {
|
25 | |
26 | vs1011_reset(); |
27 | |
28 | |
29 | Mp3SelectControl(); // Now SPI writes go to SCI port |
30 | spi(0x02); //Send SPI Byte, then wait for byte to be sent. |
31 | spi(0x00); // 0x02 was WRITE command, 0x00 is register |
32 | spi(0x08); // This byte goes to MSB |
33 | spi(0x20); // ..and this is LSB. (0x20=Allow Test Mode) |
34 | _delay_ms(100); // Wait until Atmel MCU signals SPI write |
35 | |
36 | Mp3DeselectControl(); // Now SPI writes don't go to SCI port |
37 | |
38 | |
39 | // Send a Sine Test Header to Data port
|
40 | // Now SPI writes go to SDI port
|
41 | |
42 | Spi_Mp3_Stream(0x53); // - This is a special VLSI Solution test header - |
43 | Spi_Mp3_Stream(0xef); // - that starts a sine sound. It's good for - |
44 | Spi_Mp3_Stream(0x6e); // - testing your code, the chip and also for - |
45 | Spi_Mp3_Stream(0x30); // - seeing if your MP3 decoder was manufactured - |
46 | Spi_Mp3_Stream(0x00); // - by VLSI Solution oy. |
47 | Spi_Mp3_Stream(0x00); |
48 | Spi_Mp3_Stream(0x00); |
49 | |
50 | _delay_ms(500); // 500 ms delay |
51 | |
52 | // Stop the sine test sound
|
53 | |
54 | Spi_Mp3_Stream(0x45); |
55 | Spi_Mp3_Stream(0x78); |
56 | Spi_Mp3_Stream(0x69); |
57 | Spi_Mp3_Stream(0x74); |
58 | Spi_Mp3_Stream(0x00); |
59 | Spi_Mp3_Stream(0x00); |
60 | Spi_Mp3_Stream(0x00); |
61 | Spi_Mp3_Stream(0x00); |
62 | _delay_ms(500); |
63 | }
|
64 | }
|
65 | |
66 | inline void spi(unsigned char b) |
67 | {
|
68 | |
69 | Mp3SelectData(); // byte sync hi |
70 | |
71 | SPDR = b; // send data |
72 | |
73 | Mp3DeselectData(); // byte sync lo |
74 | |
75 | // wait for data to be sent
|
76 | while(!(SPSR & (1<<SPIF))); |
77 | |
78 | }
|
79 | |
80 | void Spi_Mp3_Stream(char cData) |
81 | {
|
82 | PORTB &= ~(1<<PB6); |
83 | /* Start transmission */
|
84 | SPDR = cData; |
85 | /* Wait for transmission complete */
|
86 | while(!(SPSR & (1<<SPIF))); |
87 | PORTB |= 1<<PB6; //bsync output high |
88 | }
|
Ich hoffe das ich durch das kopieren und einfügen nichts wichtiges übersehen habe.
Hast du denn ne Ahnung ob der Reset soweit durchlaufen tut ? Hast du mal versucht einen Logikanalyser dran zu basteln und zu messen ? MISO / MOSI richtig rum angeschlossen ? Ich selber hatte keine probleme den VS1011 in Betrieb zu nehmen. CA Dirk.
Hallo Dirk, hab jetzt nochmal die gesammte Beschaltung der Hardware Spi kontrolliert und stimmt auch.Hatte mitn Oszi schon mal den MOSI + SCK Leitung kontrolliert und alle beide machen das was sie tun sollen.Ich nutze AVR Studio 4.14. Ist es normal das die DREQ Leitung die ganze Zeit auf low liegt .. ausser vielleicht ab und zu paar kleine Flanken um die 600mV??
Warum liest Du nicht einfach mal den Status des VS1011 aus? Da wird er Dir dann schon mitteilen, was ihm noch fehlt.
P.S.: Woher weisst Du eigentlich, dass "es nicht funktioniert"? Hast Du mal die Lautstärke des VS1011 aufgedreht? Vielleicht dudelt der ja schon die ganze Zeit, aber nur viel zu leise ;-)
@günny :) hab an meinen left Channel Ausgang nen Oszi hängen. Vpp um die 100mV :( mfg M.F
@ M.F. Wenn du in Register schreibst, dann kein BSYNC setzen. Was macht vs1011_reset() und vs1011_nulls()? Mit welcher Geschwindigkeit läuft dein AVR? -> _delay_ms funktioniert nur bis 262.14 ms / F_CPU. In der Codesammlung gibt es auch ein Projekt zum VS: Beitrag "Mp3 Player [mega8, SD, VS1001]"
Hallo, ich habe mir auch einen MP3 Player aufgebaut. Ist dein 24.576 mHz quarz auch ein Grundtontyp ? Mit einem 3-Oberwelle die du überall bekommst geht es nicht. Ich habe einen 14.xxx grundton genommen, und es per software am VS-Chip eingestellt.
ein fröhliches Hallo an alle und ein großes Danke für die rege Teilnahme an meinen Problem also fangen wir mal an: @Andreas ich hab zwei Befehle zur Realisierung der spi Übertragung die erste ist Spi_Mp3_Stream() in dieser Funktion setzt ich das Bsync Signal high bevor ich etwas aus dem MISO schicke und am Ende der Funktion wieder LOW. Der Zweite SPI Befehl ist spi() da wird ganz normal Daten aus MOSI geschickt Sinn und Zweck der beiden Funktionen ist ,das ich unterteile ob ich den SDI oder SCI vom VS anspreche vs1011_nulls() benutz ich um eine bestimmte Anzahl an dummy Bytes zu senden. vs1011_reset() damit mach ich einen Hard- und Software Reset. Mein Atmega128 hat einen externen Quarz von 14.7456 MHz. Ich habe diesen Tread (mp3 player,mega8) schon gefunden und darauf beruht eigentlich auch mein C-Code. Was ich vielleicht noch mit bemerken sollte ist das selbt nach einem Software Reset mein DREQ Pin keine Anstalten macht seine Flanke zu wechseln. @Gast Ich hatte davon schon gehört das es wohl mit einen Quarz 3 Oberwellen nicht funktionieren soll und hab deshalb ein großes Augenmerk darauf gelegt einen Quarz im Grundton zu bekommen. vielen dank für die Hilfe mfg M.F.
M.F. wrote: > Der Zweite SPI Befehl ist spi() > da wird ganz normal Daten aus MOSI geschickt Sinn und Zweck der beiden > Funktionen ist ,das ich unterteile ob ich den SDI oder SCI vom VS > anspreche Warum steht dann in spi() was von byte sync und data: ... Mp3SelectData(); // byte sync hi SPDR = b; // send data Mp3DeselectData(); // byte sync lo ... > vs1011_nulls() benutz ich um eine bestimmte Anzahl an dummy Bytes zu > senden. > vs1011_reset() damit mach ich einen Hard- und Software Reset. Die Funktion ist klar, aber wie hast du das umgesetzt? > Mein Atmega128 hat einen externen Quarz von 14.7456 MHz. Dann funktionieren deine Warteschleifen schon mal nicht. > Was ich vielleicht noch mit bemerken sollte ist das selbt nach einem > Software Reset mein DREQ Pin keine Anstalten macht seine Flanke zu > wechseln. Wie sieht es nach einem Hardwarereset aus? Sind vielleicht die AVR-Ports falsch gesetzt?
@Andreas Ich bin jetzt leider Daheim .Ich kann dir deshalb erst morgen antworten und mit der Spi() Funktion haste recht sollte dann wohl eher sein xCS am anfang auf LOW und nach Übertragung auf HIGH. Besten Dank und noch einen schönen Abend. mfg M.F.
Hallo alle miteinander, so hab heut morgen mal meinen kompletten Code verworfen.Ich fand ihn zu unübersichtlich und hab da ind em Forum noch den Link zu Michael Wolfs MP3stick gefunden und hab den Code mal fix meinen bedürfnissen angepasst. Ergebnis: Sowohl bei Hard als auch Software Reset bleibt mein uC an der Zeile
1 | while (!(VS_DREQ_INP & _BV (VS_DREQ))); |
hängen. bedeutet das mein VS einfach kein DREQ Signal schicken möchte :( ich bin bald der Meinung mein VS ist kaputt... Naja vielleicht fällt euch ja noch was ein.. ich seh schon bald den Wald vor lauter Bäumen nicht mehr. im Anhang hab ich den veränderten Code mfg M.F.
Soll der 1011 nicht mit 12MHz getaktet werden? Der verdoppelt doch intern auf die 24MHz. MW
Hier sind einige Stolperfallen genannt: Beitrag "Sinustest des vs1011" Ich dacht auch erst, der Chip ist kaputt.. Kannst Du denn ein Register beschreiben und auch diesen Wert wieder auslesen? laß doch erstmal die SD-Karte weg..
Ja, zu mindestens der VS1011e, siehe S.9 zu lesen min., optimal, max. Input Clock Frequency XTALI 24 24.576 26 MHz Input Clock Frequency, with clock doubler XTALI 12 12.288 13 MHz
Ich nutze als externe Quarz einen 24.576 MHz. also brauch ich kein clock doubler und Register beschreiben und lesen scheint auch nicht zu funktionieren. mfg M.F.
versuche mal den "Share" Mode und ohne SD-Karte, evtl. hast Du eine Leitung verkehrt rum angesteuert / verstanden. Lies den o.g. Thread nochmal uns stelle sicher, daß Du keinen der genannten Fehler gemacht hast. Register schreiben und wieder korrekt lesen kommt noch vor Sinustest..
@ M.F. Hast du überhaupt den Code von Michael an deine Hardware angepasst? Im ersten Post hast du geschrieben, dass der VS an PORTB hängt. In dem geposteten Code ist das aber nicht der Fall.
@Andreas als ich den Code von Michael genommen hab ich mich an die Pin Belegung von Michael gehalten. werde morgen noch mal GANZ gründlich über die Sache drüber schaun und hoffe doch noch den kleinen Bug zu finden xD.
Hallo, selbst nach 2 Tagen gründlicher Prüfung bin ich keinen Schritt weiter.Ich hab sogar den VS1011 ausgetauscht ohne Erfolg.Register lesen und schreiben funktioniert bei mir nicht.ich bekomm an meinen MISO kein Signal was man auswerten könnte.Sowohl mein DREQ Pin und mein RCAP Pin sind die ganze Zeit um den Bereich 100mV.Hab echt keine Ahnung was ich noch tun sollte. mfg M.F.
Mir ist gerade aufgefallen, dass im Schaltplan SData mit SI und DClk mit SClk verbunden ist. Das darf nicht sein. Im VS-Symbol fehlen auch Pins: * GBuf * AVdd hat 3 Pins * AGnd hat 4 Pins * DGnd hat 5 Pins
@Andreas ich nutz doch den vs1011 im Compatibility Mode da brauch ich doch DCLK und SData, wie hätte ich sie den sonst beschalten sollen? Ich nutz den Soic-28 da hab ich kein GBuf pin. danke für deine Hilfe mfg M.F.
M.F. wrote: > ich nutz doch den vs1011 im Compatibility Mode da brauch ich doch DCLK > und SData, wie hätte ich sie den sonst beschalten sollen? Ja stimmt. Im Comp-Modus ist das so - hatte ich verwechselt. > Ich nutz den Soic-28 da hab ich kein GBuf pin. Achso. Der Resetpin geht auch ganz sicher auf high? Dann müsste DREQ auch auf high gehen und an RCAP müssten um die 1V liegen. Vielleicht sind noch irgenwo Pins vertauscht oder die Fusebits falsch gesetzt (M103C Comp-Modus)...
Hallo, wenn Du Lust hast, kann ich Dir meinen Code vom Vs1002 anpassen und Dir geben (ist allerdings in ASM). Der läuft auf jeden Fall. Falls Interesse besteht, überprüfe bitte nochmal deine gepostete Schaltung und obengenannte Pinbelegung. SCK ->PB1 MOSI ->PB2 MISO ->PB3 xCS ->PB4 (CS vom Vs1011) RESET ->PB5 BSYNC ->PB6 DREQ ->PB7 CS ->PA0 (CS von der SD Karte) Weil der Schaltplan nit mit deiner Pinbelegung übereinstimmt (gehe mal davon aus das nicht Du den gemacht hast). Wenn Du bestätigen kannst, das die Pinbelegung OK ist, passe ich Dir gerne meinen Code an und brauchst ihn nur noch zu flashen. GRUSS
Achso, funktioniert denn die Kommunikation mit der SD-Karte? Falls nein wird der Fehler wohl schon in deinem SPI-Code zu suchen oder an deinem Pegelwandler zu finden sein. Ausserdem wie schnell ist dein SPI Takt mit dem VS1011? Der verträgt nur max. 6Mhz, die SD-Karte deutlich mehr. Gruss
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.