SD Karte Spartan 3A XPS_SPI Modul

OP #1603479
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 ?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren