www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sinustest des vs1011


Autor: Thomas Heumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hab einen Atmega32 und einen vs1011. Ich habe versucht den
beschriebenen Sinustest durchzuführen.
Der mc sendet seine daten auch zum vs1011 aber ich bekomm kein sinus am
ausgang.
Der Datenaustausch über spi funktioniert!
Ich kann Daten ins Controlregister schreiben und wieder auslesen!

danke für die hilfe
Gruß Thomas











#include <mega32.h>
#include <spi.h>
#include <delay.h>
#include "Init.h"

#define DREQ PINB.0
#define XDCS PORTB.1
#define XCS PORTB.2
#define XRESET PORTB.3
#define SS PORTB.4
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7



void VS_Reset(){

  XRESET=0;
  delay_ms(100);
  XRESET=1;
  delay_ms(100);
}


void SinusTest(){

  XDCS=0;

  //Start Sinus Test
  spi(0x53);
  spi(0xEF);
  spi(0x6E);
  spi(0x7D);
  spi(0x00);
  spi(0x00);
  spi(0x00);
  spi(0x00);

  delay_ms(500);

  //Ende Sinus Test
  spi(0x45);
  spi(0x78);
  spi(0x69);
  spi(0x74);
  spi(0x00);
  spi(0x00);
  spi(0x00);
  spi(0x00);

  XDCS=1;
}


void InitSinusTest(){
  do{
    spi(0xff);  //send dummy byte
    XCS=1;
    XDCS=1;
       VS_Reset();


       XCS=0;

       spi(0x02);  //schreiben
    spi(0x00);  //adresse
    spi(0x08);  //daten
    spi(0x20);

    XCS=1;
  }
  while(!DREQ);
}


void main(void){



   Init();      //Initialisierung MC
   InitSinusTest(); //Initialisierung Sinus-Test

  while (1){

       SinusTest();
  };

}





oid Init(){

// Input/Output Ports initialization
// Port A initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out
Func6=Out Func7=Out
// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0
State7=0
PORTA=0x00;
DDRA=0xFF;

// Port B initialization
// Func0=In Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=In
Func7=Out
// State0=T State1=0 State2=0 State3=0 State4=0 State5=0 State6=T
State7=0
PORTB=0x00;
DDRB=0xBE;






// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 1000,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x51;
SPSR=0x00;

}

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo  Thomas,

ich bin gerade am gleichen Problem, nur schaffe ich es nicht mal ins
Controlregister zu schreiben oder daraus zu lesen.

Kannst du mal den ganzen code hier reinstellen?
oder per E-mail zuschicken?

Vielen Dank

Michael

Autor: filzlaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab auch das gleiche Problem. Kann die Register beschreiben und auch
lesen. Aber der Sinustest klappt einfach nicht. Gibts denn hier
niemanden, der einen laufenden C-Code für einen AVR und den VS1011
hat??

Autor: papa_of_t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir ein MP3-Breakout Board bestellt, dazu gibt es auch
Beispielcode (s.u.).. ist zwar für vs1002 und eine andere CPU, aber die
sind ja ähnlich / evtl. ergeben sich Ansatzpunkte.. Ich hoffe, das Teil
spielt, sobald es bei mir eintrifft :-)

http://www.sparkfun.com/datasheets/PCB/vs1002_Sine...

Laßt mal hören, sobald es klappt!

Autor: filzlaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab den VS1011 gerade zum laufen bekommen. Kann jetzt den Sinus-Testton
ausgeben. Es lag an der Oszillatorschaltung. Das ist eine wacklige
Geschichte auf dem Steckbrett, obwohl ich auf möglichst kurze Abstände
geachtet habe. Jetzt hab ich bisschen was daran verändert. Manchmal
muss man aber trotzdem noch den Finger dranhalten, damit er schwingen
will :-)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Filzlaus,

könntest du dein Code hier reinstellen, oder mir per E-Mail schicken.

Bei mir will es einfach nicht klappen. Bin schon am verzweifeln...



Vielen Vielen Dank schon im Vorraus

Gruß
Michael

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Oszillator des VS1011 ist sehr empfindlich. Es muss unbedingt der
1MOhm Widerstand parallel zum Quarz geschalten werden, so wie in der
Beispielschaltung des Datenblatts.
Auf einer Leiterplatte ist meine Schaltung auch nicht angeschwungen,
seit ich den 1MOhm drin hab gibts keine Probleme mehr.

/Michael

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Widerstand ist bei mir dran...

es will trotzdem nicht...
deshalb die bitte einen funktionierenden Quellcode, der nur den Vs1011
ansteuert, damit ich weiß ob der decoder überhaupt funktioniert...
!!!!!Bitte stellt jemand so einen Code rein!!!!!!



Trotzdem Danke für den Tipp...


Gruß
Michael

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Post halt mal Deinen Code und dann können wir mal schauen wo das Problem
liegt.

/Michael

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Also ich hab mehrere aber dieser hier ist der letzte Stand.
Das Programm wird zwar ganz durchgemacht... aber es ist nichts bzw.
kein Sinuston zu hören, und Register richtig auslesen geht auch nicht.


Könnt ihr ja mal durchschauen....

Vielen Dank

Michael

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
bzw. dieser hier.

Noch zu sagen wäre, dass ich aus dem Audio-Ausgang ein rauschen
bekomme, und wenn über serielle Schnittstelle was läuft hör ichs
knacksen, genaus beim reseten...



Gruß
Michael

Autor: Staiger Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin grad dran den Sinustest des VS1011 zum laufen zu
bekommen. Allerdings scheitere ich daran. Ich kann lesen
und schreiben in den VS1011.
Wenn ich den Sinustest starte kann ich am Ausgang des
VS1011 am Oszi ein Sinussignal mit ca 2,4kHz messen. Wenn
ich nun einen Kopfhörer anaschließe ist nichts zu hören??

Was muss man dabei beachten?
Die Ausgänge des VS1011 gehen über 100 Ohm direkt an den
Kopfhörer.

Autor: Thomas W. (beholder)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Heumi, immer noch am großen Projekt dabei oder nun als provates
vergnügen.

viele Grüße
Thomas Wiemken

Autor: filzlaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@holger

warum hast du da noch 100 Ohm Widerstände zwischen Ausgang und
Kopfhörer? Ich hab den Ausgang direkt verbunden, wie es im Datenblatt
von VS1011 zu sehen ist und es funktioniert wunderbar.

Autor: Staiger Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@filzlaus

die 100 Ohm sind in einer Beschreibung des Herstellers des VS1011.
Dies sollte man machen um ESD-Beschädigungen des VS1011 zu
vermeiden. Es gibt sogar noch einige weitere Schutzschaltungen.

Aber mein Problem hat sich gelößt, war wohl der VS1011 selbst.
Hab ihn ausgetauscht und schon ging der Sinustest.

Allerdings hab ich nun Probleme einen MMP3 Song abzuspielen. Wenn
ich einen an des VS1011 sende kommt nur ein ganz kurzes (1 sec)
Tonwirrwar.
Wenn ich dann den VS1011 auslese, kann man über 2 Register erkennen
das der MP3Song erkannt wurde. Allerdings wird er nicht richtig
abgespielt. Auch die DREQ-Leitung geht nie auf Low.
Ich sende also die Daten (insgesamt 4 MB) und VS1011 erkennt wohl
auch den Bitstrom aber irgendwas fehlt noch.

Autor: Marco S. (masterof)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abo

Autor: papa_of_t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich hatte auch das Problem mit dem Sinus Test (VS1002).

http://www.mikrocontroller.net/forum/read-1-358906.html#new

Der Tip von filzlaus, den Quarz mal anzufassen scheint auf die richtige
Spur zu führen! Hab das gestern gemacht, nachdem ich mein Programm für
den Sinustest gestartet hatte - Und siehe da, am Audio-Ausgang gab es
ein Rauschen, Knacken, Knistern - da die XTAL-Eingänge ja keine
Verbindung zur Audio-Seite haben, sollte das auf einen nicht
schwingenden Quarz hinweisen, oder? Der oben genannte 1MOhm-Widerstand
ist bei dem Board eingebaut, mit 2x 18pF am Quarz.

Kann man mit einem Oszi messen, ob der Quarz schwingt, oder zieht der
Tastkopf ihn sofort in die Knie? Ich will es mal mit einem externen
Oszillator LTC1799 als Taktquelle probieren und werde dann weiter
berichten.

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei meinem vs1011 kam auch erst kein Sinus raus.
Das lag aber primär daran, dass ich den Sinustestring ans Control
anstatt ans Datenregister gesendet hab...
Vielleicht ist das ja hier auch der Fall?

Gruß,
Daniel

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja sicher kannst du das mit einem Oszi messen.

Autor: papa_of_t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Daniel: Ich habe dieses Beispiel nachempfunden:

http://www.sparkfun.com/datasheets/PCB/vs1002_Sine...

Der einzige Unterschied, den ich sehe, ist, daß man diese
Test-Datenfolge, im Gegensatz zum Register-Schreiben (Testbit-Setzen in
Register 0) bei CS = HIGH senden muß - oder hab ich was übersehen?
Dagegen Steht das obige Beispiel, wo bei CD = LOW gesendet wird..
wunder

hast Du den o.g. Code verwendet, oder würdest Du zum Vergleich mal
Deinen Code posten?

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du für SDI und SCI einen gemeinsamen ChipSelect (XCS) verwendest,
musst du diesen CS auf low setzen, wenn du ins Controll Register
schreiben willst. Auf high setzen, wenn du Daten (Sinus Test String)
sendest.

Nutzt du XCS (für Controllregister) und XDCS (für Datenregister)
getrennt, dann eben den jeweiligen auf low setzen.

Mein Testprogramm habe ich leider nicht mehr.

Das obige Programm schau ich mir mal an, falls das hier nicht für
Klarheit gesorgt hat :)

Gruß,
Daniel

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die SHARE Variante ist irgendwie dann gar kein Chipselect mehr, sondern
eher ein RegisterSelect. Ziemlich unbrauchbar, wenn mehrere ICs am SPI
hängen.

Autor: papa_of_t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, jetzt hab ich den kleinen Unterschied (CS, DCS) auch gesehen. Ich
hab nur CS verwendet, aber ich kann ja auch mal den "alten" Modus mit
den 2 CS-Leitungen testen..

Ich wollte DCS eigentlich gar nicht mehr verwenden, weil ja der VS1002
diesen Modus mit nur einer Leitung unterstützt und ich derzeit keine
anderen SPI -Geräte angeschlossen habe..

Danke schonmal.. Bis gespannt ob es bei Dir mit einer CS-Leitung geht
:-)

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, bei mir lief es mit einer Leitung.
Aber wie gesagt, mit ner SD Karte und Display parallel ist das
unbrauchbar :(

Viel Glück!

Autor: papa_of_t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum ausgerechnet dieser Variante "Share" heißt, ist mir auch
rätselhaft - es ist die einzige, wo man den SPI-Bus NICHT teilen kann
:-)

Aber evtl. habe ich noch einen anderen Fehler gemacht. Lt. Datenblatt
muß man bei dieser Variante CS nach jedem Byte kurz auf HIGH setzen bei
SCI und wenn man Daten schreibt (SDI) muß CD generell auf HIGH sein? Ich
frag mich so langsam, ob der Demo Code bei Sparkfun lief, warum die
ausgerechnet diesen Mode wählten und mich so in die komplizierteste
Ecke lockten (new Mode und SM_SDI shared) :-) Wahrscheinlich hab ich im
Kopf die CS einmal zu viel invertiert (Seite 21):

http://www.vlsi.fi/datasheets/vs1002.pdf

Na auf jeden Fall hab ich weider viel Stoff zum Ausprobieren.

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mein Programmablauf sah so aus:

1. XDC -> LOW
2. SM_SDINEW, SM_SDISHARE, SM_TESTS setzen.
3. Benutzte Taktfrequenz mitteilen
4. XDC -> HIGH
5. Sinus Test Senden

(Bloss nicht die Kopfhörer aufsetzen, wenn du vorher nicht die
Lautstärke gedämpft hast. Das könnte ansonsten weh tun)

Wo steht da, dass man nach jedem Byte den CS mal kurz auf High setzen
muss?

"it is recommended to
turn XDCS (or XCS) every now and then, for instance once after every
flash data block or a few kilobytes,
just to keep sure the host and VS1002d are in sync."

Da steht nichts von "nach jedem Byte" :)

Poste doch mal deinen Code.

Hast du ansonsten alles beachtet was bei den Pindescriptions steht?
Hast du schonmal nachgemessen, ob dein Quarz schwingt?
Hast du ne Pegelwandlung dazwischen, die evtl. Probleme machen könnte?

Ich spreche übrigens die ganze Zeit von einem VS1011.
Aber so wie es aussieht unterscheiden sich die beiden bei dieser Sache
nicht.

Gruß,
Daniel

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@papa_of_t
SHARE, weil sich Data- und Control-Interface ein Chip-Select teilen

Autor: papa_of_t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leute, es funktioniert - dank Eurer Hilfe erklingt ein glockenklarer
Sinuston :-)

Also ich hab mich prima selber ausgetrickst: Nachdem ich erstmal den
oben beschriebenen Modus mit den 2 Leitungen XCS und XDCS ausprobiert
habe inkl. richtiger Ansteuerung, hörte ich einen ganz kurzen
"Plick". Ein Blick auf die Versorgungsspannung zeigte mir einen
winzigen Einbruch, dadurch daß der Chip zur Tonausgabe ja schon ein
paar mA mehr haben will als beim reinen Register-Schreiben. Bischen
mehr Spannung - und schon ging es, auch mit der SHARE-Variante und nur
einer CS-Leitung michSelberAuslach Ich hab exakt die Grenze
getroffen, wo die Versorgungsspannung nicht mehr ausreicht. Bei anderen
Versuchen mit dem Mega8 ist das nie passiert, der verbraucht ja fast
nichts...

@Daniel: das mit dem CS kurz auf HIGH gilt zwischen 2 SCI writes, nicht
zwischen Bytes, das hast Du recht.

Meinen Quarz kann ich aber nicht mit dem Oszi messen, sobald ich das
Quarz-Bein berühre ist Stille.

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst, du bist in die Strombegrenzung gegangen?
Das is natürlich gemein. :)
Bei meinem Netzgerät, leuchtete dann eine dicke rote LED auf. Da fällt
das sofort auf ;)

Fein, das es jetzt bei dir funktioniert.

Gruß,
Daniel

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
gestern hab ich mal wieder versucht den VS1011 zum laufen zu bringen
und siehe da, ich hab im Programmcode einen Fehler entdeckt, ich hab
nämlich vergessen SM_TEST (0x20) zu setzten...

Dann hab ich compiliert und gebrannt, und plötzlich hörte ich ein
kurzes Piep... welch Freude...
Doch dann sah ich, dass die Register immer noch nicht richtig
ausgelesen werden, und das Piepsen hörte ich auch nur selten...

Jemand mit disen Symptomen was anfangen..
Wäre für jede Hilfe dankbar.

Gruß
Michael

Autor: papa_of_t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na dann fang doch damit an, 'rauszufinden, warum Die Register sich
nicht richtig auslesen lassen. In den Application Notes ist eigentlich
eine ganz gute Schrittfolge drin, die hätte mir auch viel Zeit
gespart..

Wenn Du die Register nicht richtig auslesen kannst, kannst Du auch
nicht sicher sein, daß Du sie richtig schreibst. Laß doch einfach den
Testton erstmal beiseite, schreib was z.B. in das Lautstärke-Register
und lies diesen Wert zum Vergleich wieder aus. Außerdem (s.o.) beim
Initialisieren / Register schreiben braucht das Teil wesentlich weniger
Strom als mit Testton - wie hoch ist denn Deine Versorgungsspannung?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
also der Atmega32 läuft mit ca 5 V
der VS1011 mit ca. 3,5 3,6 V.

Ich hab meiner Meinung nach schon irgendwie alels probiert...

Hab das Datenblatt auch schon des öfteren durchgelesen... ich komm
einfach nicht dahinter.

Vllt. könntest du meinen Code durchschauen, bzw. mir deinen
(funktionierenden) Code schicken um eventuelle Hardwarefehler
auszuschließen.

Vielen Dank schonmal für deine Hilfe...

Gruß
Michael

Autor: papa_of_t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mit BasCom sieht es so aus (statt Shiftout könnte man auch SPI
nehmen, dann geht es noch ne ganze Ecke schneller) - kannst ja Deine
Leseroutine mal posten..


Function Vs_read(byval Vs_address As Byte) As Word

  Vs_xcs = 0 'Xcs low

  'read command.
  B = &B00000010
  Shiftout Vs_mosi , Vs_clock , B , 1

  'Send the address you want to read
  Shiftout Vs_mosi , Vs_clock , Vs_address , 1

  'Get the most significant byte & shift to correct position
  Shiftin Vs_miso , Vs_clock , B , 1
  Vs_read = B
  Shift Vs_read , Left , 8
  'Get the least significant byte & add to Vs_read
  Shiftin Vs_miso , Vs_clock , B , 1
  Vs_read = Vs_read + B

  Vs_xcs = 1 'Xcs high

End Function

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also ich denke, dass es bei mir eigentlich genaso aussieht...
Oh da fällt mir auf:
du hast 2 als "readcode"
im Datenblatt steht, dass 3 der "readcode" wäre...


Aber hier mal der code zum readen:


void spi (unsigned char data)
{
  SPDR = data;
  while (!(SPSR & (1<<SPIF)));
}

void read_buffer(unsigned char *buf, unsigned short len)
{
  while (len--)
  {
    spi(0x00);
    *(buf++) = SPDR;
  }
}

void Mp3ReadRegister(int adressbyte)
{
  char mmc_buf[1];
  memset(mmc_buf,0,1);
  Mp3SelectControl  ();   //Xcs auf low
  delay(1000);
  spi(0x03);     // code zum readen
  spi(adressbyte);
  delay(1000);
  read_buffer(&mmc_buf[0], 2);
  printf("Read: addr:%2i  | buf[0]:%3i  | buf[1]:%3i  \n",adressbyte,
mmc_buf[0], mmc_buf[1]);
  Mp3DeselectControl  () ;//Xcs high
  delay(1000);
}




////////////////////////////////////////////////////////////////////
writen:
void Mp3WriteRegister(int adressbyte,int highbyte,int lowbyte)
{
  printf("WRIT: addr:%2i  | high:  %3i  | low:   %3i  \n",adressbyte,
highbyte, lowbyte);
  Mp3SelectControl  ();
  Mp3DeselectData ();
  spi(0x02);
  spi(adressbyte);
  spi(highbyte);
  spi(lowbyte);
  delay(100);
  Mp3DeselectControl  () ;
  delay(1100);
}


so im Anhang noch der ganze Code..

Gruß
Michael

Autor: papa_of_t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, Du hast recht, es muß 3 sein. Ich hatte in der Zeile eine Konstante
und diese Zeile erst beim Posten geändert, damit man es lesen kann,
sorry.

Was liest Du denn mit Deiner Routine für Werte? Wenn Du einen Oszi
hast, schreib doch eine Schleife die immer ein Register schreibt und
danach ausliest liest, am Anfang der Schleife erzeugst Du Dir mit einem
Port eine "Nadel", dieses Signal schließt Du an den Trigger-Eingang -
dann kannst Du fein säuberlich sehen, was aus der MOSI 'rausgeht bzw.
was danach auf der MISO 'reinkommt..

Ich hab auch schon lange kein C mehr geschrieben, aber ist denn "int
adressbyte" vom Datentyp her genau passend? (0-255)?

Autor: Marco S. (masterof)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine Frage zum VS1001 da der Data-SPI ja kein Chip-Select hat.
Wird im Application Notes vor geschlagen mit hilfe eines UND-Gater den
Takt zuschalten. Da meine Frage ist es nicht besser den SI-EIngang
mithilfe des UND-Gater zuschalten und was für eine Gater-familie habt
ihr verwendet oder habt ihr eine andere Lösung verwendet.
Gruß masterof

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
74HC08 in den Datenbus hängen, fertig.

Daniel

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
als Rückgabewerte kommt entweder nur Null oder irgendwelche wirren
Zahlen, meist über 200 raus.... (in high und lowbyte aufgeschlüsselt)


Sieht der Code sonst in Ordnung aus?

Öhm UND-Gatter....  sowas braucht man aber nicht beim Vs1011 oder?? Die
ganz normale Beschaltung wie im Datenblatt funktioniert schon, oder?


Gruß
Michael

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Ahnung. Ich kenne nur den vs1001. Da braucht man eigentlich auch
kein AND, aber wer will kan ja eins verwenden.

Daniel

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat jemand noch ne Idee, was bei mir falsch ist/sein könnte??

Michael

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hat sich jemand den code mal durchgeschaut....

weil ich immer noch nicht weiß ob es ein hardware- oder ein
softwarefehler ist.

vllt könnte ja jemand einen kompletten (simplen) code mit lese- und
schreiberoutine hier reinstellen.

wäre echt dankbar...

Gruß Michael

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//Edit  code am besten in C für Atmega(32)

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf meiner Homepage findest Du ein Project mit ATmega128 und VS1011b.
Code ist geschrieben für WinAVR und getestet.

http://www.mictronics.de

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE!!!!!!!!!!!!!!

Vielen vielen Dank...

Es funktioniert...

Ich hab mir deinen Code angeschaut, und gesehen, dass meine
"Spi-Clock" falsch war...   und, dass man eine 0 immer voraus
schicken muss bevor man was empfangen will...

ich hatte es immer nur einzeln umgestellt,   aber zusammen
funktionierts.


ENDLICH
VIELEN VIELEN DANK!!!!!!!


Gruß
Michael

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da freut sich aber einer... :)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
So da bin ich wieder... :)

und zwar arbeite ich im "new mode" des VS1011.
hier meine sinusfunktion:
//################################################ SINUS
###################################################//
void VsSineTest(void)
{

  printf("SINE TEST\n");
  Mp3SetVolume(0,0);

        vs1011_nulls(8);
  Mp3DeselectControl();
  Mp3SelectData();

  spi_data(0x53);
  spi_data(0xef);
  spi_data(0x6e);
  spi_data(0x04);
  spi_data(0x00);
  spi_data(0x00);
  spi_data(0x00);
  spi_data(0x00);

  delay (100000);

  spi_data(0x45);
  spi_data(0x78);
  spi_data(0x69);
  spi_data(0x74);
  spi_data(0x00);
  spi_data(0x00);
  spi_data(0x00);
  spi_data(0x00);


  delay(500);
  printf("SINE TESTende\n");
}



spi_data sieht so aus:
  SPDR = data;    //Schreiben der Daten
  while (!(SPSR & (1<<SPIF)));


und jetzt noch die funktion, wo die mp3 daten zum VS1011 sendet:
void spi_32 (char * data)
{
    int i = 0;
  int g = 0;
  while(g<=512)
  {
    if(i == 32 )
    {
      while (!DREQ_PIN & (1<<DREQ));
      i=0;
    }
    else
    {
      spi_data (*data++);
      delay(10);
      i++;
      g++;
    }
  }
}


im code umgeben von:
BSYNC_PORT &=  ~(1<< BSYNC);
und:
BSYNC_PORT |=  (1<< BSYNC);

wobei Bsync mit xdcs gleichzusetzen ist...

nun das Problem:
Ich kann die daten zwar senden, nur passiert nichts. Außer das ab und
zu ein "snitch" (lautmalerisch) zu hören.

Kann mir da jemand weiterhelfen.
wichtig NEW MODE!!

Gruß
Michael

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert das Lesen und Schreiben der Control Register?

Hast du dir mal das Audio Signal mit einem Oszi angeschaut wärend des
Sinustest?

Könnte es sein, das Deine delay Funktion nicht das erwartet delay
erzeugt? (besonderst dann nicht wenn Du die delay Funktionen der
avr-libc benutzt, die haben ein Limit)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreiben und Lesen ins Control Register funktioniert.

Auch der Sinustest funktioniert.
Ich wollte mit er Funktion nur zeigen, dass das versenden von Daten
eigentlich auch funktioniert.

Nur wenn ich mp3-Daten schicken will passiert nichts außer dem oben
genannten "Snitch"....
Einen Oszi hab ich leider nicht...

Muss ich vor dem senden der mp3-Daten irgendwas anderes an den VS1011
senden, damit er weiß, dass jetzt solche Daten kommen? (Eigentlich ja
nicht, oder?)

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hatte ich Missverstanden, ich habe es so interpretiert das
garnichts geht.

Normal schickst du den MP3 Stream nur an den VS, sonst nichts.
Die SM_SDINEW ist entsprechend gesetzt nehme ich an, und auch
SCI_CLOCKF.

Probier mal noch mit SM_SDISHARE = 1, vielleicht liegts am Handling der
CS Signale.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so,
also ich habs mit SM_SDISHARE = 1 getestet und die "Snitches" häufen
sich, und wenn man das Lied kennt kann man auch mit sehr viel
Anstrengung es wiedererkennen ;).

Nun hab ich mal in deinem Code geschaut und dein SPI Speed liegt bei
x/8..

Bei mir liegt er bei 16/128 , stelle ich ihn auf 16/8 um so bekomm ich
keine Snitches mehr zu hören...(Sinustest und Lesen und Schreiben
sowohl beim VS1011 wie auch bei der MMC funktioniert)
komisch..

Könnte da das Problem liegen? Was könnte es sein?

später Gruß
Michael

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein SPI Takt liegt bei MCU_XTAL/2, das SPI2X Bit wird auch noch gesetzt
(SPI_CLK = 4MHz)

Die SPI muss auf jeden Fall schnell genug sein um den MP3 Stream
liefern zu können. Ich glaube mit 16MHz/128 bist du zu langsam.
Aber wenn sich mit SDISHARE was ändert würde ich noch mal das Handling
der CS Leitungen prüfen, vielleicht auch mit Scope wenn du eins hast.
Aber alles in allem solltest Du versuchen den SPI Takt zu erhöhen, so
schnell wie's geht.
Bei welcher Quarzfrequenz läuft der VS10xx?
Der SPI Takt darf nicht höher als VS_QuarzFreq/6 sein.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei dir steht doch:
(1<<SPR0) | (1<<SPI2X)
im Datenblatt nachgeschaut bedeutet das:
XTAL/8  oder verles ich mich da??

so siehts bei mir im Code aus:
MMC_PORT |= (1<<MMC_CS); //MMC Chip Select -> High (deactivate);
Mp3DeselectControl();
Mp3SelectData();
spi_32(Dateiname);
Mp3DeselectData();
MMC_PORT &= ~(1<<MMC_CS); //MMC Chip Select -> High (deactivate);


das müsste doch von den CS her passen oder??

Quarz vom VS ist: 12,288 MHZ

Clockf setz ich auf: 38912
sollte eigentlich auch stimmen...

Was ist ein Scope?(Hab ich also nicht)..

Vielleicht ist noch zu sagen, dass ich immer 512 Byte speicher, davon
dann nach und nach immer 32 Byte an den VS sende, solange bis alles 512
"aufgebraucht" sind, und dann lese ich weitere 512 Byte ein.

Gibts noch ne Idee für das Problem?

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Ahnung wo Du das liest:
(1<<SPR0) | (1<<SPI2X)
Ich initialisiere wie folgt:
    // enable SPI in master mode and set clock speed
    //  SPI clock must be at least 3MHz with 12.288MHz crystal
    SPCR = _BV (MSTR) | _BV (SPE);  // Master mode, SPI enable, clock
speed MCU_XTAL/4
#if MCU_XTAL > 10000000UL
    SPCR |= _BV (SPR0);    // set clock speed MCU_XTAL/16
#endif
    SPSR |= _BV (SPI2X);  // set clock speed MCU_XTAL/2


ClockF passt soweit.

Mit deinem Code kann ich nicht viel anfangen. Du must sicherstellen,
das XDCS und XCS immer gegenseitig invertiert werden. Das heist es
dürfen nicht beide gleichzeitig LOW sein. HIGH schon, dann sind beide
Interfaces deaktiviert.

Mit Scope mein ich ein Oszilloskope. Damit du dir die CS Signale
anschauen kannst.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Mein SPI Takt liegt bei MCU_XTAL/2, das SPI2X Bit wird auch noch
gesetzt (SPI_CLK = 4MHz)"

SPI2X wird nicht gesetzt -> 8 Mhz / 2 -> 4MHz

so habs mit meinen CS Leitungen auf die Reihe bekommen. Es kommt das
gleiche Ergebnis wie bei SDI_Share...

Irgendwie kann ich den Takt für die MMC-Karte nicht erhöhen, sonst
reagiert sie nicht mehr...

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe meine ganze Freiluftverdrahtung jetzt mal auf eine Platine 
geätzt.
Dies ist nun schon die zweite Version und ich komm einfach nicht weiter.

Kann wie viele andere auch die Register beschreiben und auch wieder 
auslesen.
Aber der Sinustest will nicht.

Mein Quarz schwingt. Allerdings meines Erachtens etwas merkwürdig. Der 
1M Ohm Widerstand ist vorhanden.

Habe den Quarztakt mit einem Oszi gemessen und er hat ein DC offset von 
1V und eine Uss von ebenfalls 1V.
Das kann doch nicht richtig sein, oder?

An XTAL1 liegen etwa 1,2V an. An XTAL0 ist der Quarztakt zu sehen.

Hat wer ne Idee was hier los ist?

Grüsse,
Daniel


Autor: Commtel @msn (commtel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Daniel N.

hast du auch das sdi test bit gesetzt?

Autor: Daniel N. (bipak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jau, das ist gesetzt.
Hier mal die gesamte Routine:
#define MODE_TESTS    0b0000100000100000 


void sine_test(void)
{

  char sine_test[8] = {0x53, 0xEF, 0x6E, 0x7E, 0, 0, 0, 0};
  uint8_t i;
  
  DDRD |= (1<<SCI_PIN)|(1<<XRESET);     //PD7 = Output -> XCS (ChipSelect für SCI)|PD4 XRESET des VS1011
  DDRD &=~(1<<PD5);             //PD5 = Input  -> Eingang für DREQ
  DDRF |= 1<<SDI_PIN;            //PF7 = Output -> XDCS (Chipselect für SDI)
  
  PORTD |= 1<<XRESET;   //XRESET auf High!
  
  SDI_PORT |= 1<<SDI_PORT;   //SDI deaktivieren  
  SCI_PORT &= ~(1<<SCI_PIN); //SCI aktivieren  

  SPSR = 0 << SPI2X; //SPI Auf halbe geschwindigkeit setzen (nur notwendig wenn Quarz-frq. <24.576MHz)    

  loop_until_bit_is_set(PIND, PD5);   //Auf DREQ warten

  
  vs1011_SCI_write(SCI_MODE, MODE_TESTS);  //SM_SDINEW |(für SM_TESTS 5. Bit von 0-15 setzen)
  vs1011_SCI_write(SCI_CLOCKF, 0x1800+0x8000);   //12288000 / 2000 + doublespeed bit  
  
  
  SCI_PORT |= 1<<SCI_PORT;   //SCI deaktivieren
  SDI_PORT &= ~(1<<SDI_PIN); //SDI aktivieren  
  
  for(i = 0; i<8; i++)
  {
    SPDR = sine_test[i];            
    loop_until_bit_is_set(SPSR, SPIF);  
  }
  
  printf("sine test started\n");
  for(;;)nop();

}

Mache mir aber eher sorgen um den Takt.

Autor: Commtel @msn (commtel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie schnell ist den dein takt ? scl leitung
ich müste nach dem ich ein hardware reset gemacht hab erst mal ne pause 
proggen.
XCS = 0
hab dann ins register 0 den new mode gestezt und den sdi test(wie bei 
dir auch)
XCS = 1
XDCS = 0
sinustest gesendet (wie du auch)
XDCS = 1
endlosschleife

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.