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.
Code:$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







Zitieren
Lesezeichen