Hallo Ich baue gerade meine Schaltung auf und habe nun nach dem VS1001 auch noch die SD-Karte an den SPI drangehängt und prompt kommt auch die Fehlermeldung vom AVR-Dude: invalid device. Ich benutze übrigens den USBasp-Programmer. In verschiedenen Foren habe ich nun gelesen, dass irgendwo Widerstände dazwischen geschaltet werden müssen, was meint ihr dazu. Sinnvoll wäre es sicherlich, die CS-Leitungen der ICs mit nem Pullup-Widerstand zu versehen. Welchen Wert würdet ihr denn da bei 3,3V vorschlagen. Laut dem SD-Anschlussplan von Ulrich Radig zieht er den CS per Pulldown auf Masse. Warum eigentlich? Das wäre ja korrekt, wenn die SD-Karte der einzige Slave am SPI wäre, aber bei Multislave-Betrieb ja eher hinderlich. Danke euch
Die Fehlermeldung kommt wenn du den Controller flashen willst? Mit 10k Pullup sollte man nicht allzuviel falsch machen können. Teilen sich SPI und ISP die gleichen pins? Dann sollte die SD auf jeden Fall nen Pullup bekommen, damit sie nicht gegen den Programmer treibt. Oder du zeihst zum programmieren die Karte aus dem Slot Sebastian
Alles klar, da werd ich erst mal das probieren. Jo beim Flashen meint ich natürlich. Ja alle Komponenten hängen an den 3 SPI-Pins.
Der fehler kommt obwohl du nur den connector ohne Sd angeschlossen hast? Oder wie hast du die SD karte angeschlossen?
Nene, SD-Karte steckt schon drin. Ich hab ja schließlich keine Lust, die ständig hin und her zu stecken
Ja das ist schon klar SD karte rein und raus machen immer ist nicht so toll.. Und du programmierst ja auch über die isp, die steht ja für programmieren im System. Hast du das jetzt mal mit denn Pull-ups getestet?
Läuft :-) Aber ich bekomm vom AVR-Burner häufig nach dem Flashen noch diese Zeile: Reading | ################################################## | 100% 2.89s avrdude.exe: verifying ... avrdude.exe: verification error, first mismatch at byte 0x000a 0x47 != 0x0c avrdude.exe: verification error; content mismatch avrdude.exe: safemode: Fuses OK avrdude.exe done. Thank you. Könnt ihr da auch weiterhelfen?
Wenn du flashst, die SD-Karte dann rausziehst und dann explizit nochmal den Flashinhalt überprüfen lässt; geht das Überprüfen dann ohne Fehler durch? Dann würde ich mal ganz blind auf irgendwelche Reflexionen od. ähnliches auf deinem "SPI-Bus" tippen. Oder stell mal die Programmierfrequenz runter. Sebastian
mmmh. wenn die Karte drin steckt, dann Fehler. Karte draußen, dann klappt das flashen wunderbar. Kann man das noch irgendwie anders beheben, ohne die Programmierfrequenz runterzusetzen, denn das dauert bei 10 kb einfach zu lange(43 sek.) Außerdem tritt der Fehler trotzdem auf.
Hmm. Das Problem ist ja, dass die Überprüfung nicht läuft. Deshalb hab ich gemeint, du sollst mal mit Karte Flashen und ohne Karte nochmal überprüfen lassen. Dann kann man sicher sein, dass es wirklich das Prüfen ist, das nicht geht, und nicht das flashen. So richtig klar ist mir aber nicht, was dann die Ursache sein soll. Du könntest mal Serienwiderstände in den SPI-leitungen zur SD-Karte einbauen. Irgendwas kleines bis vielleicht 500 Ohm, höchstens 1k. Das könnte beim Programmieren helfen. Bloß wenn die Widerstände zu groß sind könnte es sein, dass der AVR die Karte nichtmehr erkennt. Das Programmierfrequenz runterstellen kannste seinlassen. Hatte nur gehofft, es würde dann auch mit Karte laufen. Mal noch ne Dumme Frage: Das wird doch sicher nen mp3-Player, oder? Was steckt denn in dem Code schon alles drin, dass du schon 10kB hast, obwohl die SD-Karte noch nicht läuft? Hab bei mir momentan mit VS1011, ATA, FAT inklusive Ordner sortieren und Ordner und Dateien zur Playlist hinzufügen + rudimentäre Menüsteuerung und Ausgabe über UART etwa 6,5kB. Sebastian
Achso hatte ich vergessen, ja ich habe die Karte rausgenommen und hab den Flash auslesen lassen, da kam keine Fehlermeldung, wenn es das ist, was du meintest. Das ist der Code von diesem alpmp3-player und ich geh wirklich Schritt für Schritt vor also bis jetzt check ich halt erstmal ob meine Schaltung auch funktioniert. Der VS1001 piepst schon ganz ordentlich, nur die SD-Karte halt noch nicht, leider. Ich hab alle Dateien in der Build drin, nur bei der Main-Schleife, hab ich halt alles auskommentiert, was nach dem SD- und VS1001-Init kommt. Lt. AVR-Burner sind das 9990 Byte. Kannst du mir deinen Code evtl. mal zukommen lassen, da kann ich mal vergleichen.
Ich fürchte mein Code wird dir nicht so viel helfen, da ich ja zum einen ne Harddisk dran hab und zum anderen ist meiner in ASM. Und vorallem im Einstiegsfile herrscht totales Chaos. Wenn du unbedingt willst schick ich ihn dir, aber Beschreibung werd ich keine tippen. Wenn der Code natürlich vollständig ist wundern mich 10kB nicht. Ich tipp bei mir ja noch fleißig. Wenn der Verify ohne Karte läuft dann heißt das ja auch, dass der Write mit karte lief. Man könnte jetzt wenn's sein muss einfach auf den Verify verzichten (bzw. die Fehlermeldun ignorieren). Das war der Gedankengang dahinter. Aber empfehlenswrt ist das natürlich nicht. Aber wenn du sowieso einen fertigen Code flashst sollte es doch zumutbar sein, jedes mal die Karte aus dem Slot zu ziehen, oder? Sebastian
OK mit ASM bin ich nun wirklich nicht vertraut(3 Praktika während eines Semesters, mal eine 7Segment-Anzeige angesteuert). Noch ne Frage: die 3 Pulldownwiderstände bei Ulrich Radig, sind die denn überhaupt erforderlich? Denn andere Schaltungen hab ich schon ohne gesehen.
Hmm, meinst du die schaltung hier: http://www.ulrichradig.de/home/uploads/images/avr_mmcsd/gfx/MMCSDSCH.JPG Dann sind das nämlich keinen Pulldowns sonder das sind mit den anderen 3 Widerständen 3 Spannungsteiler. Der Controller wird in der Schaltung mit 5V betrieben, die Karte mit 3,3. Würde man beides direkt zusammenschalten, würde die Karte kaputt gehen. Also baut er einen Spannungsteiler in die Leitungen, auf denen der Controller sendet. Du betreibst deinen Controller ja wahrscheinlich auf 3,3V, dann wäre ein Spannungsteiler kontraproduktiv. Aber Serienwiderstände darfst du gerne in alle leitungen bauen außer CS(wegen dessen Pullup) bauen. Dann könnte das mit dem Verify auch funktionieren. Wenn man Ullrich Radig glauben darf gehen sogar 1,8k in Serie, ich hätte wohl nicht mehr als 1k genommen. Mit steigenden Werten wird halt die Kommunikation zur SD immer störanfälliger (relevant aber wohl erst ab ein paar 10k). Sebastian
So, 220Ohm rocken die Bude. Aber leider krieg ich von meiner SD-Karte kein 0x01 als Antwort auf den INIT-Befehl. Das hier ist der Code:
1 | void MMC_init(void){ |
2 | u08 i; |
3 | u08 res; |
4 | // the data sheet says that the MMC needs 74 clock pulses to startup |
5 | // 10*8== 80; 80>76 |
6 | MMC_CS_select(); |
7 | for( i = 0; i < 10; i++){ |
8 | spi_io(0xff); |
9 | }; |
10 | // select card |
11 | MMC_CS_select(); |
12 | delay_ms(10); |
13 | // put MMC in idle |
14 | MMC_send_cmd(MMC_CMD_0_GO_IDLE,0x0,0x0); |
15 | // get the response |
16 | res = MMC_get_R1(); |
Und 'res' muss halt 0x01 sein, wenn es richtig initialisiert ist. Es kommt aber 0x00 raus. Hatte die Schaltung vorher erst mit Software-SPI-betrieben, das funktionierte.(da natürlich andere Beschaltung) Ach mir fällt grad noch ein, dass beim INI der SPI-Bus max mit 400kHz betrieben werden soll. Das ist in diesem Code glaube gar nicht implementiert. Aber das probier ich morgen noch mal.
Diese beiden Defines für den SPI-Speed hab ich mir gemacht:
1 | #define SPI_SLOW() SPCR = (1 << SPR1) | (0 << SPR0); //clk/64 |
2 | |
3 | #define SPI_FAST() SPCR = (0 << SPR1) | (0 << SPR0); //clk/4 |
Doch wenn ich die dann aufrufe, schafft es der uC nicht mehr durch den VS_Init. spi_init(); sei(); SPI_SLOW(); VS1001_init();//hier hängts! BEEP(3); Ich hab im define auch mal den SPI_SLOW auf maximum-Speed also 0-0 gesetzt. Doch der Fehler blieb. Wenn ich die Funktion rausnehme, dann klappts natürlich. hab anstatt SPI_SLOW(); auch mal direkt SPCR=... eingesetzt, leider dasselbe. Woran kann denn das liegen?
Du hast die Serienwiderstände zur Karte drin? Ohne die ging die Init? Dann sind die Widerstände zu groß. Ansonsten: Probier mal ne extrem geringe SPI-Frequenz. Ansonsten fällt mir jetzt nix mehr ein. Hab noch nie was mit SD-Karten gemacht. Und den Code den du verwendest kenn ich auch nicht (nur die Auszüge die du hier postest). Sebastian
Nein ich hab doch geschrieben "220 Ohm rocken die Bude". Also mit Widerständen = :-) Ich hatte den Clockteiler doch schon auf 128 gesetzt, langsamer geht nicht, das sind 64 kHz. Es ist zum Verzweifeln. Wie gesagt, ich hatte die Karte ja auch schon mal mit Software-SPI initialisiert und da hatte ich fast 400kHz genommen.
Passt denn Clock polarity und die MSB-LSB-einstellung? 64kbit sind wirklich nicht viel und 220 Ohm dürfen so stark auch nicht stören... Wie gesagt: Ich hab selbst noch nie was mit SDs gemacht, daher stocher ich hier jetzt auch etwas im dunkeln. Nimm mal Programmer und vor allem auch den VS vom SPI. Gehts dann? Sebastian
Kann es so sein: Beim Flashen ist Dein AVR ein Slave. Die SD-Karte, wenn sie steckt, auch. Also giebt sowohl Dein AVR als auch die SD unter Umständen gleichzeitig etwas auf die MISO aus -> Fehler.
Ich nehme mal an, dass Clk-Polarity und MSB-LSB stimmen, denn der VS-Chip gehorcht ja brav. Aber das ist doch wirklich total seltsam, dass ich die Geschwindigkeit nicht einstellen kann, weil dann das VS-INIT fehlschlägt. Ich hab ja auch den Programmer immer mit rausgenommen, wenn's nicht ging, aber das brachte auch keine Besserung. Ich schick heut Abend noch mal den kompletten Code für das SPI-INIT. Evtl. seht ihr da ja einen Fehler, obwohl ich da ja nix dran gedreht habe, ist ja fertiger Code.
@mini: Nein, dafür haben wir ja den Pullup auf CS der SD-Karte vorgesehen. Die Karte ist also inaktiv wenn der Port des Controllers auf Eingang oder High steht. Was aber sein könnte, dass der VS reinpfuscht. Ist dessen XCS und DCS (so heißen die zumindest beim VS1011) beide inaktiv? Ich geh zwar schwer davon aus, aber zur Sicherheit: Du versuchst nicht, den VS mit nur einer Chip-Select leitung zu betreiben, oder? Die VSs sind ja quasi zwei SPI-Devices in einem. Wenn man nur einen der beiden CS-pins nutzen will wird der andere durch Invertieren intern erzeugt. Dadurch ist aber immer eines der beiden Devices aktiv am Bus. Dann könnte es auch sein, dass er auf die SD-Init reagiert und irgendwas sendet. Wie gesagt: Nimm am besten mal alle anderen Teile vom SPI weg (also richtig die Leitung kappen) und versuch nur die Karte zu initialiseren. Das schließt schon mal ein paar Fehlerquellen aus. Sebastian
Der hat nur das XCS, aber ich werde den auch mal mit nem Pullup versehen.(VS1001k) Ich muss natürlich sagen, dass ich nun auch nicht grade den saubersten Aufbau habe. Die Kabel gehen mittlerweile kreuz und quer(naja nicht ganz so schlimm) über meine Leiterplatte. Leitungslänge zur SD-Karte ~5cm Heute Abend weiß ich mehr.
Verdammt noch mal!!! Ich hatte die Serienwiderstände vor der SD-Karte rausgenommen, da klappte der Init sofort. Jetzt hab ich auch den VS1001 wieder an den SPI dran, da kommen beim Programmieren wieder der Fehler. Wenn ich die Karte rausnehme klappt es aber. Ich hatte ja beim Test, diese Serienwiderstände erst mit nem Draht überbrückt. Da ging auch das Programmieren mit Karte wunderbar. Dann hab ich natürlich die Kabel direkt zum SPI geführt, denn ich dachte mir, jetzt läufts ja. Aber es war wohl so, dass die längere Leitung, was ja auch ein Serienwiderstand ist, den richtigen Wert hatte, so dass es klappte. In einem anderen Beispiel hat der Verfasser alle SPI-Leitungen an der Karte auch mit Pullups versehen. Was meint ihr dazu? Es ist zum Kotzen, das muss doch irgendwie zu machen sein. Was auch noch seltsam ist, ist der Fakt, dass beim Anstecken meiner Spannungsversorgung, die Karte und auch der VS1001 initialisiert wird. Dann lasse ich 3 Piepstöne ausgeben. So, wenn ich aber die Spannungszufuhr mittels meines Tasters, der hinter dem Spannungsregler sitzt, kappe, dann initialisiert zwar die Karte, aber das Piepsen bleibt aus. Erst nach dem Abstecken des Kabels klappt es. Misteriös, nicht?!
Woher weißt du, dass die Karte initialisiert wenn es nicht piept? Vielleicht verträgt der VS den schnellen (Prellenden) Spannungsanstieg über Schalter nicht. So richtig sicher wär ich mir da aber nicht. Um mal bischen Ordnung rein zu bringen: Du hast an den ISP-Pins des AVR die SD-Karte und den VS hängen. Außerdem wird über die gleichen Pins der AVR programmiert. Soweit passts, oder? Hier bin ich mir jetzt nicht sicher, obs bei dir so ist: Die SD Karte hat am CS einen Pullup. CS wird über einen GPIO gesteuert, den du unabhängig vom SPI in der hand hast. Das selbe beim VS. Wenn es so aufgebaut ist müsste beim Programmieren Folgendes passieren: Der Programmer setzt Reset vom AVR auf LOW, dann gehen durch die Pullups die CS-Leitungen vom VS und der SD-Karte high, wodurch sie sich am SPI auf High schalten. Damit gehört der SPI dem Programmer und alles müsste laufen. Solange du nicht programmierst sollte ein vernünftiger Programmer seine Pins auf Tristate stellen, womit auch alles in Butter ist. Zwischen SD und VS wählt der AVR dann aus. Soweit mal die Ordnung... Wenn du jetzt einen großen Kabelverhau hast, kann es sein, dass du Reflexionen und so Mist auf deine SPI-Leitungen bekommst. Das dürfte dann vor allem bei höheren SPI-Frequenzen stören. Wenn es mit oben beschriebener Schaltung nicht läuft, aber alle einzelverbindungen (AVR-Programmer, AVR-SD, AVR-VS jeweils allein als Paar) laufen, dann solltest du mal deinen Aufbau überprüfen. Die Leitungen sollten möglichst kurz sein und Knicke und Stecker solltest du auch möglichst vermeiden. Geh einfach mal die Punkte durch. Wenn's dann nicht läuft müsste ich mir echt mal dein Schaltplan, Software und Layout (Bild davon) anschaun. Hab nämlich auch keine Idee mehr :-( Sebastian
Ich lass mir immer über eine LED anzeigen, ob die Karte initialisier ist. Jetzt hat es komischerweise immer geklappt, also es kam keine Fehlermeldung von wegen 0x7C != 0x00 oder so. Auf jeden Fall ist der Aufbau ziemlich mistig, aber es ist ja auch nur ein Prototyp. Für später hatte ich sowieso geplant, das dann alles mit einer ordentlichen PCB zu machen. Aber das mit dem Piepen und dann mal wieder nicht Piepen ist schon komisch. Manchmal war es so, dass ich den Programmer abgezogen hatte und als sich der VS initialisierte und kein Piepen kam, und ich dann aber den Programmer drangesteckt hatte, da piepste es sofort.
Das hört sich dann doch bös nach einem unsauberen Aufbau an. Du solltest mal zumindest Vcc/GND und den SPI-Bus auch auf dem Proto sauber verlegen. Das könnte dir noch viel Ärger ersparen. Wo ichs grad mit Vcc hab: Vielleicht hab ich schon mal gefragt, aber 100nF KERKOS hast du an allen Versorgungspins dran, oder? Das kann nämlich auch schöne unerklärliche Fehler erzeugen wenn die zu weit weg sind vom pin, oder nicht jeder Vcc Pin einen hat, oder wenn sie sogar ganz fehlen. Viel Spass beim Löten. Und meld dich mal nochmal, obs dann zuverlässig geht. Gruß, Sebastian
Wie meinst du "an jedem"? Ich hab halt vor und nach dem Spannungsregler 100nF und 10uF. Und von dort gehen halt mehrere Kabel zu den jeweiligen VCC-Pins. Ich kann die Leitungen aber nicht anders verlegen. Höchstens noch 5 mm kürzen, mehr aber auch nicht. Sonst könnte ich mich ja gleich an nen komplett neuen Aufbau machen.
Wenn du nur am Spannungsregler Blockkondensatoren hast reicht das nicht. Jeder Vcc-Versorgungspin eines (digital)ICs braucht 100n nach Masse. Kerko natürlich. Der Kondensator muss so nah wie möglich an den den Pin des IC ran (so auf 5-10mm ungefähr). Die 10µ und 100n am Spannungsregler braucht er selbst, um eine stabile Spannung zu erzeugen und nicht ins Schwingen zu geraten (gibt dann auch lustige Effekte). Der Hintergrund: Beim Schalten von High nach Low bzw. umgekehrt brauchen Digital-ICs sehr viel Strom (verglichen mit dem, was sonst fliest). Deine Versorgungsleitung hat aber eine Eigeninduktivität. Die Große Stromänderung führt dann durch die Induktivität dazu, dass die Versorgungsspannung am IC kurzzeitig einbricht, was die ICs stören kann. Dann kommts zu unkontrollierten sporadischen Abstürzen und ähnlichem Mist. Die 100nF-Kerkos an Vcc fangen diese Stromspitzen auf. Damit sie wirken können müssen sie aber natürlich nah am Pin sein, sonst hast du wieder die Eigeninduktivität der Versorgungsleitung und alles war umsonst. Achso, 5mm am SPI werdens nicht rausreißen. Das kannst du dann sein lassen. Aber löte die Kerkos ein. Sebastian
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.