A problémám a következő:
SD memória kártyát használok adattárolásra Dos nélkül szabadon. Az itt közölt keretprogramot használva tudok írni és olvasni 512 Byte-os szektoronként, ahogy kell.
A projektemhez 16 és 32 MByte -os SD kártyát használok, mert ez a kisméretű memória nekem eddig megfelelt mérési adatok tárolására, de szeretném bővíteni az adatbázisomat. 256 MByte és az 1GByte -os kártyánál már csak az inicializáláson jut túl, írni és olvasni már nem tud. van valakinek ötlete, hogy mit változtassak rajta ? (a kártyák jók)
A mikrovezérlőmben rengeteg egyéb program lapul, így nem szeretnék AVR-DOS -t használni.
A segítségeteket előre is köszönöm: Tom
Kód: Egész kijelölése
'-------------------------------------------------------------------------------
'
' ATMega328 3,3V 8MHZ
' 1 szektor = 512 Byte
'
'-------------------------------------------------------------------------------
' Ez tetszőleges kiosztású lehet, az én eszközömhöz így volt célszerű
Config Portb.7 = Output ' SD - CS
Config Pind.5 = Input ' SD - MOSI
Config Portd.6 = Output ' SD - CLK
Config Portd.7 = Output ' SD - MISO
Cs Alias Portb.7
Mosi Alias Portd.5
Clk Alias Portd.6
Miso Alias Pind.7
Const Msbl = 0
Dim Dat As Byte
Dim Addr As Long
Dim Eaddr As Long
Dim Adat As Byte
Dim A As Byte
Dim B As Byte
Dim J As Long
Dim Puffer(512) As Byte
Dim Mondat As String * 16
'Szubrutinok
Declare Sub Sdinit
Declare Sub Sdread(byval Addr As Long )
Declare Sub Sdwrite(byval Byval Addr As Long )
Waitms 100
Config Spi = Soft , Din = Pind.5 , Dout = Portd.7 , Ss = Portb.7 , Clock = Portd.6
Enable Interrupts
Enable Spi
Spiinit
'============================== F Ő P R O G R A M ==============================
'-------------
'Inicializálás
Sdinit
'-------------
'-------------
'Kezdő cím
Addr = 0
'-------------
Kezd:
'--------------------------
'Olvasás rutin -> Start cím
Sdread Addr
J = 0
For A = 1 To 32
Mondat = ""
For B = 1 To 16
Incr J
Mondat = Mondat + Chr(puffer(j))
Next B
Print Mondat
Next A
'--------------------------
'-----------------------
'Írás rutin -> Start cím
'Mwrite Addr
'-----------------------
'Addr = Addr + 512
'Goto Kezd
End
'====================== I N I C I A L I Z Á L Á S ==============================
Sub Sdinit
Set Cs
Dat = &HFF
For J = 1 To 10
Shiftout Mosi , Clk , Dat , Msbl
Next J
Adat = &HFF
Reset Cs
Cmd0:
Dat = &H40
Shiftout Mosi , Clk , Dat , Msbl
Addr = &H00000000
Shiftout Mosi , Clk , Addr , Msbl
Dat = &H95
Shiftout Mosi , Clk , Dat , Msbl
While Adat <> &H01
Shiftin Miso , Clk , Adat , Msbl
Wend
Set Cs
Waitms 50
Reset Cs
Dat = &HFF
Cmd1:
While Adat <> &H00
Set Cs
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Adat , Msbl
Reset Cs
Dat = &H41
Shiftout Mosi , Clk , Dat , Msbl
Addr = &H00000000
Shiftout Mosi , Clk , Addr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Adat , Msbl
Wend
Dat = &HFF
Set Cs
End Sub
'====================== O L V A S Á S (Addr léptetése) ========================
Sub Sdread(byval Addr As Long)
Set Cs
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Adat , Msbl
Reset Cs
Dat = &H51
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Addr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Adat , Msbl
While Adat <> 0
Shiftin Miso , Clk , Adat , Msbl
Wend
While Adat <> &HFE
Shiftin Miso , Clk , Adat , Msbl
Wend
'---------------
For J = 1 To 512
Shiftin Miso , Clk , Adat , Msbl
Puffer(j) = Adat
Next J
'---------------
Set Cs
End Sub
'====================== Í R Á S (Addr léptetése) =============================
Sub Sdwrite(byval Addr As Long)
Cmd24:
Set Cs
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Adat , Msbl
Reset Cs
Dat = &H58
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Addr , Msbl
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Adat , Msbl
While Adat <> 0
Shiftin Miso , Clk , Adat , Msbl
Wend
Dat = &HFE
Shiftout Mosi , Clk , Dat , Msbl
'---------------
For J = 1 To 512
Adat = Puffer(j)
Shiftout Mosi , Clk , Adat , Msbl
Next J
'---------------
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Adat , Msbl
'Ha Adat=229 -> Írás létrejött
'Ha Adat=0 -> Kártya foglalt
Shiftin Miso , Clk , Adat , Msbl
While Adat = 0
Shiftin Miso , Clk , Adat , Msbl
Wend
Set Cs
End Sub
'-------------------------------------------------------------------------------