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
Lesezeichen