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; }
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
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??
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!
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 :-)
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
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
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
Post halt mal Deinen Code und dann können wir mal schauen wo das Problem liegt. /Michael
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
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
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.
Hallo Heumi, immer noch am großen Projekt dabei oder nun als provates vergnügen. viele Grüße Thomas Wiemken
@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.
@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.
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.
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
@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?
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
Die SHARE Variante ist irgendwie dann gar kein Chipselect mehr, sondern eher ein RegisterSelect. Ziemlich unbrauchbar, wenn mehrere ICs am SPI hängen.
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 :-)
Ja, bei mir lief es mit einer Leitung. Aber wie gesagt, mit ner SD Karte und Display parallel ist das unbrauchbar :( Viel Glück!
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.
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
@papa_of_t SHARE, weil sich Data- und Control-Interface ein Chip-Select teilen
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.
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
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
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?
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
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
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
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)?
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
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
Keine Ahnung. Ich kenne nur den vs1001. Da braucht man eigentlich auch kein AND, aber wer will kan ja eins verwenden. Daniel
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
Auf meiner Homepage findest Du ein Project mit ATmega128 und VS1011b. Code ist geschrieben für WinAVR und getestet. http://www.mictronics.de
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
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
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)
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?)
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.
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
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.
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?
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.
"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...
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.