Forum: Mikrocontroller und Digitale Elektronik VS1011+Atmega128 = Probleme


von M.F. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Die Hardware sieht OK aus. Poste mal deinen Test-Code.

von M.F. (Gast)


Lesenswert?

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.

von Dirk B. (sharandac)


Lesenswert?

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.

von M.F. (Gast)


Lesenswert?

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??

von günny (Gast)


Lesenswert?

Warum liest Du nicht einfach mal den Status des VS1011 aus? Da wird er 
Dir dann schon mitteilen, was ihm noch fehlt.

von günny (Gast)


Lesenswert?

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 ;-)

von M.F. (Gast)


Lesenswert?

@günny
:) hab an meinen left Channel Ausgang nen Oszi hängen. Vpp um die 100mV 
:(

mfg M.F

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

@ 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]"

von Gast (Gast)


Lesenswert?

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.

von M.F. (Gast)


Lesenswert?

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.

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

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?

von M.F. (Gast)


Lesenswert?

@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.

von M.F. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Michael Wilhelm (Gast)


Lesenswert?

Soll der 1011 nicht mit 12MHz getaktet werden? Der verdoppelt doch 
intern auf die 24MHz.

MW

von naja (Gast)


Lesenswert?

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..

von Thomas (Gast)


Lesenswert?

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

von M.F. (Gast)


Lesenswert?

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.

von naja (Gast)


Lesenswert?

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..

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

@ 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.

von M.F. (Gast)


Lesenswert?

@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.

von M.F. (Gast)


Lesenswert?

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.

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

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

von M.F. (Gast)


Lesenswert?

@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.

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

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)...

von fubu1000 (Gast)


Lesenswert?

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

von fubu1000 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.