-         

Ergebnis 1 bis 3 von 3

Thema: mmc-karte mit bascom

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    12.05.2007
    Beiträge
    31

    mmc-karte mit bascom

    Anzeige

    ' Declare here you SPI-Mode
    ' using HW-SPI: cMMC_Soft = 0
    ' not using HW_SPI: cMMC_Soft = 1

    Const cMMC_Soft = 0

    #IF cMMC_Soft = 0

    ' --------- 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 M12
    ' 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 por 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 Section for HW-SPI ------------------------------------------

    #ELSE ' Config here SPI pins, if not using HW SPI

    ' --------- Start of Section for Soft-SPI --------------------------------------

    ' Chip Select Pin => Pin 1 of MMC/SD
    Config PinB.3 = Output
    MMC_CS Alias PortB.3
    Set MMC_CS

    ' MOSI - Pin => Pin 2 of MMC/SD
    Config PinB.5 = Output
    Set PinB.5
    MMC_PortMOSI Alias PortB
    bMMC_MOSI Alias 5

    ' MISO - Pin => Pin 7 of MMC/SD
    Config PinB.6 = Input
    MMC_PortMISO Alias PinB
    bMMC_MISO Alias 6

    ' SCK - Pin => Pin 5 of MMC/SD
    Config PinB.7 = Output
    Set PinB.7
    MMC_PortSCK Alias PortB
    bMMC_SCK Alias 7

    ' --------- End of Section for Soft-SPI ----------------------------------------

    #ENDIF

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

    hallo, wenn ich auf hardware gehe und für den AVR portb4 nehme , kommt eine fehlermeldung :

    ' 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 M12
    ' 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 por 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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    09.04.2007
    Ort
    Frankenwinheim
    Alter
    48
    Beiträge
    68
    hallo,
    ist das problem jetzt scho gelöst?
    Ich versuche es gerade mit einen ATMega 16.
    Ich komme aber auch nicht wirklich weiter.

    Gruß Uwe

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.01.2008
    Beiträge
    164
    les dir den code durch. er läuft mit dem atmega16. stell die mhz ein und schau wo du deine sd-karte angeklemmt hast und änders das dementsprechend. sector 0-2 wird beschrieben und gelesen.
    bei mir läuft es 100%tig.


    Code:
    $regfile = "m16def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 64
    $crystal = 8000000
    $baud = 19200
    
    Declare Sub Mc_init()
    Declare Sub Mc_write()
    Declare Sub Mc_read()
    
    Dim Dout As Byte
    Dim Din As Byte
    Dim A As Word
    Dim Cmd(6) As Byte
    Dim Buffer(515) As Byte
    Dim Tmp As Long
    Dim Sector As Long
    
    Mcs Alias Portb.4
    Mosi Alias Portb.5
    Miso Alias Pinb.6
    Sck Alias Portb.7
    
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Input
    Config Pinb.7 = Output
    
    Waitms 255
    
    Buffer(1) = &HFE
    Buffer(514) = &HFF
    Buffer(515) = &HFF
    
    For A = 2 To 513
       Buffer(a) = 14
    Next
    Call Mc_init()
    Sector = 0
    Call Mc_write()
    
    For A = 2 To 513
       Buffer(a) = 15
    Next
    Call Mc_init()
    Sector = 1
    Call Mc_write()
    
    For A = 2 To 513
       Buffer(a) = 16
    Next
    Call Mc_init()
    Sector = 2
    Call Mc_write()
    
    Print
    Print
    Wait 1
    
    ' auslesen
    Wait 1
    Call Mc_init()
    Sector = 0
    Call Mc_read()
    
    For A = 2 To 30
       Print "wert: " ; Buffer(a)
       Waitms 50
    Next
    
    'auslesen
    Wait 1
    Call Mc_init()
    Sector = 1
    Call Mc_read()
    
    For A = 2 To 30
       Print "wert: " ; Buffer(a)
       Waitms 50
    Next
    
    'auslesen
    Wait 1
    Call Mc_init()
    Sector = 2
    Call Mc_read()
    
    For A = 2 To 30
       Print "wert: " ; Buffer(a)
       Waitms 50
    Next
    
    End
    
    Sub Mc_init()
    
       Set Mcs
    
       Dout = &HFF
       For A = 0 To 10
          Shiftout Mosi , Sck , Dout , 1 , 8 , 0
       Next
    
    Anfang:
       Reset Mcs
    
       Cmd(1) = &H40
       Cmd(2) = 0
       Cmd(3) = 0
       Cmd(4) = 0
       Cmd(5) = 0
       Cmd(6) = &H95
       For A = 1 To 6
          Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> 1 Then
          Goto Anfang
       End If
       Print "idle-modus " ; Din
    
    Anfang1:
       Reset Mcs
    
       Cmd(1) = &H41
       Cmd(2) = 0
       Cmd(3) = 0
       Cmd(4) = 0
       Cmd(5) = 0
       Cmd(6) = &HFF
       For A = 1 To 6
          Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> 0 Then
          Goto Anfang1
       End If
       Print "betriebs-modus " ; Din
    
       Set Mcs
    End Sub
    
    Sub Mc_read()
       Set Mcs
    
       Cmd(1) = &H51
       Cmd(2) = 0
       Cmd(3) = 0
       Cmd(4) = 0
       Cmd(5) = 0
       Cmd(6) = &HFF
    
       Shift Sector , Left , 9
    
       Tmp = Sector And &HFF000000
       Shift Tmp , Right , 24
       Cmd(2) = Tmp
    
       Tmp = Sector And &H00FF0000
       Shift Tmp , Right , 16
       Cmd(3) = Tmp
    
       Tmp = Sector And &H0000FF00
       Shift Tmp , Right , 8
       Cmd(4) = Tmp
    
    Anfang3:
       Reset Mcs
    
       For A = 1 To 6
          Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> 0 Then
          Goto Anfang3
       End If
       Print "read-modus " ; Din
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> &HFE Then
          Goto Ende
       End If
    
       For A = 2 To 515
          Shiftin Miso , Sck , Buffer(a) , 1 , 8 , 0
       Next
    
    Ende:
       Set Mcs
    End Sub
    
    Sub Mc_write()
    
       Set Mcs
    
       Cmd(1) = &H58
       Cmd(2) = 0
       Cmd(3) = 0
       Cmd(4) = 0
       Cmd(5) = 0
       Cmd(6) = &HFF
    
       Shift Sector , Left , 9
    
       Tmp = Sector And &HFF000000
       Shift Tmp , Right , 24
       Cmd(2) = Tmp
    
       Tmp = Sector And &H00FF0000
       Shift Tmp , Right , 16
       Cmd(3) = Tmp
    
       Tmp = Sector And &H0000FF00
       Shift Tmp , Right , 8
       Cmd(4) = Tmp
    
    Anfang2:
       Reset Mcs
    
       For A = 1 To 6
          Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Shiftin Miso , Sck , Din , 1 , 8 , 0
       If Din <> 0 Then
          Goto Anfang2
       End If
       Print "write-modus " ; Din
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       For A = 1 To 515
          Shiftout Mosi , Sck , Buffer(a) , 1 , 8 , 0
          Waitus 10
       Next
    
       Dout = &HFF
       Shiftout Mosi , Sck , Dout , 1 , 8 , 0
    
       Set Mcs
    End Sub

Berechtigungen

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