www.mikrocontroller.net

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


Autor: David Lucinkiewicz (davidl)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
#include "xparameters.h"
#include "xstatus.h"
#include "xspi_ported.h"
#include "xspi_l_ported.h"

static XSpi SPI_1;
XSpi *InstancePtr;

u8 INIT[] = {0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF};
u8 CMD0[] = {0x40, 0x00, 0x00, 0x00, 0x00, 0x95}; 
u8 CMD1[] = {0x41, 0x00, 0x00, 0x00, 0x00, 0x01}; 
u8 ACMD41[] = {0x69, 0x00, 0x00, 0x00, 0x00, 0x01}; 
u8 CMD55[] = {0x77, 0x00, 0x00, 0x00, 0x00, 0x01}; 


// wurde aus dem original XSpi_Transfer rausgenommen und wird hier gemacht
void ss_init(void)
{
  XIo_Out32((SPI_1.BaseAddr) + XSP_SSR_OFFSET, (SPI_1.SlaveSelectMask)); // SlaveSelect auf High
  //sendet 8 Clock Impulse
  XSpi_Transfer (&SPI_1,FF,NULL, 1);
  XIo_Out32((SPI_1.BaseAddr) + XSP_SSR_OFFSET, (SPI_1.SlaveSelectReg)); //SlaveSelect auf LOW
  
}



char sd_transfer2(char *befehl, int anzahl, u8 erwarte)
{
  u8 RecvBuf2[]={0x00, 0x00,0x00, 0x00,0x00, 0x00};
  int Timeout = 0;
  int ende =0;
  int i;

  ss_init(); // Vor jedem Transfer des gleichen Befehls

  while ( ende == 0) //Solange nicht der erwartete Wert da ist
  {
     XSpi_Transfer  (&SPI_1,befehl,RecvBuf2, anzahl) ;
    for (i =0; i < 6; i++) 
    {
     if ( RecvBuf2[i] == erwarte) 
     {
      ende =1;
      break;
     }
  }
    
    if (Timeout++ > 200)

      {

      xil_printf("TimeOut\n");
      return 0xFF; //Abbruch keine Antwortet
        

      }
  }

  return RecvBuf2[i];
}


int main(void)
{
  int i;
  if (XST_SUCCESS != XSpi_Initialize (&SPI_1,XPAR_XPS_SPI_0_DEVICE_ID) )  
  {
  return XFALSE;
  }
  
  XSpi_mEnable (&SPI_1);
  
  XSpi_SetOptions (&SPI_1, XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION);
  
  // SPI_1 starten
  if (XST_SUCCESS != XSpi_Start ( &SPI_1 ) )  
  {
  print("\r\nFehler beim Starten von SPI.");
  }
  
  // Disable Global SPI INT
  XSpi_mIntrGlobalDisable(&SPI_1);


  if (XST_SUCCESS != XSpi_SetSlaveSelect(&SPI_1, 0x00000000))
  {
  print("\r\nFehler bei Slave Wahl.");
  }
  
  // 16 Dummy Bytes senden
  XSpi_Transfer (&SPI_1,INIT,NULL, 16);

  xil_printf("SD-Rueck: %x\n", sd_transfer2(CMD0, 6 , 0x01));
  xil_printf("SD-Rueck: %x\n", sd_transfer2(CMD1, 6 , 0x00));

  
  xil_printf("fertig\n");

return 1;
}

ucf:
## SD CARD on Port J20
NET "xps_spi_0_MISO_I_pin" LOC = "V14"| IOSTANDARD = LVCMOS33 ;
NET "xps_spi_0_SCK_O_pin" LOC = "V15"| IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
NET "xps_spi_0_SS_O_pin" LOC = "V16"| IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 4;
NET "xps_spi_0_MOSI_O_pin"LOC = "W16"| IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 4;

mhs:
 PORT xps_spi_0_MOSI_O_pin = xps_spi_0_MOSI_O, DIR = O
 PORT xps_spi_0_MISO_I_pin = xps_spi_0_MISO_I, DIR = I
 PORT xps_spi_0_SCK_O_pin = xps_spi_0_SCK_O, DIR = O
 PORT xps_spi_0_SS_O_pin = xps_spi_0_SS_O, DIR = O, VEC = [0:0]



Wer weiss RAT ?

Autor: David Lucinkiewicz (davidl)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: David Lucinkiewicz (davidl)
Datum:

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

Autor: Andy Müller (andz)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: David Lucinkiewicz (davidl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne des hat nix mit FreeRTOS zu tun, war ein anderes Problem

Autor: Andy Müller (andz)
Datum:

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

Doch des Bier...

Autor: Christian F. (christianf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woran lag es nun?

Gruss

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.