mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD-Card - SPI: kleine Fragen


Autor: Robert V. (malso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Ich will mit meinem 1Mhz Atmega8 von einer SD-Karte lesen können (:
PD0:  = CS
PD1:  = DI(Karte)
PD2:  = DO(KARTE)
PD3:  = CLK


Nun musste ich mir ne SoftwareSPI stricken. Laut Oszi sieht die 
Datenausgabe+Clock OK aus.



Ich hänge schon an der Initialisierung.

Ich sende 80 Takte mit CS und DI auf HIGH.
Anschließend send eich folgende 6 Bytes: 0x40 0x00 0x00 0x00 0x00 0x95 
mit CS auf LOW.
Darauf folgend sende ich ein Dummibyte und sollte parallel dazu eine 
0x01 erhalten ist das richtig?

Ich lese nur Nullen. Wenn ich DO mit 10kOhm auf Vcc (3.3V) lege lese ich 
nur 0xFF (der Pegel ist von Anfang an vorhanden!) Habe leider nur ein 
altes Röhrenoszi ohne Speicher.

Es gibt keine Interrupts.

Hier meine Sende-/Empfangsroutine.


R16 kriegt das Sendebyte und R20 enthält das Empfangsbyte.
R17 setze ich vorher immer auf 0 (ausser für die (74)oder 80 
Anfangstakte)

SPIBYTE:    ;hier soll ein Byte gesendet oder empfangen werden
 push r16
 push r17
 push r18
 push r19
 push r20
 push r21
 push r22

 ldi r20,0   ; Inputbyte auf Null setzen (r20 ist das gelesene Byte!)  
 ldi r21,8   ;Bit Downcounter
 ldi r19,128 ;Shiftbit = das Verglechsbit für die Schiebeoperationen

 
NBIT:    ;hier wird jetzt Bitweise vorrangegangen
 mov r18,r16  ;lade in r18 das Sendebyte 
 and r18,r19   ;Und-Verknüpfung mit dem Shiftbit
               
 breq SETZ       ;kommt Null raus?
SETO:            ;Wenn nein...
 ori r17,0b00000010  ;Setze PB1 (DI)
 andi r17,0b11110111  ;CLK auf Null (CS)     
 rjmp SETIT
SETZ:      ;wenn bei dem Bitvergleich(AND) keine Null rauskommt...
 andi r17,0b11110101   ;CLK (CS) und PB1 (DI) uf null
 nop                   ;Zeit schinden
SETIT:
 out PORTD,r17         ;Ausgabe auf PD
 rcall WBIT20          ;Warte 60 bis 70 µS
 
 
 in r22,PIND    ;lese PORTD ein
 andi r22,4    ;gucke ob PD2 steht (DO)
 cpi r22,4
 brne READZERO
READONE:    ;wenn ja dann
 or r20,r19    ;setze in r20 das Shiftbit
 rjmp READNBIT
READZERO:
 nop      ;wenn nicht, dann lasse r20
 READNBIT:
 
 lsr r19    ;schiebe das Shiftbit nach rechts (128->64, usw...)
 

  


 ori r17,0b00001000  ;setze das CLK-Bit
 out PORTD,r17    ;Ausgabe
 rcall WBIT20      ;warte wieder
 dec r21    ;Zähle den Bitzaehler runter
 brne NBIT    ; wenn alle 8 Bit durch sind beende die Routine
 
 pop  r22
 pop  r21
 pop  r19    ;ACHTUNG Um r20 als ausgabebyte zu behalten, wird r19 doppelt gepoppt
 pop  r19
 pop  r18  
 pop  r17
 pop  r16
ret



MfG Robert

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nun musste ich mir ne SoftwareSPI stricken.

Ja..diese steinalten Prozessoren ohne Hardware SPI. :-)
Aber egal, natuerlich geht es auch erstmal in Software.

> Laut Oszi sieht die Datenausgabe+Clock OK aus.

Du weisst das es vier verschiedene SPI-Mode gibt? Nur einer funktioniert 
immer, ein anderer oft und zwei niemals. (mit einem gegebenen Slave)

> Darauf folgend sende ich ein Dummibyte und sollte parallel
> dazu eine 0x01 erhalten ist das richtig?

Es ist schon was her das ich sowas programmiert habe, aber wenn ich das 
richtig erinnere dann muss eine Karte nicht sofort antworten. Es kann 
auch sein das sie erstmal einige Zeit mit 0xff antwortet bis sie bereit 
ist. Allerdings antworten viele Karten sofort. Das ist einer der Gruende 
warum nicht jede Software mit jeder Karte arbeitet. :-)

Ansonsten empfehle ich dir Elm-schaetzchen:

http://elm-chan.org/docs/mmc/mmc_e.html

Olaf

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch was...

Ich weiss, es ist nicht ganz unmoeglich, aber eine SD-Karte die immer 
mit 512Byte Blockgroesse arbeitet mit einem Prozessor ansprechen zu 
wollen der nur 1k internes Ram hat ist ein ganz doller Schmerz im Arsch. 
Das wuerde ich mir heute nicht mehr antun.

Olaf

Autor: Stefanus F. (stefanus)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guck mal von der avrfat32 Library 
(https://www.mikrocontroller.net/articles/AVR_FAT32) ab. Die fängt auch 
mit 80 Takten an, aber danach beginnt eine Schleife mit ziemlich viele 
Wiederholversuchen.

Die angehängte Datei mmc.c wird gilt auch für SD Karten

Autor: Robert V. (malso)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Danke für die Infos.

Leider kann ich kein C. Und somit werde ich nur wenig Schlau daraus. In 
dem C-Code wird nach 100 Fehlversuchen abgebrochen.



Der Link von Olaf ist gut, nebenbei habe ich noch ASM-Code gefunden und 
versuche erstmal alles zu verstehen.


MfG Robert

Autor: Kai A. (kaiand1) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber du kannst die Versuche ja erhöhen das mehr als 100 gemacht werden.
Zudem kannst du ja auch wenn x Fehlversuche gemacht wurden eine LED als 
Warnung zb Anzeigen lassen.

Autor: Robert V. (malso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich Veränderungen vorgenommen und das Timing angepasst. Wenn 
ich jetzt 0x40 0x00 0x00 0x00 0x00 0x95 sende kriege ich nach 
reprpduzierbar 8 Versuchen eine 0x1F als Antwort. Bei Verändern eines 
der Bytes, kriege ich keine Antwort. Nur was soll mir 0x1F sagen, oder 
lese ich die Bits falsch ein?


Ich habe es gerade mit einer anderen Karte probiert und ich kriege nach 
4 Versuchen ein 0xFF.   Irgendwas läuft falsch. Ich muss den 
Datenverkehr beobachten können.



gute Nacht

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  Nur was soll mir 0x1F sagen, oder lese ich die Bits falsch ein?

Weisst du, wie das Protokoll funktioniert? Offensichtlich nicht.

Lerne erstmal, wie die Karte funktioniert und welche 
Antworten/Fehlercodes es gibt. Erst danach macht es Sinn, zu 
programmieren.

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Letztlich muss natürlich die SD-Spezifikation die Grundlage sein, aber 
kennen Sie schon
http://elm-chan.org/docs/mmc/mmc_e.html ?

Mir hat dies vor einigen Jahren den Einstieg sehr erleichtert, "einen 
Griff an die Sache geschraubt", bildlich gesprochen.

Autor: Robert V. (malso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut den Infos und den Datenblättern sollte nach CMD00, ein R1 Response 
ankommen. Bei dem, abgesehen von dem Flag "Parameter Error", bei mir 
alle Flags gesetzt sind. Meine Software SPI muss ich nochmal überdenken.

Der letztgenannte Link ist sehr aufschlussreich. Im Netz findet man fast 
nur C Programmbeispiele zur SD-Kartenprogrammierung.
Hier kann man einen Assemblercode finden: 
http://www.elektronik-labor.de/AVR/T13contest/sdsound-tn13.htm

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.