Hallo,
ich habe ein Problem mit meiner SD-Kartenansteuerung. Es wird keine
Karte erkannt (getestet mit mehreren Karten 16,32 und 64MB)
Verwendet wird die Lib von Roland Riegel in der aktuellen Version.
Hardware-Aufbau (siehe Bild im Anhang):
- ATMega 644P-20 mit 22,11 Mhz bei 5V
- Levelshifter TXB0104 (soll bis 20Mbps gehen)
- 3,3V Spannungsregler
- 100n und 47µF an der SD
- 10k Pullup gegen 3V3 an DO
In der Init-Funktion steigt er immer mit "keine Kartenresponse" aus.
1 | **
|
2 | * \ingroup sd_raw
|
3 | * Initializes memory card communication.
|
4 | *
|
5 | * \returns 0 on failure, 1 on success.
|
6 | */
|
7 | uint8_t sd_raw_init()
|
8 | {
|
9 | /* enable inputs for reading card status */
|
10 | //configure_pin_available();
|
11 | //configure_pin_locked();
|
12 |
|
13 | uart_puts("SD: in init\n");
|
14 |
|
15 | /* enable outputs for MOSI, SCK, SS, input for MISO */
|
16 | configure_pin_mosi();
|
17 | configure_pin_sck();
|
18 | configure_pin_ss();
|
19 | configure_pin_miso();
|
20 |
|
21 | unselect_card();
|
22 |
|
23 | /* initialize SPI with lowest frequency; max. 400kHz during identification mode of card */
|
24 | SPCR = (0 << SPIE) | /* SPI Interrupt Enable */
|
25 | (1 << SPE) | /* SPI Enable */
|
26 | (0 << DORD) | /* Data Order: MSB first */
|
27 | (1 << MSTR) | /* Master mode */
|
28 | (0 << CPOL) | /* Clock Polarity: SCK low when idle */
|
29 | (0 << CPHA) | /* Clock Phase: sample on rising SCK edge */
|
30 | (1 << SPR1) | /* Clock Frequency: f_OSC / 128 */
|
31 | (1 << SPR0);
|
32 | SPSR &= ~(1 << SPI2X); /* No doubled clock frequency */
|
33 |
|
34 | /* initialization procedure */
|
35 | sd_raw_card_type = 0;
|
36 |
|
37 | if(!sd_raw_available())
|
38 | return 0;
|
39 |
|
40 | uart_puts("SD: Karte verfügbar\n");
|
41 |
|
42 | /* card needs 74 cycles minimum to start up */
|
43 | for(uint8_t i = 0; i < 10; ++i)
|
44 | {
|
45 | /* wait 8 clock cycles */
|
46 | sd_raw_rec_byte();
|
47 | }
|
48 |
|
49 | /* address card */
|
50 | select_card();
|
51 |
|
52 | uart_puts("SD: nach select_card()\n");
|
53 | /* reset card */
|
54 | uint8_t response;
|
55 | for(uint16_t i = 0; ; ++i)
|
56 | {
|
57 | response = sd_raw_send_command(CMD_GO_IDLE_STATE, 0);
|
58 | if(response == (1 << R1_IDLE_STATE))
|
59 | break;
|
60 |
|
61 | if(i == 0x1ff)
|
62 | {
|
63 | unselect_card();
|
64 | uart_puts("SD: keine Kartenresponse\n");
|
65 | return 0;
|
66 | }
|
67 | }
|
68 | uart_puts("SD: nach reset_card()\n");
|
Was habe ich getestet:
- Spannungen 3V3 und 5V sind ok.
- Einzelne Ausgaben auf den Levelshifter werden auf die andere Seite
gegeben
- RS232, SHT11 und Luftdrucksensor funktionieren, ebenso ein an den
1-wire Bus angeschlossener DS18B20
- SD-Karte als erstes in main.c ansprechen (nach RS232 Init und I2C
Init, sollte also genug Startup-Time für die Karte vorhanden sein)
- ISP abgezogen
Leider habe ich kein Oszi, um die SPI Leitungen direkt anzuschauen.