Forum: Mikrocontroller und Digitale Elektronik Sinustest des vs1011


von Thomas Heumann (Gast)


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;

}

von Michael (Gast)


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

von filzlaus (Gast)


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

von papa_of_t (Gast)


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

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

von filzlaus (Gast)


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

von Michael (Gast)


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

von Michael W. (mictronics) Benutzerseite


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

von Michael (Gast)


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

von Michael W. (mictronics) Benutzerseite


Lesenswert?

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

/Michael

von Michael (Gast)


Angehängte Dateien:

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

von Michael (Gast)


Angehängte Dateien:

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

von Staiger Holger (Gast)


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.

von Thomas W. (beholder)


Lesenswert?

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

viele Grüße
Thomas Wiemken

von filzlaus (Gast)


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.

von Staiger Holger (Gast)


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.

von Marco S. (masterof)


Lesenswert?

abo

von papa_of_t (Gast)


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.

von Daniel N. (bipak)


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

von Daniel N. (bipak)


Lesenswert?

Ja sicher kannst du das mit einem Oszi messen.

von papa_of_t (Gast)


Lesenswert?

@Daniel: Ich habe dieses Beispiel nachempfunden:

http://www.sparkfun.com/datasheets/PCB/vs1002_Sine_Test_Tone.c

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?

von Daniel N. (bipak)


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

von Daniel N. (bipak)


Lesenswert?

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

von papa_of_t (Gast)


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

von Daniel N. (bipak)


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!

von papa_of_t (Gast)


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.

von Daniel N. (bipak)


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

von ich (Gast)


Lesenswert?

@papa_of_t
SHARE, weil sich Data- und Control-Interface ein Chip-Select teilen

von papa_of_t (Gast)


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.

von Daniel N. (bipak)


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

von Michael (Gast)


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

von papa_of_t (Gast)


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?

von Michael (Gast)


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

von papa_of_t (Gast)


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

von Michael (Gast)


Angehängte Dateien:

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

von papa_of_t (Gast)


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

von Marco S. (masterof)


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

von Daniel R. (daniel_r)


Lesenswert?

74HC08 in den Datenbus hängen, fertig.

Daniel

von Michael (Gast)


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

von Daniel R. (daniel_r)


Lesenswert?

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

Daniel

von Michael (Gast)


Lesenswert?

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

Michael

von Michael (Gast)


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

von Michael (Gast)


Lesenswert?

//Edit  code am besten in C für Atmega(32)

von Michael W. (mictronics) Benutzerseite


Lesenswert?

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

http://www.mictronics.de

von Michael (Gast)


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

von Daniel R. (daniel_r)


Lesenswert?

Da freut sich aber einer... :)

von Michael (Gast)


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

von Michael W. (mictronics) Benutzerseite


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)

von Michael (Gast)


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

von Michael W. (mictronics) Benutzerseite


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.

von Michael (Gast)


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

von Michael W. (mictronics) Benutzerseite


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.

von Michael (Gast)


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?

von Michael W. (mictronics) Benutzerseite


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.

von Michael (Gast)


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

von Daniel N. (bipak)


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


von Commtel @. (commtel)


Lesenswert?

@ Daniel N.

hast du auch das sdi test bit gesetzt?

von Daniel N. (bipak)


Lesenswert?

Jau, das ist gesetzt.
Hier mal die gesamte Routine:
1
#define MODE_TESTS    0b0000100000100000 
2
3
4
void sine_test(void)
5
{
6
7
  char sine_test[8] = {0x53, 0xEF, 0x6E, 0x7E, 0, 0, 0, 0};
8
  uint8_t i;
9
  
10
  DDRD |= (1<<SCI_PIN)|(1<<XRESET);     //PD7 = Output -> XCS (ChipSelect für SCI)|PD4 XRESET des VS1011
11
  DDRD &=~(1<<PD5);             //PD5 = Input  -> Eingang für DREQ
12
  DDRF |= 1<<SDI_PIN;            //PF7 = Output -> XDCS (Chipselect für SDI)
13
  
14
  PORTD |= 1<<XRESET;   //XRESET auf High!
15
  
16
  SDI_PORT |= 1<<SDI_PORT;   //SDI deaktivieren  
17
  SCI_PORT &= ~(1<<SCI_PIN); //SCI aktivieren  
18
19
  SPSR = 0 << SPI2X; //SPI Auf halbe geschwindigkeit setzen (nur notwendig wenn Quarz-frq. <24.576MHz)    
20
21
  loop_until_bit_is_set(PIND, PD5);   //Auf DREQ warten
22
23
  
24
  vs1011_SCI_write(SCI_MODE, MODE_TESTS);  //SM_SDINEW |(für SM_TESTS 5. Bit von 0-15 setzen)
25
  vs1011_SCI_write(SCI_CLOCKF, 0x1800+0x8000);   //12288000 / 2000 + doublespeed bit  
26
  
27
  
28
  SCI_PORT |= 1<<SCI_PORT;   //SCI deaktivieren
29
  SDI_PORT &= ~(1<<SDI_PIN); //SDI aktivieren  
30
  
31
  for(i = 0; i<8; i++)
32
  {
33
    SPDR = sine_test[i];            
34
    loop_until_bit_is_set(SPSR, SPIF);  
35
  }
36
  
37
  printf("sine test started\n");
38
  for(;;)nop();
39
40
}

Mache mir aber eher sorgen um den Takt.

von Commtel @. (commtel)


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

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.