Forum: Mikrocontroller und Digitale Elektronik SPI Übertragungsgeschwindigkeit


von Christian (Gast)


Lesenswert?

Hallo,

ich habe in mein Projekt zwecks Datenzugriff auf SD-Karten die Klassen 
fat32 und sdcard implementiert. Das Projekt programmiere ich mit luna.

Dabei habe ich mich über eine etwas geringe Datenübertragungsrate 
gewundert. Nach einem Blick in die Init-Funktion der sdcard-Klasse 
entdeckte ich auch wieso und habe das auskommentierte Setzen der 
SPI-Geschwindigkeit auf Maximum hereingenommen.

Soweit so gut, Datenübertragung schnell. Jedoch kann man bei SPI ja mit 
"SpeedDouble" die Geschwindkeit weiter erhöhen. Kommentiere ich jedoch 
SpeedDouble ein, werden keine Daten mehr übertragen und das lesen der 
Verzeichnisse funktioniert auch nicht mehr. Wo kann da der Fehler 
liegen?

Auszug aus der sdcard-Klasse:
1
class sdcard
2
  
3
  dim cmd(5) as byte
4
  dim buf as memoryblock
5
  
6
  function init() as byte
7
    
8
    dim i,a as byte
9
    dim timeout as word
10
    
11
    buf.New(512)
12
    
13
    define SpiSckPin as portb.7  ' SCK
14
    define SpiMisoPin as portb.6 ' MISO
15
    define SpiMosiPin as portb.5 ' MOSI
16
    define SpiSsPin as portb.4   ' SS
17
    define SdCsPin as portb.3    ' CS (SD)
18
    
19
    SpiSckPin.mode = output         ' SCK
20
    SpiMisoPin.mode = input         ' MISO
21
    SpiMosiPin.mode = output        ' MOSI
22
    SpiSsPin.mode = output          ' SS
23
    SdCsPin.mode = output           ' CS (SD)
24
    
25
    sdDisable()
26
    
27
    spi.master
28
    spi.clock = 128
29
    spi.enable
30
    
31
    waitms 10
32
    for i=0 to 15
33
      spi.master.write &hff
34
    next
35
    
36
    'CMD0
37
    clr cmd()
38
    cmd(0)=&h40
39
    cmd(5)=&h95
40
    clr timeout
41
    while writeCmd()=&hff
42
      incr timeout
43
      if timeout>200 then
44
        sdDisable()
45
        return 0
46
      end if
47
    wend
48
    
49
    'CMD1
50
    cmd(0)=&h41
51
    cmd(5)=&hff
52
    clr timeout
53
    while writeCmd()<>0
54
      incr timeout
55
      if timeout>400 then
56
        sdDisable()
57
        return 0
58
      end if
59
    wend
60
    'SPI Bus auf max Geschwindigkeit
61
    spi.clock=4
62
    'spi.speeddouble   ' <<<<<<<<<<< Hier
63
    sdDisable()
64
    return 1
65
  endfunc


Gruß, Christian

von Uwe (Gast)


Lesenswert?

Wenn die Signale schön im Oszilloskop zu sehen sind und die 
Flankensteilheit nach Spec OK ist, dann bleibt nur das deine SD-Karte 
dieses Format nicht unterstützt. Es gibt eine Infostruktur in der 
SD-Karte in der die Features stehen. z.B. erlaubte Spannung, 
Stromaufnahme, Geschwindigkeit usw. diese können von Karte zu Karte 
unterschiedlich sein. Was sagt denn deine Karte ?

von Georg A. (georga)


Lesenswert?

Mal mit dem Oszi die Signale angeschaut? Wenn da ein 5V/3V 
Pegelkonverter drinnen ist, kann der durchaus timingrelevante 
Dreckeffekte produzieren. Hatte ich mit einem MOSFET (2N7002) als 
Passgate, da wurde von Fairchild auf NXP gewechselt und prompt ging es 
mit bestimmten Karten nicht mehr, weil der beim 0-1-Übergang zu früh 
hochohmig wurde und damit die Flanke zu flach.

von Christian (Gast)


Lesenswert?

Danke für eure Antworten.

Ich kann mit der Klasse den Infoblock auslesen, da kommt heraus:
1
  Manufacturer ID    = 2
2
  OEM/Application ID = TM
3
  Product Name       = SD01G
4
  Product Revision   = 128
5
  Serial Number      = 0x9F44A6B8

Das sagt mir jetzt natürlich wenig. Dem zweiten Hinweis bezüglich der 
Signale gehe ich mal parallel nach.

Gruß, Christian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.