Hallo,
ich versuche seit einer Weile eine SD-Karte über das Interface vom SAM3
anzusteuern, allerdings erfolglos, denn das Interface gibt keinen Mucks
von sich und so langsam hab ich auch keine Idee mehr, was ich falsch
mache. Ich habe mir einen kleinen Adapter gebaut um die Pins PA26 bis
PA31 mit einem SD-Slot zu verbinden, da der auf der Platine vorhandene
nur mit dem SPI verdrahtet ist. Ich geh davon aus, dass ich die paar
Pins richtig verbunde habe und selbst wenn nicht, müsste ja zumindest
ein Clock zu sehen sein.
Initialisiert wird das HSMCI mit der Funktion InitSDCard. In der Main
wird dann die while-Schleife aufgerufen, die eigentlich dafür sorgen
sollte, dass die Karte 74 Takte Clock bekommt.
Das Beispiel hier macht das gleiche.
http://www.at91.com/forum/viewtopic.php/f,24/t,20831/
1 | void InitSDCard(void){
|
2 |
|
3 | PIOA->PIO_PUDR = HSMCIpins; // Pullups aktivieren
|
4 | PIOA->PIO_PDR = HSMCIpins; // Pins im PIO deaktivieren
|
5 | PIOA->PIO_ABCDSR[1] &= ~HSMCIpins; // Pins Peripherie C zuweisen
|
6 | PIOA->PIO_ABCDSR[2] |= HSMCIpins; // Pins Peripherie C zuweisen
|
7 |
|
8 | PMC->PMC_PCER0 = PMC_PCER0_PID18; // Clock zuweisen
|
9 |
|
10 | HSMCI->HSMCI_CR = HSMCI_CR_SWRST; // Software Reset
|
11 |
|
12 | HSMCI->HSMCI_CR = HSMCI_CR_MCIEN; // Interface aktivieren
|
13 |
|
14 | HSMCI->HSMCI_MR = HSMCI_MR_CLKDIV(79)| // HSMCI-Clock = MCK/(2*(CLKDIV+1)) = 400kHz
|
15 | HSMCI_MR_PWSDIV(10); // HSMCI-PowerSave-Clock = MCK/(2^CLKDIV+1) = 62,5kHz
|
16 | //HSMCI_MR_RDPROOF| // Read Proof aktiviert, Clock kann waehrend des Lesens deaktiviert werden, wenn der Fifo voll ist
|
17 | //HSMCI_MR_WRPROOF| // Write Proof aktiviert, Clock kann waehrend des Schreibens deaktiviert werden, wenn der Fifo voll ist
|
18 | //HSMCI_MR_FBYTE| // Force Byte Transfer, Blocklänge muss nicht Modulo 4 haben
|
19 | //HSMCI_MR_PDCMODE; // PDC-oriented Mode
|
20 |
|
21 | HSMCI->HSMCI_BLKR = HSMCI_BLKR_BCNT(512); // Blocklänge, kann auch über Register HSMCI_MR konfiguriert werden
|
22 |
|
23 | HSMCI->HSMCI_CFG = HSMCI_CFG_FIFOMODE| // Fifo Mode
|
24 | HSMCI_CFG_FERRCTRL; // Error Flag bei Over/Underrun
|
25 |
|
26 | HSMCI->HSMCI_SDCR = HSMCI_SDCR_SDCBUS_1| // 1 Bis Bus
|
27 | HSMCI_SDCR_SDCSEL_SLOTA; // Slot A
|
28 |
|
29 | HSMCI->HSMCI_DTOR = HSMCI_DTOR_DTOMUL_1048576| // Data Timeout Multiplikator
|
30 | HSMCI_DTOR_DTOCYC(2); // Data Timeout Anzahl Zyklen
|
31 |
|
32 | HSMCI->HSMCI_CSTOR =HSMCI_CSTOR_CSTOMUL_1048576|// Data Timeout Multiplikator
|
33 | HSMCI_CSTOR_CSTOCYC(2); // Data Timeout Anzahl Zyklen
|
34 |
|
35 | }
|
36 |
|
37 |
|
38 | while (1){
|
39 |
|
40 | HSMCI->HSMCI_ARGR = 0; // Argument egal
|
41 | HSMCI->HSMCI_CMDR = HSMCI_CMDR_SPCMD_INIT; // Init Command, 74 Takte Clock
|
42 | while (!(HSMCI->HSMCI_SR & HSMCI_SR_CMDRDY)); // Warten bis fertig
|
43 |
|
44 | }
|
Vielleicht sieht ja jemand was ich verkehrt mache. Schon mal danke für
eure Mithilfe.