Forum: Mikrocontroller und Digitale Elektronik HSMCI mit Sam3s auf Olimex P256


von Sven B. (sven-b)


Lesenswert?

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.

von Sven B. (sven-b)


Lesenswert?

Immer diesen wirklich doofen Fehler.
1
PIOA->PIO_ABCDSR[0] &=  ~HSMCIpins;  // Pins Peripherie C zuweisen 
2
PIOA->PIO_ABCDSR[1] |=  HSMCIpins;  // Pins Peripherie C zuweisen

Damit gehts.

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.