mikrocontroller.net

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


Autor: Pete K. (pete77)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
**
 * \ingroup sd_raw
 * Initializes memory card communication.
 *
 * \returns 0 on failure, 1 on success.
 */
uint8_t sd_raw_init()
{
    /* enable inputs for reading card status */
    //configure_pin_available();
    //configure_pin_locked();

    uart_puts("SD: in init\n");
  
  /* enable outputs for MOSI, SCK, SS, input for MISO */
    configure_pin_mosi();
    configure_pin_sck();
    configure_pin_ss();
    configure_pin_miso();

    unselect_card();

    /* initialize SPI with lowest frequency; max. 400kHz during identification mode of card */
    SPCR = (0 << SPIE) | /* SPI Interrupt Enable */
           (1 << SPE)  | /* SPI Enable */
           (0 << DORD) | /* Data Order: MSB first */
           (1 << MSTR) | /* Master mode */
           (0 << CPOL) | /* Clock Polarity: SCK low when idle */
           (0 << CPHA) | /* Clock Phase: sample on rising SCK edge */
           (1 << SPR1) | /* Clock Frequency: f_OSC / 128 */
           (1 << SPR0);
    SPSR &= ~(1 << SPI2X); /* No doubled clock frequency */

    /* initialization procedure */
    sd_raw_card_type = 0;
    
    if(!sd_raw_available())
        return 0;

    uart_puts("SD: Karte verfügbar\n");
    
    /* card needs 74 cycles minimum to start up */
    for(uint8_t i = 0; i < 10; ++i)
    {
        /* wait 8 clock cycles */
        sd_raw_rec_byte();
    }

    /* address card */
    select_card();

    uart_puts("SD: nach select_card()\n");
    /* reset card */
    uint8_t response;
    for(uint16_t i = 0; ; ++i)
    {
        response = sd_raw_send_command(CMD_GO_IDLE_STATE, 0);
        if(response == (1 << R1_IDLE_STATE))
            break;

        if(i == 0x1ff)
        {
            unselect_card();
      uart_puts("SD: keine Kartenresponse\n");
            return 0;
        }
    }
  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.

Autor: PJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Pete K. (pete77)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der Levelshifter arbeitet bidirektional, insofern gehe ich davon aus, 
das das kein Problem darstellt.

Datenblatt siehe Anhang.

Autor: PJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LED ist schon draußen :-)

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind vielleicht 10K als Pullup an DO zu wenig ?

Autor: Pete K. (pete77)
Datum:

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

Autor: Thomas H. (pcexperte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.