Hallo NG,
ich versuche gerade die Initialisierung einer SD-Card in den SPI-Modus.
Leider hängt das Programm schon bei der Sequenz, wo man mit CS-High 10x
0xff an die Karte sendet. Leider kann ich keinen Fehler finden.
Vielleicht sieht ja von euch jemand auf Anhieb, woran es liegt.
Wahrscheinlich ist SPI noch nicht richtig aktiviert...
(Könnte mir vielleicht jemand gerade fürs Initialisieren von SPI ein
paar Tips geben? Bei RS232 kann ich einfach mein Hyperterminal befragen,
und sehe, ob die Ausgabe klappt oder nicht. Aber bei SPI habe ich keinen
Schimmer, wie ich ohne viel Aufwand die Funktion überprüfen kann.)
Vielen Dank für jeden Tip.
Peter
(Hier der Auszug von Main)
//
----------------------------------------------------------------------
// Pins fuer Kartenleser initialisieren
BL init_cp_wp
BL blink_yellow // *** BLINK 3
//
----------------------------------------------------------------------
// SPI fuer Kartenleser initialisieren
BL init_spi
BL blink_yellow // *** BLINK 4
//
----------------------------------------------------------------------
// Start SD-Card-Init
BL init_sdcard /* HIER HÄNGT ER DANN (in spi_send_byte) */
(Hier die Defs)
//
----------------------------------------------------------------------
// Basis- und Offsetadressen definieren
#define ASM_BASE 0x202000
#define PIO_BASE 0xFFFFF400
#define PIO_PER 0x00
#define PIO_PDR 0x04
#define PIO_OER 0x10
#define PIO_ODR 0x14
#define PIO_SODR 0x30
#define PIO_CODR 0x34
#define PIO_PDSR 0x3C
#define PIO_ODSR 0x38
#define PIO_PUDR 0x60
#define PIO_ASR 0x70
#define PIO_BSR 0x74
#define PIO_OWER 0xA0
#define SPI_BASE 0xFFFE0000
#define SPI_CR 0x00
#define SPI_MR 0x04
#define SPI_RDR 0x08
#define SPI_TDR 0x0C
#define SPI_SR 0x10
#define SPI_CSR0 0x30
#define SPI_PTCR 0x120
#define SPI_RDRF 0x1 << 0 // (SPI) Receive Data Register Full
#define SPI_TDRE 0x1 << 1 // (SPI) Transmit Data Register Empty
#define PMC_BASE 0xFFFFFC00
#define PMC_PCER 0x10
#define USART_BASE 0xFFFC0000
#define USART_US_CR 0x00
#define USART_US_MR 0x04
#define USART_US_CSR 0x14
#define USART_US_THR 0x1C
#define USART_US_BRGR 0x20
#define USART_US_TTGR 0x28
#define PDC_BASE 0xFFFC0100
#define PDC_PTCR 0x20
//
----------------------------------------------------------------------
// Hilfsdefinitionen
#define AT91C_PDC_RXTEN 0x1 << 0
#define AT91C_PDC_TXTEN 0x1 << 8
#define BIT0 0x00000001
#define BIT1 0x00000002
#define BIT2 0x00000004
#define BIT3 0x00000008
#define BIT4 0x00000010
#define BIT5 0x00000020
#define BIT6 0x00000040
#define BIT7 0x00000080
#define BIT8 0x00000100
#define BIT9 0x00000200
#define BIT10 0x00000400
#define BIT11 0x00000800
#define BIT12 0x00001000
#define BIT13 0x00002000
#define BIT14 0x00004000
#define BIT15 0x00008000
#define BIT16 0x00010000
#define BIT17 0x00020000
#define BIT18 0x00040000
#define BIT19 0x00080000
#define BIT20 0x00100000
#define BIT21 0x00200000
#define BIT22 0x00400000
#define BIT23 0x00800000
#define BIT24 0x01000000
#define BIT25 0x02000000
#define BIT26 0x04000000
#define BIT27 0x08000000
#define BIT28 0x10000000
#define BIT29 0x20000000
#define BIT30 0x40000000
#define BIT31 0x80000000
(Hier die SD-Card-Funktionen)
init_sdcard:
// verwendete Register auf Stack legen
PUSH {r0, r1, r14}
// Debug Ausgabe an RS232
LDR r7, =ASM_BASE + str_init_sdcard
RS232_STRING r7
RS232_NL // neue Zeile
// CS auf High
BL cs_high
// 10 x 0xff mit CS-High senden
LDR r0, =10
sd_loop1:
// Debug Ausgabe an RS232
LDR r7, =ASM_BASE + str_sdcard_loop
RS232_STRING r7
// 0xff ueber SPI senden
BL spi_send_byte
SUBS r0, r0, #1
BNE sd_loop1
// CS auf Low
BL cs_low
// urspruengliche Register vom Stack holen
POP {r0, r1, r14}
// Zurueck aus Subroutine
MOV pc, r14
//
----------------------------------------------------------------------
spi_send_byte:
// verwendete Register auf Stack legen
PUSH {r0, r1}
// Basisadresse setzen
LDR r0, =SPI_BASE
spi_send_byte_loop1
// warten, bis Daten gesendet wurden
LDR r1, [r0, #SPI_SR]
ANDS r1, r1, #SPI_TDRE
BEQ spi_send_byte_loop1
// Daten senden
LDR r1, =0xffff
STR r1, [r0, #SPI_TDR]
spi_send_byte_loop2
// warten, bis Daten gesendet wurden
LDR r1, [r0, #SPI_SR]
ANDS r1, r1, #SPI_RDRF
BEQ spi_send_byte_loop2
// Daten holen
LDR r1, [r0, #SPI_RDR]
// urspruengliche Register vom Stack holen
POP {r0, r1}
// Zurueck aus Subroutine
MOV pc, r14
//
----------------------------------------------------------------------
cs_high:
// verwendete Register auf Stack legen
PUSH {r0, r1}
// Basisadresse setzen
LDR r0, =PIO_BASE
// CS auf High
LDR r1, =100000000000b
STR r1, [r0, #PIO_SODR]
// urspruengliche Register vom Stack holen
POP {r0, r1}
// Zurueck aus Subroutine
MOV pc, r14
//
----------------------------------------------------------------------
cs_low:
// verwendete Register auf Stack legen
PUSH {r0, r1}
// Basisadresse setzen
LDR r0, =PIO_BASE
// CS auf High
LDR r1, =100000000000b
STR r1, [r0, #PIO_CODR]
// urspruengliche Register vom Stack holen
POP {r0, r1}
// Zurueck aus Subroutine
MOV pc, r14
//
----------------------------------------------------------------------
init_spi:
// verwendete Register auf Stack legen
PUSH {r0, r1}
// Basisadresse setzen
LDR r0, =PIO_BASE
// den entsprechenden PINS die Funktion zuweisen
LDR r1, =BIT11 | BIT12 | BIT13 | BIT14
STR r1, [r0, #PIO_PDR]
STR r1, [r0, #PIO_ASR]
LDR r1, =0
STR r1, [r0, #PIO_BSR]
// Basisadresse setzen
LDR r0, =PIO_BASE
// enable SPI-Clock (ID=5)
LDR r1, =1 << 5
STR r1, [r0, #PMC_PCER]
// Basisadresse setzen
LDR r0, =SPI_BASE
// SPI-MODE: fixed
LDR r1, =0x81; // SPI Enable, Software Reset
STR r1, [r0, #SPI_CR]
LDR r1, =0x01; // SPI Enable
STR r1, [r0, #SPI_CR]
LDR r1, =0xE0011; // Master Mode, Fixed Select
STR r1, [r0, #SPI_MR]
LDR r1, =0x4A02; // 8bit, CPOL: 0, ClockPhase: 1,
STR r1, [r0, #SPI_CSR0] // SCLK: 200kHz
// Basisadresse setzen
LDR r0, =PDC_BASE
LDR r1, =AT91C_PDC_TXTEN | AT91C_PDC_RXTEN
STR r1, [r0, #PDC_PTCR]
// Basisadresse setzen
LDR r0, =SPI_BASE
STR r1, [r0, #SPI_PTCR]
// urspruengliche Register vom Stack holen
POP {r0, r1}
// Zurueck aus Subroutine
MOV pc, r14
//
----------------------------------------------------------------------
init_cp_wp:
// verwendete Register auf Stack legen
PUSH {r0, r1}
// Basisadresse setzen
LDR r0, =PIO_BASE
// Pull-Up-Widerstaende ausschalten
LDR r1, =0xffffffff
STR r1, [r0, #PIO_PUDR]
// Karte-verfuegbar-Pin als Input
LDR r1, =BIT15
STR r1, [r0, #PIO_ODR]
STR r1, [r0, #PIO_PER]
// Karte-schreibgeschuetzt-Pin als Input
LDR r1, =BIT16
STR r1, [r0, #PIO_ODR]
STR r1, [r0, #PIO_PER]
// urspruengliche Register vom Stack holen
POP {r0, r1}
// Zurueck aus Subroutine
MOV pc, r14
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.