Forum: Mikrocontroller und Digitale Elektronik Atmega, SD-Card, VS1001 an SPI


von Johannes (menschenskind)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Johannes (menschenskind)


Lesenswert?

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.

von Zippi (Gast)


Lesenswert?

Der fehler kommt obwohl du nur den connector ohne Sd angeschlossen hast? 
Oder wie hast du die SD karte angeschlossen?

von Johannes (menschenskind)


Lesenswert?

Nene, SD-Karte steckt schon drin. Ich hab ja schließlich keine Lust, die 
ständig hin und her zu stecken

von Phil S. (zippi)


Lesenswert?

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?

von Johannes (menschenskind)


Lesenswert?

Leider noch keine Zeit gehabt, bin noch auf Arbeit ;-)

von Johannes (menschenskind)


Lesenswert?

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?

von Sebastian (Gast)


Lesenswert?

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

von Johannes (menschenskind)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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

von Johannes (menschenskind)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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

von Johannes (menschenskind)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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

von Johannes (menschenskind)


Lesenswert?

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.

von Johannes (menschenskind)


Lesenswert?

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?

von Sebastian (Gast)


Lesenswert?

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

von Johannes (menschenskind)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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

von mini (Gast)


Lesenswert?

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.

von Johannes (menschenskind)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

@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

von Johannes (menschenskind)


Lesenswert?

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.

von Johannes (menschenskind)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Johannes (menschenskind)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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

von Johannes (menschenskind)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.