VS1011+Atmega128 = Probleme

Gast #905045
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.
Angehängte Dateien:
Gast #905113
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.
Gast #905169
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??
Gast #905215
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.
Gast #905269
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.
Persönliche Seite #905287
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?
Gast #905298
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.
Gast #906035
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.
Angehängte Dateien:
Gast #906183
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..
Gast #906438
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.
Gast #908233
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.
Gast #908934
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.
Persönliche Seite #909812
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)...
Gast #909953
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
Gast #909958
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren