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 ?
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.
warum sind die pausen im takt wenn ich lesen will, obwohl ich die ganze
zeit bis ich was bekommen oxff sende ?
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...
ne des hat nix mit FreeRTOS zu tun, war ein anderes Problem
David Lucinkiewicz schrieb:
> ne des hat nix mit FreeRTOS zu tun, war ein anderes Problem
Doch des Bier...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|