SD-Karte mit Levelshifter Problem

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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.