HSMCI mit Sam3s auf Olimex P256

OP #3227938
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.

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