PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme SD Karte lesen und schreiben



carlos_soost
15.01.2007, 14:11
Hallo zusammen,

bin grade dabei ein bissl mit ner sd karte zu experimentieren. Reset und initialisierung funktionieren auch, aber das lesen und schreiben will einfach nicht funktionieren. mache folgendes:

cs der karte auf low
&H51 über spi senden
dann adresse als long senden
&HFF senden und auf &H00 als Antwort warten

Da hab ich schon das erste problem. Ich bekomme meistens &HFF als antwort. wenn ich dann mal 00 kriege warte ich auf das Starttoken &HFE.
Aber das bekomme ich garnicht. Woran kann das liegen??

Liegt es vielleicht an der Adresse?Mache da folgendes:

Dim Bereich as Long
Bereich = 1
Bereich = Bereich * 512

Ich weiß das es dafür die MMC.LIB gibt und habe damit auch schon erfolgreich die karte beschrieben und gelesen, doch ich würd es halt auch gern ohne die schaffen.

Nutze den Hardware SPI mit 1/16 Taktfrequenz..

Bin für jede Hilfe dankbar....

mfg
Matze

carlos_soost
15.01.2007, 16:11
Das Problem mit dem lesebefehl hat sich erledigt....
Wenn ich Bereich = 2 setze dann bekomme ich ein FE aber bei allen anderen bereichen bekomme ich 00 oder FF. Hat einer ne Ahnung was der Fehler sein könnte????

carlos_soost
17.01.2007, 15:12
So. Lesen und schreiben funktioniert fast.
Hab einen Block auf die Karte geschrieben und dann zurück gelesen. Die gelesenen Werte stimmen auch mit dem überein was ich geschrieben habe, bis auf zwei Byte.

das 4. und 5. byte enthalten werte die ich mir nicht erklären kann. vielleicht hat ja einer von euch ne ahnung wie dass zu stande kommen könnte.




$regfile = "m128103.dat"
$crystal = 7372800
$baud = 9600

Config Portd.0 = Output : Set Portd.0 'Pin für die Displaybeleuchtung
Config Portd.2 = Output

Cskarte Alias Portd.2 : Set Cskarte


Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 16 , Noss = 0 , Interrupt = Off

Spiinit

'*********** Variablen ************************************************** *******
Dim Cmdbyte As Byte
Dim Cnt As Byte
Dim Fktcnt As Byte
Dim Cntword As Word
Dim Antwortr1 As Byte
Dim 512byteblock(512) As Byte
'********* Sektornummer bestimmen **********************************************
Dim Sektor As Byte
Dim Adresse As Long


'Adresse bestimmen
Adresse = Sektor * 512

'************** FUNKTIONEN ************************************************** ***


'************ Kartenreset ************************************************** ****
Kartenreset:
Do
Cnt = 0
Set Cskarte

Cmdbyte = &HFF
For Cnt = 1 To 10
Spiout Cmdbyte , 1
Next Cnt
Cnt = 0

Reset Cskarte
Cmdbyte = &H40
Spiout Cmdbyte , 1

Cmdbyte = &H00
For Cnt = 1 To 4
Spiout Cmdbyte , 1
Next Cnt
Cnt = 0

Cmdbyte = &H95
Spiout Cmdbyte , 1

Cmdbyte = &HFF

Do
Spiout Cmdbyte , 1
Spiin Antwortr1 , 1
Incr Cnt
Loop Until Cnt = 255 Or Antwortr1 = &H01
Incr Fktcnt
Loop Until Antwortr1 = &H00 Or Fktcnt = 255

Set Cskarte
Return


'************ Karte initialisieren *********************************************
Karteninit:
Do
Cnt = 0
Reset Cskarte

Cmdbyte = &H41
Spiout Cmdbyte , 1

Cmdbyte = &H00
For Cnt = 1 To 4
Spiout Cmdbyte , 1
Next Cnt
Cnt = 0

Cmdbyte = &HFF
Spiout Cmdbyte , 1

Do

Spiin Antwortr1 , 1
Incr Cnt
Loop Until Cnt = 255 Or Antwortr1 = &H00
Incr Fktcnt
Loop Until Antwortr1 = &H00 Or Fktcnt = 255

Set Cskarte
Return

'************ Reset und Initialisierung zusammen *******************************
Karteaktivieren:
Gosub Kartenreset
Gosub Karteninit
Return

'************ 512 Byte Block lesen *********************************************
Blocklesen:
Cnt = 0
Reset Cskarte

Cmdbyte = &HFF
For Cnt = 1 To 5
Spiout Cmdbyte , 1
Next Cnt

Cmdbyte = &H51
Spiout Cmdbyte , 1

Spiout Adresse , 4

Cmdbyte = &HFF


Do
Spiout Cmdbyte , 1
Spiin Antwortr1 , 1
Incr Cnt
Loop Until Cnt = 255 Or Antwortr1 = &H00
Cnt = 0

Do
Spiout Cmdbyte , 1
Spiin Antwortr1 , 1

Incr Cntword
Loop Until Cntword = &HFFFFFFFF Or Antwortr1 = &HFE

If Antwortr1 < &HFE Or Antwortr1 > &HFE Then
Return
End If

Spiin 512byteblock(1) , 512

Spiin Antwortr1 , 1
Spiin Antwortr1 , 1

Set Cskarte

Return


'************ Block schreiben **************************************************
Blockschreiben:
Cnt = 0
Reset Cskarte

Cmdbyte = &HFF
For Cnt = 1 To 10
Spiout Cmdbyte , 1
Next Cnt

Cmdbyte = &H58
Spiout Cmdbyte , 1
Spiout Adresse , 4

Cmdbyte = &HFF

Do
Spiout Cmdbyte , 1
Spiin Antwortr1 , 1
Incr Cnt
Loop Until Cnt = 255 Or Antwortr1 = &H00


Cnt = 0
Do
Spiout Cmdbyte , 1
Waitms 1
Incr Cnt
Loop Until Cnt = 100

Cmdbyte = &HFE
Spiout Cmdbyte , 1

Spiout 512byteblock(1) , 512

Cmdbyte = &HFF
Spiout Cmdbyte , 1
Spiout Cmdbyte , 1

Cnt = 0

Do
Spiout Cmdbyte , 1
Spiin Antwortr1 , 1
Incr Cnt
Loop Until Antwortr1 = 5 Or Cnt = 255

Waitms 50

Set Cskarte

Return