tauruz
09.07.2008, 21: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.
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.