Hallo allerseits,
ich weiß, dass der altbekannte VS1011er hier schon x-Fach
durchdiskutiert wurde, habe aber bisher keine einzige passende Antwort
bzw. Lösung für meine Probleme gefunden...
Problem Nr.1:
Die Initialisierung scheint nicht immer richtig zu klappen... Ich muss
mein Board mehrfach ein und ausschalten, biss beispielsweise der
Sinustest klappt. Desweiteren klickt der VS beim ersten einschalten ein
wenig dumpf. beim wiederholten einschalten ist es ein "besseres"
knacken. (klingt doof, ich weiß ^^). Also fast so, als wären
irgendwelche Elkos noch nicht geladen... Aber auch mit nem riesigen
Delay vor der ersten init. knackt es iwie dumpf... Hier mein init-code:
void VS1011_HardReset(void)
{
XCS=1; XDCS=0;
Delay_ms(50);
do {
VS_R=0;
VS_R_In();
Delay_ms(1);
VS_R=1;
VS_R_Out();
VS_R=1;
Delay_ms(20);
XDCS=1; //laut App.Note ist ein lo-hi wechsel nötig
XDCS=1;
Delay_ms(1);
while(!DREQ);
VS1011_Null(32);
VS1011_Write(0x00,0x00,0x04);
Delay_ms(1);
// while(!DREQ);
}while(!DREQ);
VS1011_Write(0x00,0x08,0x00);
while(!DREQ);
VS1011_Write(0x0B,0x20,0x20);
while(!DREQ);
// Delay_ms(200);
}
Problem Nr.2:
Bei der Wiedergabe einer MP3 gibt es je nach Bitrate bestimmte
Aussetzer: Bei kleiner Bitrate setzt der Song aus und springt
Stückweise... Bei hoher Bitrate setzt es ebenfalls aus und es wird in
die länge gezogen.
Den Effekt mit der hohen Bitrate kann ich mir erklären: Mit 1,5Mhz
SPI-Takt kommen schlicht und ergreifend zu wenig Daten pro Sekunde an.
Aber das mit der niedrigen ist seltsam... Es wirkt als würde ich Dreq
nicht handlen, aber genau das tue ich. Anbei der Code:
void VS1011_WriteBlock(void)
{
unsigned int i=0;
XDCS=0;
for(i=0;i<512;i++) {
VS1011_MP3Data(SD_Data[i]); //SD_Data ist das globale Array mit
den Daten von der SD-Karte
if((i % 32)==0) {
while(DREQ==0) {
Nop();
}
}
}
XDCS=1;
}
Ich bin für jeden Tipp und jede Hilfe sehr dankbar!
mfg guest ;-)
Zu 1.) Das ist normal, weil die Elkos schlagartig geladen werden.
Deswegen gibt es in der Application Note von VLSI die Schaltung im
Anhang, um das ploppen zu verhindern.
Zu 2.)Ich wette deine Register Einstellungen vom Takt sind falsch.
Deswegen mit was für einem Takt läuft dein VLSI (nur wenn du nen
24,576Mhz Quarz dran hast brauchste nit einstellen).
Aso und ich hoffe das deine Funktion vier Bytes schickt
("VS1011_Write(0x0B,0x20,0x20);") --> 0x02 , 0x0B , 0x20 , 0x20.
Hallo,
1:
das ploppen an sich ist nicht das Problem. Seltsam ist nur, dass wenn
das "dumpfe" knacken kommt, der VS dann definitiv nicht funktioniert. Er
läuft nur, und auch dann nur manchmal, wenn dieses helle knacksen kommt.
2:
Ich wette dagegen ;-) ich hab nämlich genau den 24,576 MHz Quarz ^^ Ich
hab das Datasheet eig recht gut studiert...
3:
Jop, in meiner Funktion ist das Byte 0x02 fest implementiert...
Vielen Dank für die Hilfe.
Allerdings bleiben die Probleme ja noch offen... ich kanns mir nicht
wirklich erklären... ich warte ganz regulär auf DREQ und trotzdem
springt die mp3 mit niedriger bitrate... bei 128kbit/s ist es fast
super... es wird weder zu langsam gespielt, noch springt er extrem...
aber die kleinen sprünge nerven trotzdem und Sinn der Sache ist es ja
auch nicht...
gruß guest
@Fabian Ostner
werds gleich ausprobieren
@Bit-Pfriemler
das scheint mir nicht so ganz das gelbe vom Ei ;-) ich arbeite lieber an
meinen Problemchen ^^
gruß guest
@Fabian Ostner
hat leider keinen erfolg gebracht... Ich denke das init-problem kann ich
vlt dadurch umgehen, dass ich nach der initialisierung ein register
beschreibe und dies dann nochmal vergleichen lasse. bei fehler wird
nochmal initialisiert...
das mp3-problem besteht weiterhin....
gruß guest
Deswegen gebe ich ja den return-Wert zurück in meiner Funktion ! Es wird
solange die Funktion aufgerufen , bis return-Wert = 1 ist.
Zu deinem Wiedergabe Problem: Ist denn der VLSI genau so beschaltet wie
im datasheet Seite 16 ! Also alle GPIO's mit 100K auf Masse und der
Test-Pin auf VCC ?
Gruß
hallo,
jop, die beschaltung stimmt. ich kanns mir langsam echt nicht mehr
erklären...
zu dem anderen problem: kann denn DREQ nach 5ms nach reset überhaupt
schon 1 sein? war da nicht was mit 50000 cycles?
Hallo,
50000 cycles bei 24,576Mhz = 2,03ms
Haste noch nen anderen VLSI da, nur um auszuschliessen daß das Ding putt
ist.
Bzw. Schaltung noch mal komplett überprüfen nach schlechten Lötstellen
etc.
Gruß
Hallo,
die Schaltung habe ich bereits mehrfach geprüft. Nen zweiten VS1011 habe
ich leider nicht... Wäre aber wirklich ärgerlich, wenn er die Probleme
verursachen würde...
Ich werde morgen nochmal nach der Init schauen... Dann wäre ich
zumindest ein Stückchen weiter...
gruß guest
Guten Morgen
Jop, ist ein Grundtonquarz. Ich hatte in der Tat erst einen blöden
Obertonquarz von Reichelt drin... Den Grundtonquarz habe ich dann bei
Conrad gekauft und getauscht.
gruß guest
Hi sry das ich so OT dazwischenfrage aber ich wollte mir auch in ner
woche von Reichelt die Bauteile für mein MP3-Player Projekt holen nur
seh ich grade das es den Quarz dort nicht gibt wie Fabian oben schon
erwähnte gibts da nur den 3ten Oberton als Quarz. Kann man einen anderen
bei R. nehmen so das es geht oder geht es nur mit einem genauen 24,576
Grundton ? Wollte eigendlich nicht wegen einem Quarz noch bei nem
anderen Versender bestellen wenn ich den gesammten rest bei R. bekomme.
Was mir zum Thema noch einfällt ist die Versorgung gut gepuffert? Die
Ganzen Kondis ziehen ja am anfang ziemlich Strom und da könnte deine
Spannung absacken, wodurch es zu netten Fehler beim init kommen kann.
Notfalls lass dem Chip doch einfach etwas Zeit nach dem Einschalten so
10 ms z.b. oder mach 2 inits also init reset init. Dann sollten alle C´s
schon geladen sein und fehler bei der 2ten init dürften dann nicht
auftreten. Das ist jetzt nur ne idee ^^.
Grüße ErgoProxy
Hallo,
im Anhang die beiden Files. zum Thema Schaltplan fällt mir ne
Zwischenfrage ein: wo gibts bei Eagle die GND und VDD Signal-Verbinder?
Da würde meiner nämlich erheblich übersichtlicher werden ;-)
gruß gast
Hallo,
ich weiss gar nicht wo ich anfangen soll !!!
Also dein Schaltplan ist schon mal Mist ! Ich frag einfach nochmal nach,
ist der VLSI so verschaltet wie im Datasheet auf Seite 15.
1.) alle GPIO's mit 100K gegen Masse und TestPin auf VCC ?
2.) Pulldown am Reset Eingang ? RX auf VCC mit 100K ?
3.) 1 MegaOhm parallel zum Quarz ?
4.) RCAP mit 100nF gegen Masse ?
5.) Spannungsversorgungen sauber ?
So nun zum Code:
Erstmal eine Frage vorne weg. Du benutzt ja kein FAT , woher weisst Du
das die Daten alle Sektor auf Sektor folgen ?
1.) Übernimm bitte 1:1 meine Reset Routine, deine ist ....
2.) in deiner Softreset Funktion setzt du den PIN SM_TESTS , ganz
schlecht
3.) Und schließlich das aller schlimmste. Bei SD_readblock benutzt du
die Funktion SD_writecmd , in der der Chipselect auf NULL gesetzt und
anschliessend wieder auf EINS, ganz schlecht, da du den Chipselect
mitten in der ReadRoutine aus machst. Kann also zu fehlern führen !
So das wars erstmal und genug für dich zu tun.
Gruß
Hallo,
der Schaltplan ist mies, das muss ich zugeben. Ich hab seitdem auch
etliche Verbsserungen vorgenommen:
A2) Pulldown hab ich. RX PullUp -> Welches RX? da hab ich nix im
Datasheet gesehen...
A3) Hab ich
A4) Hab ich
A5) Ich versorge das Ding mit einem Spannungswandler IC von TI. Die
SPannung ist auch bei exakt 3.3V
Zum Thema Sektor: Ich habe die Daten mit r-linux direkt auf den ersten
Sektor geschrieben. Sollte zumindest eine Testlösung sein.
B1) Werd ich, sobald ich kann... Hoffe in den nächsten paar Tagen Zeit
zu haben... Meine Routine besteht aus etlichen Versuchen, zum Teil
zusammengewürfelt ^^
B2) Ja, das war noch, als ich die Sinus-Tests implementiert hatte...
Wird aber z.Z. sowieso nicht aufgerufen, wird aber geändert.
B3) Werde auch das Ausprobieren, aber im Großen und Ganzen scheint es
nicht am SPI-Transfer zu liegen, aber natürlich prüf ich das.
Vielen Dank auf jeden Fall, für die Arbeit, die du dir gemacht hast
thumbs up ^^
gruß gast
Im Schaltplan sind einige AVDDx und DVDDx nicht angeschlossen.
Ich hoffe doch das sie bei dir angeschlossen sind.
Die Pins hat der Hersteller nicht ohne Grund aus dem
Gehäuse geführt.
Hallo,
hier die Ergebnisse:
1) Deine Init hat leider kein erfolg gebracht... Hier meine Umsetzung:
void VS1011_HardReset(void)
{
uchar i=0;
do {
VS_R=1;
VS_R_Out();
Delay_ms(1);
VS_R=0;
VS_R_In();
Delay_ms(7);
VS_R=1;
VS_R_Out();
Delay_ms(5);
} while(DREQ==0);
VS1011_SoftReset();
}
2) Das mit dem ReadBlock habe ich umgesetzt. Es scheint sich etwas
geändert zu haben, bin mir aber nicht sicher... Insgesamt allerdings
immernoch das selbe Problem -.-
gruß Gast
@Gast: Aso RX gibts beim VS1011 gar nit, mein Fehler.
Wie sieht es denn mit dem Sinustest aus ? MAch den mal ohne dein
VS1011_StopSine Funktion. Dann sollte ein Pfiepen zu hören sein.
Wenn das auch aussetzt, ist es ein Hardware Fehler, ansonsten iss was is
deiner Software. Wenn Sinustest klappt, poste deinen neuen
vollständingen Code. Andernfalls den Schaltplan.
@Tobias: Blödsinn ! Er hat nen 1011 und keinen 1003 oder 1033.
Gruß
Hallo,
anbei die main.c. Deine Init-Routine habe ich mittlerweile wieder
auskommentiert...
Habe auch das mit dem schreib-lese-test implementiert. init wird jedoch
trotzdem nur einmal durchlaufen, also hängt es scheinbar nicht mit dem
SCI-Teil zusammen... Werde mal nen SDI-Schreibtest implementieren
müssen...
laut datasheet sind für analog und digital-vdd ein spannungsbereich von
2,5-3,3V angegeben?!
gruß gast
Hmmm,
mal ne Frage, weil ich keine PICS kenne, aber was macht VS_R_Out() und
VS_R_In() ??? Ich hoffe nicht auf Ausgang und Eingang schalten.
Außerdem konnte die Reset Funktion, die du von mir übernommen hast, nur
funktionieren, wenn du danach den Sinustest gemacht hast. Denn in deiner
SoftReset Methode ist immer noch SM_TESTS_Bit gesetzt !
Gruß
Hallo,
der Sinustest fing manchmal gar nicht erst an. Eben errst nach
mehrmaligen Aus- und Einschalten.
VS_R_Out() und In schalten Tatsächlich auf Ausgang und Eingang. Als
Eingang Ist der PIC ja im High-Impedance Modus -> also müsste der
Pulldown den VS auch auf Reset setzen. Oder liegt da mein Denkfehler?
Ich habe Deine Reset-Funktion wie angegeben übernommen. Bis zum
Softreset kam es ja gar nicht, da der VS bzw. ununterbrochen Resetted
hat. Dadurch kam nur ein unangenehmes Rattern zustande. Zumal ich das
SM_Tests-Bit ja aus der SoftReset schon entfernt habe...
Bin langsam am verzweifeln...
gruß gast
@Gast: du schaltest den PIN vom µC auf AUSGANG (nix mit Eingang) an dem
der Reset ist und der bleibt auch AUSGANG!!! Und toggelst auf High ,
wartest kurz , wieder LOW, kurz warten und letztlich auf High und kurz
warten, voila VS1011 ist Resetet und startbereit. Und dann teste mal obs
Unterbrechungen gibt bei while(1) { VS1011_SineTest; } . Wenn nicht
Hardware Ok, andernfalls ....
@Thorsten: Ich würde an deiner Stelle bei write Data mal den DREQ
abfragen ob der überhaupt Daten will ! Außerdem ist die max. SPI Clock
bei SCI reads auf XTAL/6 im Datenblatt angegeben , also statt deiner
5Mhz , so um die 4Mhz.
KAnn funktionieren also, aber muss halt nicht.
Das mit dem SPI ist klar, aber da es geht warum ändern?
Der DREQ Ausgang wird abgefragt, allerdings nicht für jedes Datenbyte
sondern bevor ich den Puffer fülle. ( In einer anderen Datei zu finden
)
Gruß
@Thorsten: nicht für jedes Datenbyte ^^ , aber nach jedem 32Byte
Häppchen sollte er abgefragt werden ob der Puffer schon voll ist und er
überhaupt noch Daten will, wenn nicht , warten bis DREQ wieder auf High
!
Und das mit den 5Mhz SCI-read schrieb ich ja schon kann funzen muss aber
nicht. Beim nächsten VLSI klappts vielleicht nicht.
Gruß
Poste mal deinen neuen Code, wie soll man sonst was sagen.
Noch besser du nimmst nen AVR , dann kannste nen Code 1:1 übernehmen von
mir (Poste ihn dann)^^. Wenns dann nit läuft würde ich auf ein Hardware
Problem tippen, was ich mittlerweile eh tue.
P.S: Was ist denn damit, wenn dein VLSI mal den Reset schafft
-----> while(1) { VS1011_SineTest; } ??????????????
Gibts da auch Aussetzer oder nit ???
Hi,
wenn der VS mal den Reset schafft (war bisher nur mit meiner Routine der
Fall) genügt es, wenn nur ein einziges mal die Sinus-Funktion aufgerufen
wird. Dann piept er fröhlich bis die Hölle zufriert ^^
Ich habe nochmal 2 VS-chips bei Reichelt bestellt. Werde einen auf jeden
Fall wechseln... Die Hardware überprüfe ich nochmals beim Einbau des
neuen Chips...
gruß Gast
Nochwas:
Den "Reset schaffen" sollte ich genauer definieren:
Mit meiner Compare-Funktion läuft der Reset genau ein mal ab. Dann kann
es aber dennoch sein, dass er weder Sinustest, noch MP3-Daten abspielt.
Nach mehrmaligen aus- und einschalten spielt er iwann alles ab...
In meinem obigen Code fehlt das Bit SM_Tests ist mir gerade aufgefallen,
aber das würde auch nichts daran ändern, dass er Deine Reset-Routine nie
verlässt... Der alte VS ist schon rausgeschnitten, also werd ich sowieso
auf die neuen warten... Ich würde gern langsam Ergebnisse erzielen ;-)
gruß Gast
Also wir sollten uns erstmal nur um den Reset und den Sinustest kümmern,
wenn das ordentlich läuft, sollten wir uns um andere Sachen kümmern.
Das meine ResetRoutine nit geht wundert mich sehr. Die funzt auf ca. 6
Stück (von VS1011 bis 1033) MP3-Decodern und zwar IMMER beim
einschalten. Mach mal nen ordentlichen Schaltplan. Notfalls male ihn auf
nen Dina4 und scanne das Dingen ein. Mit allen Bauteil Bezeichnungen.
Also bi denne wenn deine neuen Chips da sind^^.
Gruß
Einen schönen guten Morgen allerseits,
also die neuen VS sind gekommen und ich hab gleich einen eingebaut. Die
Probleme sind allerdings die selbe wie vorher auch...
gruß Gast
Ich komme einfach nicht weiter... Ich habe die Hardware x-fach
gecheckt... Wenn mir jemand sagt, wo es bei Eagle die Masse und VDD
Verbinder gibt zeichne ich nochmal einen Schaltplan zum angucken...
gruß Gast
Gast wrote:
> Wenn mir jemand sagt, wo es bei Eagle die Masse und VDD> Verbinder gibt zeichne ich nochmal einen Schaltplan zum angucken...
Ich mein einfach nach vcc oder gnd suchen bei den Bauteilen (mit *
dahinter)
oder den supply Zweig suchen....
Hallo allerseits,
entschuldigt, dass ich dieses uralte Thema ausgrabe, aber ich möchte
euch noch mitteilen wo der Hase im Pfeffer lag:
#define DREQ LATCbits.LATC1
müsste:
#define DREQ PORTCbits.RC1
sein.
Das wars auch schon... Dieses blöde LAT Register ist memory mapped und
nur zum schreiben gedacht -.- beim lesen werden die zuletzt
geschriebenen werte gelesen und nicht der Pegel am Port...
Das Projekt ist übrigens mittlerweile fertig ^^
mfg Gast