Forum: Mikrocontroller und Digitale Elektronik SD-Karte mit Levelshifter Problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Pete K. (pete77)


Angehängte Dateien:

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.

von PJ (Gast)


Lesenswert?

Ich weiß nicht genau, was der Levelshifter macht, aber könnte es sein, 
dass ein Treiber (der für MISO) umgekehrt beschaltet werden muss?

von Pete K. (pete77)


Angehängte Dateien:

Lesenswert?

Der Levelshifter arbeitet bidirektional, insofern gehe ich davon aus, 
das das kein Problem darstellt.

Datenblatt siehe Anhang.

von PJ (Gast)


Lesenswert?

Hm, nach Anschauen des Datenblatts ist es das wohl nicht.

Oder vielleicht stört die LED beim Richtungs-Sensing, und die Karte wird 
somit nie aktiviert? Vielleicht klappt's ja, wenn man die mal abklemmt.

von Pete K. (pete77)


Lesenswert?

Die LED ist schon draußen :-)

von Pete K. (pete77)


Lesenswert?

Sind vielleicht 10K als Pullup an DO zu wenig ?

von Pete K. (pete77)


Lesenswert?

Hat jemand einen TXB0104 mit einer SD-Card am Laufen ? Wäre gut zu 
wissen, dass es überhaupt prinzipiell geht :-)

von Thomas H. (pcexperte) Benutzerseite


Lesenswert?

Könnte das hier das Problem sein ?

Zitat aus dem Datenblatt:

the TXB0104 should not be used in applications such as I2C, 1-Wire, or 
an MMC card
interface where an open-drain driver is connected on the bidirectional 
data I/O. For these applications, use a
device from the TI TXS01xx series of level translators.

von Pete K. (pete77)


Lesenswert?

Hmm, könnte sein. Wenn ich aber ehrlich bin, kann ich die Bedeutung des 
o.a. Satzes nicht so ganz nachvollziehen (leichte Wissenslücken :-).

Heisst das eventuell, dass die Ausgänge/Eingänge mit Pullups 
ausgestattet werden müssen ?

von Pete K. (pete77)


Lesenswert?

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 ...

von Pete K. (pete77)


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.

von Pete K. (pete77)


Lesenswert?

Jetzt geht ISP nicht mehr, wenn eine SD-Karte eingesteckt ist.

Da stört wohl der Pullup am DO.

Ohne SD Karte kann ich den ATMega flashen.

von Pete K. (pete77)


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 ...

von Mario (Gast)


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."

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
Noch kein Account? Hier anmelden.