SD kártya ISP módban fájl formátum nélkül

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Annak idején valamiért nem ment Hardweresen a SPI!
(Viszont most már tudom, hogy csak a sikeres SDinit után szabad teljes sebességre kapcsolni a HW SPI-t. :)
Ezért gyorsan átraktam SW SPI módba, mondván, hogy majd ha időm lesz megoldom.
De közben már mások megcsinálták szerencsére! Ilyenkor jár jól aki lusta!
Ha HW SPI-t akarsz Megtalálod a „KokkeKat_FAT- SDinit: és SPI declaration:” részekben.



Ui. Nem néztem a rajzott csak fejből ment. de valahol itt megvan az oldalón.
Robi nemrég idézte be.


Elöző link 27. oldal: „7 DataOut O Card to Host Data and Status”
Viszont ami az SD-n Input az AVR-en Output
:roll:

különben Itt írunk ki: Shiftout Spi_sda , Spi_scl , Sd_command , 0
Itt olvasunk be: Shiftin Spi_sdi , Spi_scl , Sd_data , 0
Jól látszik melyik láb mi! Nem is kellene kérdezni!
Csak gondolkozni picit!

Kód: Egész kijelölése

 ' Ez tetszőleges kiosztású lehet, az én eszközömhöz így volt célszerű 
  ' 1 szektor = 512 Byte 
  'MMC SD-RAM bekötése 
 Config Portb.0 = Output                                     ' SD - CS 
 Config Portb.1 = Output                                     ' SD - CLK 
 Config Pinb.2 = Input                                       ' SD - MOSI 
 Config Portb.3 = Output                                     ' SD - MISO 

 Sdcs Alias Portb.0 
 Clk Alias Portb.1 
 Mosi Alias Portb.2 
 Miso Alias Pinb.3

' SW-SPI is configured 
 Config Spi = Soft , Din = Pinb.2 , Dout = Portb.3 , Ss = Portb.0 , Clock = Portb.1 
 Enable Interrupts 
  
 ' 
 Spiinit
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

Hozzászólás Szerző: DOGMAN »

Hopp az SD prog.exe vel teszteltem
kiolvasom indulás után a frissen formázott kártyát
&H00-kat ad vissza
betöltöm a csupa &HFF -el feltöltött sample-t újra kiolvasom, és csupa &HFF
-et ad vissza.
De ha kikapcsolom a tápot majd vissza és újra kiolvasom akkor ismét &H00-al van tele a kártya...
Ez miért lehet?? Lehet hogy nem íródik be és csak a puffert olvasom vissza?

Az alap programon semmit nem változtattam csak proci def.et a lábakat és az lcd parancsokat kikommenteltem.

Kód: Egész kijelölése

'$regfile = "m32def.dat"
'$crystal = 7372800
'$baud = 9600

$regfile = "m8def.dat"
$crystal =  7372800                                                '7372800
$baud = 9600



'Cursor Off
'Echo Off

'SD kártya eredeti
'(
Config Pinc.4 = Input
Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.5 = Output

Spi_sdi Alias Pinc.4
Sd_csx Alias Portc.2
Spi_scl Alias Portc.3
Spi_sda Alias Portc.5
')

'SD kártya mega8

Config Portb.1 = Output
Config Portd.5 = Output
Config Portb.0 = Output
Config Pind.7 = Input

Spi_sdi Alias Pinb.1                                        ' SD - MOSI
Sd_csx Alias Portd.5                                        ' SD - CS
Spi_scl Alias Portb.0                                       ' SD - CLK
Spi_sda Alias Portd.7                                       ' SD - MISO


'Config Spi = Soft , Din = Pinb.3 , Dout = Portb.4 , Ss = Portb.2 , Clock = Portb.5
'Configure SPI in soft mode
Config Spi = Soft , Din = Portd.7 , Dout = Portb.1 , Ss = Portd.5 , Clock = Portb.0
Enable Interrupts
Spiinit



'Universal variables
Dim Dataword As Word
Dim Datavalue As Word

Dim Timeout As Byte
Dim Timeout_problem As Byte

Dim Bytecounter As Byte

Dim Uni_cntr As Byte
Dim Uni_cntr_min As Byte
Dim Uni_cntr_max As Byte

Dim Serialbyte As Byte

'Used for: SD micro card
Dim Sd_command As Byte
Dim Sd_data As Byte
Dim Sd_addr As Long

'Used for: Communication
Dim Rcv_string As String * 100

Dim Puffer(512) As Byte


Declare Sub Sd_init
Declare Sub Sd_readpic()
Declare Sub Sd_writepic()
Declare Sub Timeout_lcd
Declare Sub Sddata_writeout

Wait 2
Call Sd_init
'Upperline
'Lcd "Card init..."
Wait 1
If Timeout_problem = 1 Then
   Call Timeout_lcd
Else
   'Upperline
   'Lcd "SD init done"
   Wait 1
End If

Do
'Wait a command from serial
'Cls
'Upperline
'Lcd "Command?"

   Input Rcv_string Noecho
   Select Case Rcv_string

   Case "board?":
      Rcv_string = "SD Card Prog V1"
      Print Rcv_string

   Case "devid?":
      Rcv_string = "SD Card"
      Print Rcv_string

   Case "writesd":
      Input Rcv_string Noecho
      Sd_addr = Val(rcv_string)

      Input Rcv_string Noecho
      Uni_cntr_max = Val(rcv_string)

      Print "OK"

'     for uni_cntr_min=1 to uni_cntr_max

      'Cls
      'Upperline
      'Lcd "Addr:" ; Sd_addr ; "/" ; Uni_cntr_min ; "/" ; Uni_cntr_max


      For Datavalue = 1 To 512
         Input Serialbyte Noecho
         Puffer(datavalue) = Serialbyte
         Print "OK"
      Next

      Call Sd_writepic
      Sd_addr = Sd_addr + 512

'      Print "nextsect"
'      Next

      'Upperline
      'Lcd "SD data rcvd"
      Wait 1

   Case "readsd":
      Rcv_string = "sdaddr?"
      Print Rcv_string
      Input Rcv_string Noecho
      Sd_addr = Val(rcv_string)

      Input Rcv_string Noecho
      Uni_cntr_max = Val(rcv_string)

      For Uni_cntr_min = 1 To Uni_cntr_max
         'Cls
         'Lcd "Addr:" ; Sd_addr ; "/" ; Uni_cntr_min
         Call Sd_readpic()

         For Datavalue = 1 To 512
               Print Puffer(datavalue)
               Input Rcv_string Noecho
               If Rcv_string <> "OK" Then Exit For
         Next

         Sd_addr = Sd_addr + 512
      Next Uni_cntr_min

      If Rcv_string = "OK" Then
      Rcv_string = "enddata"
      Print Rcv_string

      'Upperline
      'Lcd "SD data sent"
      Wait 2
      End If
   End Select
Loop

$include "sd_routines.bas"

Sub Timeout_lcd
   'Cls
   'Upperline
   'Lcd "Card TIMEOUT!!!"
   Wait 5
End Sub
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Még nem jól van konfigolva a SW SPI-d!
AVR oldalról nézve
Eredeti Bemenet:
Config Pinc.4 = Input
Spi_sdi Alias Pinc.4

Nálad Bemenet:
Config Pind.7 = Input
Spi_sdi Alias Pinb.1 <<< Nem Jó!!!!

Eredeti Kimenet:
Config Portc.5 = Output
Spi_sda Alias Portc.5

Nálad kimenet:
Config Pind.7 = Input <<< Ez nem kimenet!!!
Spi_sda Alias Portd.7
:roll:

Ne a nevek tartalmára figyelj, mert meg kavarnak rosszul lettek megválasztva!
A Ki/Be meneteket hozd össze az SD kártya lábaival
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

Hozzászólás Szerző: DOGMAN »

Megy már!
valóban fel voltak cserélve...

Én már az elején meg szoktam az aliasokat csinálni és azokat irom utána mindenhova, de itt mire eszembe jutott már reggel lett :D

Kód: Egész kijelölése

'SD kártya mega8-ra kötve

Spi_sdi Alias Pind.7                                        ' SD - MOSI
Sd_csx Alias Portd.5                                        ' SD - CS
Spi_scl Alias Portb.0                                       ' SD - CLK
Spi_sda Alias Portb.1                                       ' SD - MISO

Config Spi_sdi = Input
Config Sd_csx = Output
Config Spi_scl = Output
Config Spi_sda = Output

'Configure SPI in soft mode
Config Spi = Soft , Din = Spi_sdi , Dout = Spi_sda , Ss = Sd_csx , Clock = Spi_scl

Enable Interrupts
Spiinit
Most már visszaolvassa restart után is, de persze még valami hiba van: sokszor csak 0-át ad vissza így is.
Írtam toggle LED parancsot az olvasási ciklusokba, és amikor jó adatok jönnek, akkor villog is mikor kell.
Amikor meg 0-ák jönnek akkor nem villog, tehát el sem jut az olvasási ciklusig.
Kösz a segítséget most már csak debugolni kell, hogy néha miért nem olvas rendesen.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Az itt használt „SD_Init” rutin írásakor még nagyon kezdő voltam eben a témában.
Ezért ne várj sokat tőle! Csak a kisméretű kártyákat ismeri fel helyesen.
És hiba ellenőrzés nincsen benne, csak jelzi ha nem OK válasz jön a kártyától.
:?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Itt 1 próbálkozás hibajavításra!
Ha gondolod, letesztelheted!
Hiba esetén 10* újra próbálja végrehajtani az adott rutint!

Kód: Egész kijelölése

' Sd_routines.bas
' Hiba esetén 10* újra próbálja végrehajtani az adott rutint!
'------------------------------------------------------------------------------
'| ROUTINES FOR SD MICRO CARD
'| Based on kapu48's code: http://avr.tavir.hu/modules.php?name=Forums&file=viewtopic&t=713
'------------------------------------------------------------------------------
Dim UjraP As Byte

Sub Sd_init
   Ujrap = 0
Ujra_proba1:                                                ' ERROR esetén 10* megpróbálja újból

   Set Sd_csx
   Sd_command = &HFF
   For Dataword = 1 To 74
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
   Next Dataword
   Sd_data = &HFF
   Reset Sd_csx
   Shiftout Spi_sda , Spi_scl , Sd_command , 0
Cmd0:                                                       ' Send CMD0: &H40 &H00 &H00 &H00 &H00 &H95
   Sd_command = &H40
   Shiftout Spi_sda , Spi_scl , Sd_command , 0
   Sd_addr = &H00000000
   Shiftout Spi_sda , Spi_scl , Sd_addr , 0
   Shiftout Spi_sda , Spi_scl , Sd_addr , 0
   Shiftout Spi_sda , Spi_scl , Sd_addr , 0
   Shiftout Spi_sda , Spi_scl , Sd_addr , 0
   Sd_command = &H95
   Shiftout Spi_sda , Spi_scl , Sd_command , 0

   Timeout = 0
   Timeout_problem = 0
   While Sd_data <> &H01
      Shiftin Spi_sdi , Spi_scl , Sd_data , 0
      Incr Timeout
      If Timeout = 255 Then
         Incr Ujrap
         If Ujrap < 10 Then
            Goto Ujra_proba1
         Else
            Goto Errortrap
         End If
      End If
   Wend
   Set Sd_csx
   Waitms 50
   Reset Sd_csx
   Sd_command = &HFF
Cmd1:                                                       ' Send CMD1: &H41, &H00, &HFF, &HFF                                               '
   Timeout = 0
   Timeout_problem = 0
   While Sd_data <> &H00
      Set Sd_csx
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftin Spi_sdi , Spi_scl , Sd_data , 0
      Reset Sd_csx
      Sd_command = &H41
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Sd_addr = &H00000000
      Shiftout Spi_sda , Spi_scl , Sd_addr , 0
      Sd_command = &HFF
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftin Spi_sdi , Spi_scl , Sd_data , 0
      Incr Timeout
      If Timeout = 255 Then
         Incr Ujrap
         If Ujrap < 10 Then
            Goto Ujra_proba1
         Else
            Goto Errortrap
         End If
      End If
   Wend
   Sd_command = &HFF
   Set Sd_csx
   Exit Sub

Errortrap:
   Timeout_problem = 1
End Sub
'------------------------------------------------------------------------------
Sub Sd_readpic()
   Ujrap = 0
Ujra_proba2:

   Set Sd_csx
   Sd_command = &HFF
   Shiftout Spi_sda , Spi_scl , Sd_command , 0
   Shiftin Spi_sdi , Spi_scl , Sd_data , 0

      Reset Sd_csx
      Shiftout Spi_sda , Spi_scl , Sd_command , 0

      Sd_command = &H51
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftout Spi_sda , Spi_scl , Sd_addr , 0
      Sd_command = &HFF
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftin Spi_sdi , Spi_scl , Sd_data , 0

      Timeout = 0
      Timeout_problem = 0
      While Sd_data <> 0
         Shiftin Spi_sdi , Spi_scl , Sd_data , 0
         Incr Timeout
         If Timeout = 255 Then
            Incr Ujrap
            If Ujrap < 10 Then
               Goto Ujra_proba2
            Else
               Goto Errortrap
            End If

         End If
      Wend

      Timeout = 0
      Timeout_problem = 0
      While Sd_data <> &HFE
         Shiftin Spi_sdi , Spi_scl , Sd_data , 0
         Incr Timeout
         If Timeout = 255 Then
            Incr Ujrap
            If Ujrap < 10 Then
               Goto Ujra_proba2
            Else
               Goto Errortrap
            End If
         End If
      Wend

      For Dataword = 1 To 512
         Shiftin Spi_sdi , Spi_scl , Uni_cntr , 0
         Puffer(dataword) = Uni_cntr
      Next Dataword

      Set Sd_csx
End Sub
'------------------------------------------------------------------------------
Sub Sd_writepic()
   Ujrap = 0
Ujra_proba3:

   Set Sd_csx
   Sd_command = &HFF
   Shiftout Spi_sda , Spi_scl , Sd_command , 0
   Shiftin Spi_sdi , Spi_scl , Sd_data , 0

      Reset Sd_csx
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
Cmd24:
      Sd_command = &H58
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftout Spi_sda , Spi_scl , Sd_addr , 0
      Sd_command = &HFF
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftin Spi_sdi , Spi_scl , Sd_data , 0

      Timeout = 0
      Timeout_problem = 0
      While Sd_data <> 0
         Shiftin Spi_sdi , Spi_scl , Sd_data , 0
         Incr Timeout
         If Timeout = 255 Then
            Incr Ujrap
            If Ujrap < 10 Then
               Goto Ujra_proba3
            Else
               Goto Errortrap
            End If
         End If
      Wend
      Sd_command = &HFE
      Shiftout Spi_sda , Spi_scl , Sd_command , 0

      For Dataword = 1 To 512
         Serialbyte = Puffer(dataword)
         Shiftout Spi_sda , Spi_scl , Serialbyte , 0
      Next Dataword

      Sd_command = &HFF
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftout Spi_sda , Spi_scl , Sd_command , 0
      Shiftin Spi_sdi , Spi_scl , Sd_data , 0
'Ha Sd_data=229 -> Írás létrejött
'Ha Sd_data=0   -> Kártya foglalt

      Shiftin Spi_sdi , Spi_scl , Sd_data , 0
      Timeout = 0
      Timeout_problem = 0
      While Sd_data = 0
         Shiftin Spi_sdi , Spi_scl , Sd_data , 0
         Incr Timeout
         If Timeout = 255 Then
            Incr Ujrap
            If Ujrap < 10 Then
               Goto Ujra_proba3
            Else
               Goto Errortrap
            End If
         End If
      Wend
      Set Sd_csx
End Sub
'------------------------------------------------------------------------------

Igaz a legjobb lenne az egész Lib-et feljavítani kicsit!
8)

Ui.: Még javítottam az "SD_INIT" részen! Vasárnap, 10:21
:wink:
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Emlékszem, mennyit zsibbadtam azon, hogy SD kártyát SPI módban hogyan írjak/olvassak nagy mennyiségű adattal.

Többek között az SD_Prog nevű szörny is ezért született, azonban most találtam egy professzionális megoldást:

hxxp://www.x-ways.net/winhex/

A program fájlrendszer nélkül is képes például egy USB-s kártyaolvasóba dugott SD kártya tartalmát írni-olvasni!

:wink:
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Nekem ez a link nem él!
:cry:
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

hxxp:// nélkül próbáld, vagy h t t p -vel.
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

nobody_hun írta:Emlékszem, mennyit zsibbadtam azon, hogy SD kártyát SPI módban hogyan írjak/olvassak nagy mennyiségű adattal.

Többek között az SD_Prog nevű szörny is ezért született, azonban most találtam egy professzionális megoldást:

hxxp://www.x-ways.net/winhex/

A program fájlrendszer nélkül is képes például egy USB-s kártyaolvasóba dugott SD kártya tartalmát írni-olvasni!

:wink:
Nem találom a linket, pedig jó lenne mert van egy sd kártyám ami valahogyan egy készülék használta (kicsi windows fut rajta) de saját rendszer szerint használja a kártyát így nem látni semmit a kártyaolvasóban. Valahogyan le kéne törölni és újra formázni.
Hogyan lehetne mégis feltörni?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Mit értesz feltörés alatt?
A kártyát FAT-ra leformázni? -> SDFormatter
A kódolási algoritmust visszafejteni? -> Esélytelen...
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

Jó hír hogy egy rossznak hitt kártyámat sikerült leformáznom így jó lett az sdformatter progival, viszont a fent nevezett kártyát nem látja, ha kiválasztom az olvasót akkor nem látja a kártyát, mintha semmi nem lenne benne.
Érdekes hogy az Arduino egyik sample könyvtárban levő sd tesztelő skatch is csak addig jut el hogy kiírja hogy SDHC kártya vagy mi, itt megáll.
Letöltöttem a winhex-et de sajnos az sem látta, illetve ez csak demo verzió -meg kellene venni- de nem ettől nem jó, (kísérleteztem vele egy floppy-val és a letörölt file tényleg ott van fizikailag a lemezen). :o
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A flash vagy a vezérlője is lehet sérült. Az SDHC az a vezérlő adja vissza. A flash ez után lenne:(
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

Hozzászólás Szerző: glezmen »

GPeti írta:Jó hír hogy egy rossznak hitt kártyámat sikerült leformáznom így jó lett az sdformatter progival, viszont a fent nevezett kártyát nem látja, ha kiválasztom az olvasót akkor nem látja a kártyát, mintha semmi nem lenne benne.
Érdekes hogy az Arduino egyik sample könyvtárban levő sd tesztelő skatch is csak addig jut el hogy kiírja hogy SDHC kártya vagy mi, itt megáll.
Letöltöttem a winhex-et de sajnos az sem látta, illetve ez csak demo verzió -meg kellene venni- de nem ettől nem jó, (kísérleteztem vele egy floppy-val és a letörölt file tényleg ott van fizikailag a lemezen). :o
Linux alatt:

dd if=/dev/sdc of=sd.dat bs=1M

illetve /dev/sdc helyett ahol a kartyat latja (berakas utan a dmesg parancs megmutatja)

ha mar ez sem megy, akkor a kartya vagy az olvaso rossz

ha megy, akkor ugyanez masik iranyban (ez torol mindent a kartyarol!)

dd if=/dev/zero of=/dev/sdc bs=1M

utana meg kell probalni particionalni/formazni, hatha...
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

Nem rossz a kártya ugyanis több is van belőle, a kártyát látja a saját készüléke de már nincs rájuk szükség.
Válasz küldése