PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SD-Karte an Mega16 läuft nicht!



tauruz
09.07.2008, 20:01
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?


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


'-------------------------------------------------------------------------------
' 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.

tauruz
10.07.2008, 12:57
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??

dieta
10.07.2008, 13:38
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.

tauruz
10.07.2008, 17:50
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!!!!!!! :D

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-971701/capture.txt.html

Vitis
10.07.2008, 23:34
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




$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

tauruz
10.07.2008, 23:48
*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