SD-Karte mit Levelshifter Problem

#1228461
Lesenswert?

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.
Angehängte Dateien:
#1234576
Lesenswert?

Pete K. wrote:
> Habe jetzt den TXB gegen einen TXS ausgetauscht. Hat aber leider nicht
> geholfen.
>
> Werd' noch mal den 10K pullup an DO gegen einen 330k tauschen (hab
> keinen kleneren hier)
>
> Muss wohl woanders der Wurm drin sein ...

So, jetzt sind parallel zwei 330k (165k) an DO als Pullup, leider keine 
Veränderung.
#1243859
Lesenswert?

Ein Aufbau mit Widerständen als Spannungsteiler funktioniert wunderbar. 
Die nächste Platine wird also ohne TXS0104 Levelschifter gebaut.

Schon mal gut zu wissen, dass es nicht an der Software liegt.

Falls doch noch jemand einen Tipp hat, wie man den TXS0104 zur Mitarbeit 
bewegen kann, bitte melden ...
Gast #2725289
Lesenswert?

Pete K. schrieb:
> Ein Aufbau mit Widerständen als Spannungsteiler funktioniert wunderbar.
> Die nächste Platine wird also ohne TXS0104 Levelschifter gebaut.
>
> Schon mal gut zu wissen, dass es nicht an der Software liegt.
>
> Falls doch noch jemand einen Tipp hat, wie man den TXS0104 zur Mitarbeit
> bewegen kann, bitte melden ...

Es funktioniert, wenn man an den DO-Pin der SD-Karte einen Pullup 
Widerstand einsetzt, der einen Stromfluss von mindestens 2mA (1k5) 
zulässt.

Datenblatt:
"Input Driver Requirements
Typical IIN vs VIN characteristics of the TXB0104 are shown in Figure 2. 
For proper operation, the device driving
the data I/Os of the TXB0104 must have drive strength of at least ±2 
mA."

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