carlos_soost
15.01.2007, 15: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, 17: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, 16: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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.