-         

Ergebnis 1 bis 6 von 6

Thema: SD-Karte an Mega16 läuft nicht!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.04.2005
    Alter
    32
    Beiträge
    84

    SD-Karte an Mega16 läuft nicht!

    Anzeige

    Hallo Leute,

    ich habe eine SD-Karte an die HW-SPI eines Mega16 angeschlossen. Die Spannungsversorgung geschieht über LM317 mit entsprechende Widerständen (ziemlich genau 3,33V) und die Anpassung der SIgnale über Spannungsteiler.

    Die Signale habe ich nachgemessen und sie betragen etwa 3,1V - das sollte für die Karte wohl durchaus als HIGH erkannt werden?!

    Ich bekomme jedoch immer einen Initialisierungsfehler! An der Karte habe ich noch direkt einen kleinen Elko sowie 100nF Kerko angelötet, da mir das als zumindest nicht falsch erschien.
    Die Leitungslängen betragen etwa 5cm.

    Habe bereits 3 verschiedene Karten ausprobiert (16mb, 512mb, 1gb) und auch verschiedene Controller und es ändert nichts.

    Wenn ich die Karte nach dem initialsierungsversuch aus meiner Testschaltung nehme und in meine Digitalkamera lege funktioniert sie einwandfrei, aber es befindet sich eine unlesbare Datei auf der Karte!!

    Könnte sich jemand bitte mal anschauen ob in meinem Code irgendein Fehler steckt?

    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 32
    $framesize = 64
    $baud = 9600
    
    Declare Sub Sramdump(byval Pwsrampointer As Word , Byval Pwlength As Word)
    
    Startmark:
    
    $Include "Config_MMC.bas"
    '$Include "Config_XRAMDrive0.bas" ' Zum Testen mit dem Simulator
    
    If Gbdriveerror <> 0 Then
    Print "MMC/SD Initialisierung fehlgeschlagen"
    Goto Startmark
    End If
    
    Dim Berror As Byte
    Dim Abuffer(512) As Byte                                    ' SRAM-Bereich für den Transfer
    Dim Wsrampointer As Word                                    ' Adress-Pointer für den Drive... Routine
    Dim Lsectornumber As Long                                   ' Variable für Sektor-Nummer
    
    
    ' Adresse des Buffers in die Variable
    
    Wsrampointer = Varptr(abuffer(1))
    
    ' Die ersten 100 Sektoren ausgeben
    For Lsectornumber = 0 To 100
    
       Berror = Drivereadsector(wsrampointer , Lsectornumber)
       ' Konnte der Sektor eingelesen werden?
       If Berror > 0 Then
          Print "Drive Fehler: " ; Berror ; " bei Sektor " ; Lsectornumber
          Exit For
       End If
    
       Print "Sektor " ; Lsectornumber
    
       ' Sektor ausgeben
       Sramdump Wsrampointer , 512
    
    Next
    
    Goto Startmark
    
    End
    
    
    
    
    
    Sub Sramdump(byval Pwsrampointer As Word , Byval Pwlength As Word)
        ' Dump a Part of SRAM to Print-Output #1
        ' pwSRAMPointer: (Word) Variable which holds the address of SRAM to dump
        ' pwLength: (Word) Count of Bytes to be dumped (1-based)
        Local Lsdump As String * 16
        Local Lbyte1 As Byte , Lbyte2 As Byte
        Local Lword1 As Word , Lword2 As Word
        Local Llong1 As Long
    
        If Pwlength > 0 Then
          Decr Pwlength
          For Lword1 = 0 To Pwlength
             Lword2 = Lword1 Mod 8
             If Lword2 = 0 Then
                If Lword1 > 0 Then
                   Print " " ;
                End If
             End If
             Lword2 = Lword1 Mod 16
             If Lword2 = 0 Then
                If Lword1 > 0 Then
                   Print "  " ; Lsdump
                End If
                Llong1 = Lword1
                Print Hex(llong1) ; "  " ;
                Lsdump = "                "
                Lbyte2 = 1
             End If
             Lbyte1 = Inp(pwsrampointer)
             Incr Pwsrampointer
             Print Hex(lbyte1) ; " " ;
             If Lbyte1 > 31 Then
                Mid(lsdump , Lbyte2 , 1) = Lbyte1
             Else
                 Mid(lsdump , Lbyte2 , 1) = "."
             End If
             Incr Lbyte2
          Next
          Print "   " ; Lsdump
        End If
        Incr Pwlength
    End Sub
    in der config mmc stht das folgende:

    Code:
    '-------------------------------------------------------------------------------
    '                         Config_MMC.BAS
    '               Config File for MMC Flash Cards Driver
    '        (c) 2003-2005 , MCS Electronics / Vögel Franz Josef
    '-------------------------------------------------------------------------------
    ' Place MMC.LIB in the LIB-Path of BASCOM-AVR installation
    '
    'Connection as following
    'MMC    M128/M103
    '1      MMC_CS PORTB.0
    '2      MOSI PORTB.2
    '3      GND
    '4      +3.3V
    '5      CLOCK PORTB.1
    '6      GND
    '7      MISO, PORTB.3
    
    ' you can vary MMC_CS on HW-SPI and all pins on SOFT-SPI, check settings
    ' ========== Start of user definable range =====================================
    
    ' you can use HW-SPI of the AVR (recommended) or a driver build in Soft-SPI, if
    ' the HW-SPI of the AVR is occupied by an other SPI-Device with different settings
    
    
    ' --------- Start of Section for HW-SPI ----------------------------------------
    
       ' define Chip-Select Pin
       Config Pinb.4 = Output                                   ' define here Pin for CS of MMC/SD Card
       Mmc_cs Alias Portb.4
       Set Mmc_cs
    
       ' Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
       ' If an other Pin than SS is used for MMC_SS, SS must be set to OUTPUT and high for proper work of SPI
       ' otherwise AVR starts SPI-SLAVE if SS-Pin is INPUT and goes to LOW
       Config Pinb.4 = Output                                   ' define here Pin of SPI SS
       Spi_ss Alias Portb.4
       Set Spi_ss                                               ' Set SPI-SS to Output and High for Proper work of
                                                                ' SPI as Master
    
       ' HW-SPI is configured to highest Speed
       Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
    '   Spsr = 1                                       ' Double speed on ATMega128
       Spiinit                                                  ' Init SPI
    
    
    ' ========== End of user definable range =======================================
    
    
    ' Error
    Const Cperrdrivereset = 225                                 ' Error response Byte at Reset command
    Const Cperrdriveinit = 226                                  ' Error response Byte at Init Command
    Const Cperrdrivereadcommand = 227                           ' Error response Byte at Read Command
    Const Cperrdrivewritecommand = 228                          ' Error response Byte at Write Command
    Const Cperrdrivereadresponse = 229                          ' No Data response Byte from MMC at Read
    Const Cperrdrivewriteresponse = 230                         ' No Data response Byte from MMC at Write
    Const Cperrdrive = 231
    Const Cperrdrivenotsupported = 232                          ' return code for DriveGetIdentity, not supported yet
    
    Waitms 1                                                    ' Wait some time before initialising MMC/SD
    Dim Gbdriveerror As Byte                                    ' General Driver Error register
    Dim Gbdriveerrorreg As Byte                                 ' Driver load Error-Register of HD in case of error
    Dim Gbdrivestatusreg As Byte                                ' Driver load Status-Register of HD on case of error
    Dim Gbdrivedebug As Byte
    $lib "MMC.LIB"                                              ' link driver library
    $external _mmc
    Gbdriveerror = Driveinit()                                  ' Init MMC/SD Card

    EDIT: auch wenn Ihr keine Fehler findet würde ich euch bitten hier wiederzugeben wo noch Fehler stecken könnten.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    18.04.2005
    Alter
    32
    Beiträge
    84

    karte

    ich werde gleich zum testen noch eine nagelneue karte kaufen. wenns dann noch immer nicht läuft weiss ich irgendwie auch nicht mehr weiter.

    lief das bei euch einfach so ohne probleme??

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.07.2006
    Alter
    24
    Beiträge
    138
    Zitat aus dem Wikipedia-Artikel zu SD und MMC:
    Das Betreiben von SD-Karten in Geräten, die nur für MMC ausgelegt sind, ist hingegen nicht möglich.
    MMC kann von SD-Geräten verwendet werden, nicht aber umgekehrt. Dein Code ist (nach den Kommentaren zu schließen) für MMCs ausgelegt.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    18.04.2005
    Alter
    32
    Beiträge
    84
    ich habe den schuldigen!!! es war ganz stumpf und einfach meine stiftleiste, die de signale nicht rüberbekommen hat. habe jetzt eine 16mb sd-karte direkt mit den kontakten angelötet und es läuft ohne probleme!!!!!!!

    hier noch das logfile (per realterm) der ersten 100 sektoren der sd-card (frisch formatiert mit panasonic sd-card formatter tool).
    http://www.file-upload.net/download-...pture.txt.html

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    dann stimmt die initialisierung der SPI nicht.
    scheinbar ist der Port als Ausgang konfiguriert
    und du ziehst den auf 0 bzw. 5V
    Die Karte sollte ja nur die 3V3 ausgeben als Highpegel.

    Dein Programmablauf gefällt mir
    persönlich auch nicht so besonders ... goto meide ich
    wie der Teufel das Weihwasser ... Do Loop Until ist
    mir persönlich sympatischer

    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 32
    $framesize = 64
    $baud = 9600
    
    Declare Sub Sramdump(byval Pwsrampointer As Word , Byval Pwlength As Word)
    
    Dim Berror As Byte
    Dim Abuffer(512) As Byte                                    ' SRAM-Bereich für den Transfer
    Dim Wsrampointer As Word                                    ' Adress-Pointer für den Drive... Routine
    Dim Lsectornumber As Long                                   ' Variable für Sektor-Nummer
    
    
    do
    
    $Include "Config_MMC.bas"
    '$Include "Config_XRAMDrive0.bas" ' Zum Testen mit dem Simulator
    
    If Gbdriveerror <> 0 Then
    Print "MMC/SD Initialisierung fehlgeschlagen"
    End If
    
    loop until Gbdriveerror <> 0
    
    do
    ' Adresse des Buffers in die Variable
    
    Wsrampointer = Varptr(abuffer(1))
    
    ' Die ersten 100 Sektoren ausgeben
    For Lsectornumber = 0 To 100
    
       Berror = Drivereadsector(wsrampointer , Lsectornumber)
       ' Konnte der Sektor eingelesen werden?
       If Berror > 0 Then
          Print "Drive Fehler: " ; Berror ; " bei Sektor " ; Lsectornumber
          Exit For
       End If
    
       Print "Sektor " ; Lsectornumber
    
       ' Sektor ausgeben
       Sramdump Wsrampointer , 512
    
    Next
    
    loop
    
    End
    seltsamerseise wird die SPI aber in der Lib deklariert:
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
    Spiinit ' Init SPI
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    18.04.2005
    Alter
    32
    Beiträge
    84
    *grübel* ähm deine antwort macht sinn auf meinen ersten beitrag aber den hab ich schon vor stunden geändert.

    im anhang noch 2 bilder der geknackten karte und meiner testschaltung
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken imgp0714.jpg   imgp0713.jpg  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •