logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATMega32 - [C] [SD-MMC] Nieprawidłowa kolejność bitów w odpowiedzi SPI z karty

Doktor_No 02 Lip 2015 13:32 1014 6
  • #1 14819169
    Doktor_No
    Poziom 12  
    Witam. Postanowiłem napisać aplikacje do odczytu i zapisu danych z karty SD na AVR. Kupiłem czytnik kart SD "LC Studio", konwerter poziomów CMOS 4050 i złożyłem odpowiedni układ na ATMega32.

    Korzystałem z następujących poradników i tutoriali:

    http://www.rocketnumbernine.com/2009/04/26/using-spi-on-an-avr-1
    https://www.elektroda.pl/rtvforum/topic2185328.html#10371260
    http://elm-chan.org/docs/mmc/mmc_e.html
    http://codeandlife.com/2012/04/25/simple-fat-and-sd-tutorial-part-3/
    http://www.instructables.com/id/Arduino-DIY-SD-Card-Logging-Shield/?ALLSTEPS

    I mam problem. Przy wysyłaniu podstawowej komendy CMD0 (0x40 0x00 0x00 0x00 0x00 0x95) otrzymuje odpowiedź z karty, heksadecymalne 0x80, czyli 0x01 w odwróconej kolejności bitów!

    Nie rozumiem tego, bo rejestr SPCR mam ustawiony tak, że mam: CPOL=0, CPHA=0 i DORD = 0.

    W załączniku zrzut z Saleae Logic.
  • #2 14819333
    excray
    Poziom 41  
    Mógłbyś pokazać kod?
  • #3 14819361
    Doktor_No
    Poziom 12  
    excray napisał:
    Mógłbyś pokazać kod?


    Mój procek jest taktowany 4MHz z wewnętrznego oscylatora RC.

    Korzystam z tej biblioteki SPI:

    https://code.google.com/p/rocketnumbernine/source/browse/trunk/AVR/spi/spi.c

    Inicjalizacja SPI:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wysyłanie komendy COM0 (cała obsługa karty jest zakapsułkowana w klasie SDCard):

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oprócz tego jest kupa kodu związanego z UART i RTC, nie będę tego wklejał, bo to nie ma związku z problemem.
  • #4 14819577
    excray
    Poziom 41  
    Generalnie ciężko się do czegokolwiek przyczepić. Może spróbuj z inną kartą. Może zwiększ opóźnienie między załączeniem zasilania a próbą inicjalizacji karty. Może dołóż kondensator na zasilaniu przy samej karcie.
  • #5 14819634
    Doktor_No
    Poziom 12  
    excray napisał:
    Generalnie ciężko się do czegokolwiek przyczepić. Może spróbuj z inną kartą. Może zwiększ opóźnienie między załączeniem zasilania a próbą inicjalizacji karty. Może dołóż kondensator na zasilaniu przy samej karcie.


    Używam karty MicroSD z adapterem, taką, jaka była dostarczana kilka lat temu w z telefonami Nokii. Próbowałem z drugą identyczną kartą i to samo. Inna karta 2GB SanDisk nie działa w ogóle.

    Analizator Saleae mam podpięty po stronie wyjść drivera 4050. Sam driver jest zasilany z zasilacza laboratoryjnego nastawionego na 3,3V (czytnik karty też). Kondensatory filtrujące są przy scalaku i w samym czytniku (schematy są tutaj: http://www.instructables.com/id/Arduino-DIY-SD-Card-Logging-Shield/?ALLSTEPS).

    Zamieniłem oscylator na kwarc, i dalej to samo.

    Jest to o tyle dziwne, ze puki co nigdzie nie znalazłem żeby karty SD zwracały dane po SPI młodszym bitem jako pierwsze! Może po prostu zignorować to, i "przewracać" sobie bity?

    Dodano po 3 [godziny] 48 [minuty]:

    UPDATE:

    Próbowałem zmniejszyć preskaler dla SPI i dalej to samo. :(

    Karta reaguje w identyczny sposób na dowolną inną komendę; próbowałem wysłać ACMD41 i dalej otrzymywałem 0x80...
  • #6 14820826
    excray
    Poziom 41  
    Wydaje mi się że problem znajduje się gdzieś w połączeniach. Nie wiem co znaczy "po stronie wyjść drivera" ale spróbuj podpiąć analizator bezpośrednio do pinów karty. Może sam translator coś tutaj miesza.
  • #7 14821067
    Doktor_No
    Poziom 12  
    excray napisał:
    Wydaje mi się że problem znajduje się gdzieś w połączeniach. Nie wiem co znaczy "po stronie wyjść drivera" ale spróbuj podpiąć analizator bezpośrednio do pinów karty. Może sam translator coś tutaj miesza.


    Analizator mam podpięty bezpośrednio do czytnika (wewnątrz którego są jeszcze rezystory pull-up, odsyłam do linków w pierwszym poście).

    Próbowałem też z kartą Micro SD Nokia 2GB. To samo.

    Dodam, że driver 4050 jest stosowany w czytniku Adafruit, więc raczej nie przekłamuje transmisji sam z siebie:
    https://www.adafruit.com/products/254&zenid=8086e42adca8e2925fe8001a7cefb9c9

    Być może problem jest po stronie połączeń, może przewody są za długie? Sprawdzę to, i dam znać.

    Dodano po 2 [godziny] 16 [minuty]:

    Skróciłem przewody, i dalej mam to samo. :(

    Dodano po 1 [godziny] 25 [minuty]:

    Udało się! Mam prawidłową odpowiedź z karty!

    Problemem okazała się biblioteka SPI, którą używałem, mianowicie ustawiało ona nieprawidłowo flagę polaryzacji zegara i preskaler częstotliwości, "na partyzanta" konieczne okazało się skorygowanie rejestrów:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W związku z tym kolejna nauczka: nigdy bezkrytycznie nie ufamy cudzemu kodowi!

    Dodano po 56 [minuty]:

    Zamykam temat. Udało mi się poprawnie nawiązać komunikacje z kartą i pobrać dane. Dziękuje wszystkim za uwagę.
REKLAMA