Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

LPC1115 - FatFS - nie wykrywa karty

PeQ13 12 Aug 2013 12:06 3096 22
  • #1
    PeQ13
    Level 10  
    Witam, korzystając z tematu LPC1114 - Petit Fat/Fat Fs - konfiguracja SPI próbowałem uruchomić FatFS na LPC1115. Używałem tej biblioteki na avr, korzystając z przykładowych projektów, teraz spróbowałem na arm i utknąłem na etapie montowania karty. Tak wygląda mój plik mmc.c:

    Code: c
    Log in, to see the code


    Dokładnie rzecz biorąc, wykrzacza się w funkcji disk_initialization(), zwracając STA_NOINIT. Podejrzewam, że coś może być nie tak z funkcjami xmit_mmc i rcvr_mmc, ale nie umiem znaleźć w nich błędu, a sam próbowałem już tylu modyfikacji, że nie bardzo wiem czego jeszcze mogę spróbować. Prawdopodobnie błąd tkwi właśnie w tym pliku mmc.c, bo tam najwięcej "twórczej inwencji' wykazałem. Dla porządku jeszcze inicjalizacja SPI (wzięta z podanego tematu):

    Code: c
    Log in, to see the code


    Czy ktoś jest w stanie wskazać jakiś mniej lub bardziej oczywisty błąd w tym rozwiązaniu?
  • #2
    Freddie Chopin
    MCUs specialist
    Żródłem problemów jest - jak zwykle w tym przypadku - stworzenie DWÓCH osobnych funkcji do obsługi nadawania i odbierania po SPI. Jak zapewne wiesz, w SPI odbiór _i_ nadawanie są nierozłączne i odbywają się "jednocześnie" - nadanie bajtu powoduje jednocześnie odbiór. Dlatego też należy zrobić JEDNĄ funkcję, która jednocześnie nadaje i odbiera bajt. Jeśli chcesz jej użyć do nadania, a to co odebrała Cię nie interesuje, to po prostu ignorujesz zwracaną wartość. Jeśli chcesz jej użyć tylko do odbierania, to wysyłasz cokolwiek, np. 0xFF.

    uint8_t spiTransfer(uint8_t byte);

    uint8_t odebrane = spiTransfer(0xFF); // odbior
    spiTransfer(costam); // nadawanie

    W jednej z Twoich funkcji nie odczytujesz bufora, co powoduje rozjechanie wszystkich następnych transmisji.

    4\/3!!
  • #3
    BlueDraco
    MCUs specialist
    Oczywiste błędy w Twoim rozwiązaniu:
    - blok IOCON nie włączony w SYSAHBCLKCTRL
    - błędne wartości rejestrów IOCON - popatrz na bity zastrzeżone.
  • #5
    PeQ13
    Level 10  
    Freddie Chopin wrote:
    Żródłem problemów jest - jak zwykle w tym przypadku - stworzenie DWÓCH osobnych funkcji do obsługi nadawania i odbierania po SPI.
    (...)
    W jednej z Twoich funkcji nie odczytujesz bufora, co powoduje rozjechanie wszystkich następnych transmisji.


    >> Wiem, ale korzystałem z rozwiązań podawanych w przykładach. W sumie taka funkcja byłaby chyba najlepszym rozwiązaniem, ale zastanawiam się, czemu dwie funkcje różniące się wysyłaną i zwracaną wartością nie dają rady... Nie widzę też tego braku odczytu bufora, który psuje transmisję, ale to już może z przemęczenia...

    BlueDraco wrote:
    - blok IOCON nie włączony w SYSAHBCLKCTRL


    dołożyłem:

    Code: c
    Log in, to see the code


    ale wydaje mi się, że rzeczywiście domyślnie jest włączony, bo nigdy nie miałem z tym problemów...

    quote="BlueDraco"]- błędne wartości rejestrów IOCON[/quote]

    Aktualnie funkcja wygląda w ten sposób:
    Code: c
    Log in, to see the code


    I wydaje mi się, że dobrze IOCON ustawiłem...
  • #6
    Freddie Chopin
    MCUs specialist
    PeQ13 wrote:
    Wiem, ale korzystałem z rozwiązań podawanych w przykładach.

    W necie często są przykłady które nie działają...

    PeQ13 wrote:
    Nie widzę też tego braku odczytu bufora, który psuje transmisję, ale to już może z przemęczenia...

    Zobacz na xmit_mmc().

    Zrób jedną funkcję, będzie prościej wszystko poprawić, choćby dlatego że będzie jedno miejsce potencjalnych problemów mniej.

    4\/3!!
  • #7
    PeQ13
    Level 10  
    Dobrze, to na początek taka funkcja u mnie wyglądałaby tak:

    Code: c
    Log in, to see the code


    Drugi argument, żeby łatwiej było podmienić w kodzie, póki co nie mam dostępu do układu, ale plik mmc.c wyglądałby tak:

    Code: c
    Log in, to see the code
  • #9
    PeQ13
    Level 10  
    Przepraszam, oczywiście, że powinno być
    Code: c
    Log in, to see the code


    A zwracanie adresu wskaźnika jest też w przykładach do biblioteki, tym się sugerowałem...
  • #11
    Freddie Chopin
    MCUs specialist
    PeQ13 wrote:
    A zwracanie adresu wskaźnika jest też w przykładach do biblioteki, tym się sugerowałem...

    Ja nie mówię o zwracaniu... Ty WYSYŁASZ adres wskaźnika. Generalnie w tym kodzie jest tyle błędów, że nie wiadomo od czego zacząć...

    4\/3!!
  • #12
    PeQ13
    Level 10  
    No dobrze, to jeszcze raz na świeżo - inicjalizacja SPI taka jaką zamieściłem wcześniej chyba wygląda już dobrze, przynajmniej tak mi się wydaje. Teraz po kolei:
    poprawiona funkcja transferu (chyba) z funkcjami do odbiory i wysyłania:

    Code: c
    Log in, to see the code


    Wydaje mi się, że to już wygląda sensownie, ale zanim zacznę poprawiać resztę kodu chciałbym się upewnić, czy to w ogóle ma sens...
  • #13
    BlueDraco
    MCUs specialist
    W procedurze xmit_spi to ja nie widzę nic sensownego, a rcvr_spi można zapisać jako static inline albo makro o treści spi_Trans(0xff)
  • #14
    Freddie Chopin
    MCUs specialist
    Tak, to wygląda na sensowne, jednak nie wiem czemu upierasz się przy pozostawieniu tych dwóch funkcji xmit_ i rcvr_ - przecież one niczego tu nie wnoszą...

    P.S. na jaki dokładnie bit tutaj oczekujesz - LPC_SSP0->SR&0x10 ? Pytam bo teraz nie mam jak sprawdzić w dokumentacji.

    4\/3!!
  • #15
    PeQ13
    Level 10  
    LPC_SSP0->SR&0x10 - tu czekam na wyczyszczenie bitu BUSY

    Póki co upieram się przy tych funkcjach, bo nie wiem, czy poradzę sobie z takim pisaniem od podstaw, chcę poprawić jeden z przykładów, na których pracuje...

    To od razu to co dalej napisałem:

    Code: c
    Log in, to see the code


    Tu też chyba wszystko wygląda w porządku... Póki co przynajmniej, zaraz dojdę do bloków danych...
  • #16
    Freddie Chopin
    MCUs specialist
    Ten temat robi się nudny... Upierasz się, żeby koniecznie poprawić beznadziejny kod zamiast zrobić dobrze od początku albo użyć działającego kodu od michalko... Brniesz w tą ślepą uliczkę i już się zaczyna - powyżej w jednym miejscu używasz rcvr_spi(), a w drugim rvcr_mmc() - i teraz tylko czekać ile jeszcze takich "mało widocznych detali" tam masz pozostawiane... Bo zakładam, że jedna z tych funkcji jest "nowa" (i poprawna), a druga jest niewiadomo czym, bo stara funkcja o tej nazwie wymagała dwóch parametrów... Jest kilka dosyć obscenicznych przysłów na temat prób poprawiania czegoś kiepskiego, np kiepskiego kodu...

    michalko podesłał Ci linki do działającego kodu. Chcesz to uruchomić to weź jego kod. Chcesz koniecznie siłować się z jakimś lewym przykładem - walcz dalej, ale nie wiem jak długo forumowiczom będzie się chciało poprawiać te bzdury jakie tam są, zwłaszcza że - bez obrazy - wydajesz się być początkującym zarówno w ARM, w FatFS jak i w programowaniu w C...

    4\/3!!
  • #17
    PeQ13
    Level 10  
    Z ostatnim zdaniem nie będę się kłócił, bo raczej nie mam argumentów... Parę rzeczy zrobiłem, większość z nich działała, także chyba tragedii nie ma... Niemniej dziękuję za wszelką pomoc, postaram się nie nadużyć cierpliwości, chociaż chyba mnie to zaczyna przerastać...

    Ale wracając do tematu - dlatego tak bardzo trzymam się tego przykładu, ponieważ dalej mam funkcje, których sam bym nie napisał, a które wykorzystując właśnie te nieszczęsne rcvr_ i xmit_. Tematy które podesłał michalko czytałem, teraz jeszcze "wpadłem" na jeszcze jeden "pomysł":

    Code: c
    Log in, to see the code

    A funkcje xmit_ i rcvr_ zrobił takie:
    Code: c
    Log in, to see the code


    Jak takie coś wygląda?
  • #18
    Freddie Chopin
    MCUs specialist
    Definitywnie dziwnie wygląda to 4 w rcvr_mmc(), a i sama funkcja wydaje się być nad wyraz dziwna, bo po co ona niby przyjmuje parametr data, skoro i tak go ignoruje... Ta pierwsza zaś przyjmuje parametrz przez wartość, a następnie próbuje go wysłać jako tablicę... Generalnie bezsensu, więc śmiem przypuszczać że nie zadziała... Demonizujesz problem moim zdaniem, wywal te stare funkcje odpowiedzialne za SPI, dorzuć swoje funkcje do wysyłania bloku i popraw te kilka miejsc w których funkcje te będą użyte. Robiąc taką "łataninę" prosisz się o problemy...

    4\/3!!
  • #19
    PeQ13
    Level 10  
    W porządku, w takim razie biorę się za porządne pisanie tego, jak już będę miał coś gotowe i sprawdzone co najmniej dwa razy, to wrzucę tutaj.
  • #20
    BlueDraco
    MCUs specialist
    Czegoś tu nie rozumiem. Razem z FatFS można ściągnąć gotowy, działający przykład na LPC17xx, ze wszystkimi potrzebnymi funkcjami obsługi SPI i dostępu do karty. Dlaczego go nie użyjesz, tylko próbujesz szyć coś z jakichś dziwnych łatek? Jeśli chodzi o SPI, to LPC11xx jest bardzo podobny do LPC17xx.
  • #22
    PeQ13
    Level 10  
    BlueDraco wrote:
    Czegoś tu nie rozumiem. Razem z FatFS można ściągnąć gotowy, działający przykład na LPC17xx, ze wszystkimi potrzebnymi funkcjami obsługi SPI i dostępu do karty. Dlaczego go nie użyjesz, tylko próbujesz szyć coś z jakichś dziwnych łatek? Jeśli chodzi o SPI, to LPC11xx jest bardzo podobny do LPC17xx.


    Próbowałem z niego korzystać, a konkretnie pracowałem na ichniejszym mmc_ssp.h, ale też bez sukcesów... Przerabianie całego projektu z kolei też nie wydaje się dobrą opcją...

    michalko12 wrote:
    Są też projekty na LPC11xx z FatFs


    Widziałem to, ale tam jest troszkę za dużo tego, żebym to ogarnął. Którąś z własnych wersji robiłem na przykładzie tych projektów, ale nadal nic...


    Aktualnie mmc.c wygląda tak:
    Code: c
    Log in, to see the code


    To jest robione na podstawie pliku z projektu lpc17xx

    Do tego dołożone jest z LPC11xx CodeBase

    Code: c
    Log in, to see the code


    Przy debugowaniu program utyka mi na tym fragmencie:

    Code: c
    Log in, to see the code
    zawiesza się na powyższej pętli...
  • #23
    PeQ13
    Level 10  
    Zacząłem od samego początku, bo nie mogę tego tak zostawić...

    Także po kolei - inicjalizacja SPI

    Code: c
    Log in, to see the code


    Czy wygląda to w porządku?