Forum: Mikrocontroller und Digitale Elektronik SD Karte Spartan 3A XPS_SPI Modul


von David L. (davidl)


Angehängte Dateien:

Lesenswert?

9Hallo

Ich weiss es gibt unmengen Beiträge zu SD Karten initialisierung, aber 
die haben mir bis jetzt nicht weitergeholfen.

Ich hab ein Spartan 3a Board, dort hab ich ein SD Kartenadapter 
rangehängt. brauch keine zus. Board geht ja auch mit 3,3 V.

Problem ist dass ich die Karte initialisieren kann, Sie antwortet mit 
0x01, weiter aber auf CMD1 reagiert Sie nicht. (Hab mehrere Karten 
probiert)
Ich benutze die dicke Karte, mit der CMD55 ACMD41 Kombination hauts auch 
nicht hin.

Das ist ein wenig kompliziert jetzt:
Das XPS_SPI Modul ist in den Manual Slave Select Modus geschalten. Das 
heisst nach jedem Transfer muss ich CS selber kurz auf High und dann auf 
LOW ziehen. Jetzt macht das aber die Transfer Funktion selber, und zwar 
nach jedem abgesendeten array an Daten, das will ich aber nicht, denn 
z.B. CMD0 oder CMD1 muss ich ja mehrmals senden und nur zwischen diesen 
Beiden soll das CS auf high dann auf low.
Schließlich hab ich das aus dem Original Transfer Befehl 
rausgeschmissen.

Jetzt der Code:
1
#include "xparameters.h"
2
#include "xstatus.h"
3
#include "xspi_ported.h"
4
#include "xspi_l_ported.h"
5
6
static XSpi SPI_1;
7
XSpi *InstancePtr;
8
9
u8 INIT[] = {0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF};
10
u8 CMD0[] = {0x40, 0x00, 0x00, 0x00, 0x00, 0x95}; 
11
u8 CMD1[] = {0x41, 0x00, 0x00, 0x00, 0x00, 0x01}; 
12
u8 ACMD41[] = {0x69, 0x00, 0x00, 0x00, 0x00, 0x01}; 
13
u8 CMD55[] = {0x77, 0x00, 0x00, 0x00, 0x00, 0x01}; 
14
15
16
// wurde aus dem original XSpi_Transfer rausgenommen und wird hier gemacht
17
void ss_init(void)
18
{
19
  XIo_Out32((SPI_1.BaseAddr) + XSP_SSR_OFFSET, (SPI_1.SlaveSelectMask)); // SlaveSelect auf High
20
  //sendet 8 Clock Impulse
21
  XSpi_Transfer (&SPI_1,FF,NULL, 1);
22
  XIo_Out32((SPI_1.BaseAddr) + XSP_SSR_OFFSET, (SPI_1.SlaveSelectReg)); //SlaveSelect auf LOW
23
  
24
}
25
26
27
28
char sd_transfer2(char *befehl, int anzahl, u8 erwarte)
29
{
30
  u8 RecvBuf2[]={0x00, 0x00,0x00, 0x00,0x00, 0x00};
31
  int Timeout = 0;
32
  int ende =0;
33
  int i;
34
35
  ss_init(); // Vor jedem Transfer des gleichen Befehls
36
37
  while ( ende == 0) //Solange nicht der erwartete Wert da ist
38
  {
39
     XSpi_Transfer  (&SPI_1,befehl,RecvBuf2, anzahl) ;
40
    for (i =0; i < 6; i++) 
41
    {
42
     if ( RecvBuf2[i] == erwarte) 
43
     {
44
      ende =1;
45
      break;
46
     }
47
  }
48
    
49
    if (Timeout++ > 200)
50
51
      {
52
53
      xil_printf("TimeOut\n");
54
      return 0xFF; //Abbruch keine Antwortet
55
        
56
57
      }
58
  }
59
60
  return RecvBuf2[i];
61
}
62
63
64
int main(void)
65
{
66
  int i;
67
  if (XST_SUCCESS != XSpi_Initialize (&SPI_1,XPAR_XPS_SPI_0_DEVICE_ID) )  
68
  {
69
  return XFALSE;
70
  }
71
  
72
  XSpi_mEnable (&SPI_1);
73
  
74
  XSpi_SetOptions (&SPI_1, XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION);
75
  
76
  // SPI_1 starten
77
  if (XST_SUCCESS != XSpi_Start ( &SPI_1 ) )  
78
  {
79
  print("\r\nFehler beim Starten von SPI.");
80
  }
81
  
82
  // Disable Global SPI INT
83
  XSpi_mIntrGlobalDisable(&SPI_1);
84
85
86
  if (XST_SUCCESS != XSpi_SetSlaveSelect(&SPI_1, 0x00000000))
87
  {
88
  print("\r\nFehler bei Slave Wahl.");
89
  }
90
  
91
  // 16 Dummy Bytes senden
92
  XSpi_Transfer (&SPI_1,INIT,NULL, 16);
93
94
  xil_printf("SD-Rueck: %x\n", sd_transfer2(CMD0, 6 , 0x01));
95
  xil_printf("SD-Rueck: %x\n", sd_transfer2(CMD1, 6 , 0x00));
96
97
  
98
  xil_printf("fertig\n");
99
100
return 1;
101
}
102
103
ucf:
104
## SD CARD on Port J20
105
NET "xps_spi_0_MISO_I_pin" LOC = "V14"| IOSTANDARD = LVCMOS33 ;
106
NET "xps_spi_0_SCK_O_pin" LOC = "V15"| IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
107
NET "xps_spi_0_SS_O_pin" LOC = "V16"| IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 4;
108
NET "xps_spi_0_MOSI_O_pin"LOC = "W16"| IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 4;
109
110
mhs:
111
 PORT xps_spi_0_MOSI_O_pin = xps_spi_0_MOSI_O, DIR = O
112
 PORT xps_spi_0_MISO_I_pin = xps_spi_0_MISO_I, DIR = I
113
 PORT xps_spi_0_SCK_O_pin = xps_spi_0_SCK_O, DIR = O
114
 PORT xps_spi_0_SS_O_pin = xps_spi_0_SS_O, DIR = O, VEC = [0:0]


Wer weiss RAT ?

von David L. (davidl)


Angehängte Dateien:

Lesenswert?

HEy leutz
,,

Kann sich mal jemand die Timing Analyse anschauen ??


Ich sende CMD0 {0x40, 0x00, 0x00, 0x00, 0x00, 0x95}
und dann  CMD1 {0x41, 0x00, 0x00, 0x00, 0x00, 0x01}

auf CMD0 bekomm ich eine korrekte antwort.

von David L. (davidl)


Lesenswert?

warum sind die pausen im takt wenn ich lesen will, obwohl ich die ganze 
zeit bis ich was bekommen oxff sende ?

von Andy M. (andz)


Lesenswert?

Des liegt daran weil im Labor kei Bier trunken hast ;)

Vlt. stimmt was ned mit deim RTOS...vlt springt des ausm Thread raus und 
dann kommt kei takt mehr...

von David L. (davidl)


Lesenswert?

ne des hat nix mit FreeRTOS zu tun, war ein anderes Problem

von Andy M. (andz)


Lesenswert?

David Lucinkiewicz schrieb:
> ne des hat nix mit FreeRTOS zu tun, war ein anderes Problem

Doch des Bier...

von Christian F. (christianf)


Lesenswert?

Woran lag es nun?

Gruss

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.