Hallo, ich habe mit der beiliegenden Schaltung an einem M324P eine SD-Card angeschlossen. Die Ansteuerung erfolgt mit dem Code von Ulrich Radig in der neuesten Version 2_7.
1 | //############################################################################
|
2 | //Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE)
|
3 | unsigned char mmc_init () |
4 | //############################################################################
|
5 | {
|
6 | unsigned int Timeout = 0; |
7 | |
8 | //Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde
|
9 | MMC_Direction_REG &=~(1<<SPI_DI); //Setzen von Pin MMC_DI auf Input |
10 | MMC_Direction_REG |= (1<<SPI_Clock); //Setzen von Pin MMC_Clock auf Output |
11 | MMC_Direction_REG |= (1<<SPI_DO); //Setzen von Pin MMC_DO auf Output |
12 | MMC_Direction_REG |= (1<<MMC_Chip_Select); //Setzen von Pin MMC_Chip_Select auf Output |
13 | MMC_Direction_REG |= (1<<SPI_SS); |
14 | MMC_Write |= (1<<MMC_Chip_Select); //Setzt den Pin MMC_Chip_Select auf High Pegel |
15 | |
16 | for(unsigned char a=0;a<200;a++){ |
17 | nop(); |
18 | }; //Wartet eine kurze Zeit |
19 | |
20 | #if SPI_Mode
|
21 | //Aktiviren des SPI - Bus, Clock = Idel LOW
|
22 | //SPI Clock teilen durch 128
|
23 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1); //Enable SPI, SPI in Master Mode |
24 | SPSR = (0<<SPI2X); |
25 | #endif
|
26 | uart_puts("init 1"); |
27 | //Initialisiere MMC/SD-Karte in den SPI-Mode
|
28 | for (unsigned char b = 0;b<0x0f;b++) //Sendet min 74+ Clocks an die MMC/SD-Karte |
29 | {
|
30 | mmc_write_byte(0xff); |
31 | }
|
32 | |
33 | //Sendet Commando CMD0 an MMC/SD-Karte
|
34 | unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95}; |
35 | while(mmc_write_command (CMD) !=1) |
36 | {
|
37 | if (Timeout++ > 200) |
38 | {
|
39 | MMC_Disable(); |
40 | uart_puts("Abbruch bei Commando1 (Return Code1)"); |
41 | return(1); //Abbruch bei Commando1 (Return Code1) |
42 | }
|
43 | }
|
44 | uart_puts("init 2"); |
Ich benutze Software_SPI, die PIN-Belegung habe ich entsprechend eingetragen. Das Programm findet die Karte nicht und zeigt mir kein "init2". Eine Überprüfung des CS-Signals nach "MMC_Write |= (1<<MMC_Chip_Select);" brachte nur 1,6V, ist das nicht etwas wenig ? Pete